1 /* tc-arm.c -- Assemble for the ARM
2 Copyright (C) 1994, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
3 Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
4 Modified by David Taylor (dtaylor@armltd.co.uk)
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
39 /* Types of processor to assemble for. */
40 #define ARM_1 0x00000001
41 #define ARM_2 0x00000002
42 #define ARM_3 0x00000004
44 #define ARM_6 0x00000008
45 #define ARM_7 ARM_6 /* same core instruction set */
46 #define ARM_8 ARM_6 /* same core instruction set */
47 #define ARM_9 ARM_6 /* same core instruction set */
48 #define ARM_CPU_MASK 0x0000000f
50 /* The following bitmasks control CPU extensions (ARM7 onwards): */
51 #define ARM_LONGMUL 0x00000010 /* allow long multiplies */
52 #define ARM_HALFWORD 0x00000020 /* allow half word loads */
53 #define ARM_THUMB 0x00000040 /* allow BX instruction */
54 #define ARM_EXT_V5 0x00000080 /* allow CLZ etc */
56 /* Architectures are the sum of the base and extensions */
57 #define ARM_ARCH_V4 (ARM_7 | ARM_LONGMUL | ARM_HALFWORD)
58 #define ARM_ARCH_V4T (ARM_ARCH_V4 | ARM_THUMB)
59 #define ARM_ARCH_V5 (ARM_ARCH_V4 | ARM_EXT_V5)
60 #define ARM_ARCH_V5T (ARM_ARCH_V5 | ARM_THUMB)
62 /* Some useful combinations: */
63 #define ARM_ANY 0x00ffffff
64 #define ARM_2UP (ARM_ANY - ARM_1)
65 #define ARM_ALL ARM_2UP /* Not arm1 only */
66 #define ARM_3UP 0x00fffffc
67 #define ARM_6UP 0x00fffff8 /* Includes ARM7 */
69 #define FPU_CORE 0x80000000
70 #define FPU_FPA10 0x40000000
71 #define FPU_FPA11 0x40000000
74 /* Some useful combinations */
75 #define FPU_ALL 0xff000000 /* Note this is ~ARM_ANY */
76 #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[] = "#";
119 CONST char line_separator_chars[] = ";";
121 CONST char line_separator_chars[] = "";
124 /* Chars that can be used to separate mant from exp in floating point nums */
125 CONST char EXP_CHARS[] = "eE";
127 /* Chars that mean this number is a floating point constant */
131 CONST char FLT_CHARS[] = "rRsSfFdDxXeEpP";
133 /* Prefix characters that indicate the start of an immediate
135 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
138 symbolS * GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
141 CONST int md_reloc_size = 8; /* Size of relocation record */
143 static int thumb_mode = 0; /* non-zero if assembling thumb instructions */
145 typedef struct arm_fix
153 unsigned long instruction;
158 bfd_reloc_code_real_type type;
168 CONST char * template;
172 static CONST struct asm_shift shift[] =
188 #define NO_SHIFT_RESTRICT 1
189 #define SHIFT_RESTRICT 0
191 #define NUM_FLOAT_VALS 8
193 CONST char * fp_const[] =
195 "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
198 /* Number of littlenums required to hold an extended precision number */
199 #define MAX_LITTLENUMS 6
201 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
211 #define CP_T_X 0x00008000
212 #define CP_T_Y 0x00400000
213 #define CP_T_Pre 0x01000000
214 #define CP_T_UD 0x00800000
215 #define CP_T_WB 0x00200000
217 #define CONDS_BIT (0x00100000)
218 #define LOAD_BIT (0x00100000)
219 #define TRANS_BIT (0x00200000)
223 CONST char * template;
227 /* This is to save a hash look-up in the common case */
228 #define COND_ALWAYS 0xe0000000
230 static CONST struct asm_cond conds[] =
234 {"cs", 0x20000000}, {"hs", 0x20000000},
235 {"cc", 0x30000000}, {"ul", 0x30000000}, {"lo", 0x30000000},
250 /* Warning: If the top bit of the set_bits is set, then the standard
251 instruction bitmask is ignored, and the new bitmask is taken from
255 CONST char * template; /* Basic flag string */
256 unsigned long set_bits; /* Bits to set */
259 static CONST struct asm_flg s_flag[] =
265 static CONST struct asm_flg ldr_flags[] =
269 {"bt", 0x00400000 | TRANS_BIT},
276 static CONST struct asm_flg str_flags[] =
280 {"bt", 0x00400000 | TRANS_BIT},
285 static CONST struct asm_flg byte_flag[] =
291 static CONST struct asm_flg cmp_flags[] =
298 static CONST struct asm_flg ldm_flags[] =
311 static CONST struct asm_flg stm_flags[] =
324 static CONST struct asm_flg lfm_flags[] =
331 static CONST struct asm_flg sfm_flags[] =
338 static CONST struct asm_flg round_flags[] =
346 /* The implementation of the FIX instruction is broken on some assemblers,
347 in that it accepts a precision specifier as well as a rounding specifier,
348 despite the fact that this is meaningless. To be more compatible, we
349 accept it as well, though of course it does not set any bits. */
350 static CONST struct asm_flg fix_flags[] =
367 static CONST struct asm_flg except_flag[] =
373 static CONST struct asm_flg cplong_flag[] =
381 CONST char * template;
382 unsigned long number;
385 #define PSR_FIELD_MASK 0x000f0000
387 #define PSR_FLAGS 0x00080000
388 #define PSR_CONTROL 0x00010000 /* Undocumented instruction, its use is discouraged by ARM */
389 #define PSR_ALL 0x00090000
398 static CONST struct asm_psr psrs[] =
402 {"cpsr_all", CPSR_ALL},
404 {"spsr_all", SPSR_ALL},
407 {"cpsr_flg", CPSR_FLG},
408 {"spsr_flg", SPSR_FLG},
411 {"cpsr_c", CPSR_CTL},
412 {"cpsr_ctl", CPSR_CTL},
413 {"spsr_c", SPSR_CTL},
414 {"spsr_ctl", SPSR_CTL}
417 /* Functions called by parser */
418 /* ARM instructions */
419 static void do_arit PARAMS ((char *, unsigned long));
420 static void do_cmp PARAMS ((char *, unsigned long));
421 static void do_mov PARAMS ((char *, unsigned long));
422 static void do_ldst PARAMS ((char *, unsigned long));
423 static void do_ldmstm PARAMS ((char *, unsigned long));
424 static void do_branch PARAMS ((char *, unsigned long));
425 static void do_swi PARAMS ((char *, unsigned long));
426 /* Pseudo Op codes */
427 static void do_adr PARAMS ((char *, unsigned long));
428 static void do_adrl PARAMS ((char *, unsigned long));
429 static void do_nop PARAMS ((char *, unsigned long));
431 static void do_mul PARAMS ((char *, unsigned long));
432 static void do_mla PARAMS ((char *, unsigned long));
434 static void do_swap PARAMS ((char *, unsigned long));
436 static void do_msr PARAMS ((char *, unsigned long));
437 static void do_mrs PARAMS ((char *, unsigned long));
439 static void do_mull PARAMS ((char *, unsigned long));
441 static void do_bx PARAMS ((char *, unsigned long));
443 /* Coprocessor Instructions */
444 static void do_cdp PARAMS ((char *, unsigned long));
445 static void do_lstc PARAMS ((char *, unsigned long));
446 static void do_co_reg PARAMS ((char *, unsigned long));
447 static void do_fp_ctrl PARAMS ((char *, unsigned long));
448 static void do_fp_ldst PARAMS ((char *, unsigned long));
449 static void do_fp_ldmstm PARAMS ((char *, unsigned long));
450 static void do_fp_dyadic PARAMS ((char *, unsigned long));
451 static void do_fp_monadic PARAMS ((char *, unsigned long));
452 static void do_fp_cmp PARAMS ((char *, unsigned long));
453 static void do_fp_from_reg PARAMS ((char *, unsigned long));
454 static void do_fp_to_reg PARAMS ((char *, unsigned long));
456 static void fix_new_arm PARAMS ((fragS *, int, short, expressionS *, int, int));
457 static int arm_reg_parse PARAMS ((char **));
458 static int arm_psr_parse PARAMS ((char **));
459 static void symbol_locate PARAMS ((symbolS *, CONST char *, segT, valueT, fragS *));
460 static int add_to_lit_pool PARAMS ((void));
461 static unsigned validate_immediate PARAMS ((unsigned));
462 static unsigned validate_immediate_twopart PARAMS ((unsigned int, unsigned int *));
463 static int validate_offset_imm PARAMS ((unsigned int, int));
464 static void opcode_select PARAMS ((int));
465 static void end_of_line PARAMS ((char *));
466 static int reg_required_here PARAMS ((char **, int));
467 static int psr_required_here PARAMS ((char **, int, int));
468 static int co_proc_number PARAMS ((char **));
469 static int cp_opc_expr PARAMS ((char **, int, int));
470 static int cp_reg_required_here PARAMS ((char **, int));
471 static int fp_reg_required_here PARAMS ((char **, int));
472 static int cp_address_offset PARAMS ((char **));
473 static int cp_address_required_here PARAMS ((char **));
474 static int my_get_float_expression PARAMS ((char **));
475 static int skip_past_comma PARAMS ((char **));
476 static int walk_no_bignums PARAMS ((symbolS *));
477 static int negate_data_op PARAMS ((unsigned long *, unsigned long));
478 static int data_op2 PARAMS ((char **));
479 static int fp_op2 PARAMS ((char **));
480 static long reg_list PARAMS ((char **));
481 static void thumb_load_store PARAMS ((char *, int, int));
482 static int decode_shift PARAMS ((char **, int));
483 static int ldst_extend PARAMS ((char **, int));
484 static void thumb_add_sub PARAMS ((char *, int));
485 static void insert_reg PARAMS ((int));
486 static void thumb_shift PARAMS ((char *, int));
487 static void thumb_mov_compare PARAMS ((char *, int));
488 static void set_constant_flonums PARAMS ((void));
489 static valueT md_chars_to_number PARAMS ((char *, int));
490 static void insert_reg_alias PARAMS ((char *, int));
491 static void output_inst PARAMS ((void));
493 static bfd_reloc_code_real_type arm_parse_reloc PARAMS ((void));
496 /* ARM instructions take 4bytes in the object file, Thumb instructions
500 /* LONGEST_INST is the longest basic instruction name without conditions or
502 * ARM7M has 4 of length 5
505 #define LONGEST_INST 5
509 CONST char * template; /* Basic string to match */
510 unsigned long value; /* Basic instruction code */
511 CONST char * comp_suffix; /* Compulsory suffix that must follow conds */
512 CONST struct asm_flg * flags; /* Bits to toggle if flag 'n' set */
513 unsigned long variants; /* Which CPU variants this exists for */
514 /* Function to call to parse args */
515 void (* parms) PARAMS ((char *, unsigned long));
518 static CONST struct asm_opcode insns[] =
520 /* ARM Instructions */
521 {"and", 0x00000000, NULL, s_flag, ARM_ANY, do_arit},
522 {"eor", 0x00200000, NULL, s_flag, ARM_ANY, do_arit},
523 {"sub", 0x00400000, NULL, s_flag, ARM_ANY, do_arit},
524 {"rsb", 0x00600000, NULL, s_flag, ARM_ANY, do_arit},
525 {"add", 0x00800000, NULL, s_flag, ARM_ANY, do_arit},
526 {"adc", 0x00a00000, NULL, s_flag, ARM_ANY, do_arit},
527 {"sbc", 0x00c00000, NULL, s_flag, ARM_ANY, do_arit},
528 {"rsc", 0x00e00000, NULL, s_flag, ARM_ANY, do_arit},
529 {"orr", 0x01800000, NULL, s_flag, ARM_ANY, do_arit},
530 {"bic", 0x01c00000, NULL, s_flag, ARM_ANY, do_arit},
531 {"tst", 0x01000000, NULL, cmp_flags, ARM_ANY, do_cmp},
532 {"teq", 0x01200000, NULL, cmp_flags, ARM_ANY, do_cmp},
533 {"cmp", 0x01400000, NULL, cmp_flags, ARM_ANY, do_cmp},
534 {"cmn", 0x01600000, NULL, cmp_flags, ARM_ANY, do_cmp},
535 {"mov", 0x01a00000, NULL, s_flag, ARM_ANY, do_mov},
536 {"mvn", 0x01e00000, NULL, s_flag, ARM_ANY, do_mov},
537 {"str", 0x04000000, NULL, str_flags, ARM_ANY, do_ldst},
538 {"ldr", 0x04100000, NULL, ldr_flags, ARM_ANY, do_ldst},
539 {"stm", 0x08000000, NULL, stm_flags, ARM_ANY, do_ldmstm},
540 {"ldm", 0x08100000, NULL, ldm_flags, ARM_ANY, do_ldmstm},
541 {"swi", 0x0f000000, NULL, NULL, ARM_ANY, do_swi},
542 {"bl", 0x0bfffffe, NULL, NULL, ARM_ANY, do_branch},
543 {"b", 0x0afffffe, NULL, NULL, ARM_ANY, do_branch},
546 {"adr", 0x028f0000, NULL, NULL, ARM_ANY, do_adr},
547 {"adrl", 0x028f0000, NULL, NULL, ARM_ANY, do_adrl},
548 {"nop", 0x01a00000, NULL, NULL, ARM_ANY, do_nop},
550 /* ARM 2 multiplies */
551 {"mul", 0x00000090, NULL, s_flag, ARM_2UP, do_mul},
552 {"mla", 0x00200090, NULL, s_flag, ARM_2UP, do_mla},
554 /* ARM 3 - swp instructions */
555 {"swp", 0x01000090, NULL, byte_flag, ARM_3UP, do_swap},
557 /* ARM 6 Coprocessor instructions */
558 {"mrs", 0x010f0000, NULL, NULL, ARM_6UP, do_mrs},
559 {"msr", 0x0120f000, NULL, NULL, ARM_6UP, do_msr},
560 /* ScottB: our code uses 0x0128f000 for msr.
561 NickC: but this is wrong because the bits 16 and 19 are handled
562 by the PSR_xxx defines above. */
564 /* ARM 7M long multiplies - need signed/unsigned flags! */
565 {"smull", 0x00c00090, NULL, s_flag, ARM_LONGMUL, do_mull},
566 {"umull", 0x00800090, NULL, s_flag, ARM_LONGMUL, do_mull},
567 {"smlal", 0x00e00090, NULL, s_flag, ARM_LONGMUL, do_mull},
568 {"umlal", 0x00a00090, NULL, s_flag, ARM_LONGMUL, do_mull},
570 /* ARM THUMB interworking */
571 {"bx", 0x012fff10, NULL, NULL, ARM_THUMB, do_bx},
573 /* Floating point instructions */
574 {"wfs", 0x0e200110, NULL, NULL, FPU_ALL, do_fp_ctrl},
575 {"rfs", 0x0e300110, NULL, NULL, FPU_ALL, do_fp_ctrl},
576 {"wfc", 0x0e400110, NULL, NULL, FPU_ALL, do_fp_ctrl},
577 {"rfc", 0x0e500110, NULL, NULL, FPU_ALL, do_fp_ctrl},
578 {"ldf", 0x0c100100, "sdep", NULL, FPU_ALL, do_fp_ldst},
579 {"stf", 0x0c000100, "sdep", NULL, FPU_ALL, do_fp_ldst},
580 {"lfm", 0x0c100200, NULL, lfm_flags, FPU_MEMMULTI, do_fp_ldmstm},
581 {"sfm", 0x0c000200, NULL, sfm_flags, FPU_MEMMULTI, do_fp_ldmstm},
582 {"mvf", 0x0e008100, "sde", round_flags, FPU_ALL, do_fp_monadic},
583 {"mnf", 0x0e108100, "sde", round_flags, FPU_ALL, do_fp_monadic},
584 {"abs", 0x0e208100, "sde", round_flags, FPU_ALL, do_fp_monadic},
585 {"rnd", 0x0e308100, "sde", round_flags, FPU_ALL, do_fp_monadic},
586 {"sqt", 0x0e408100, "sde", round_flags, FPU_ALL, do_fp_monadic},
587 {"log", 0x0e508100, "sde", round_flags, FPU_ALL, do_fp_monadic},
588 {"lgn", 0x0e608100, "sde", round_flags, FPU_ALL, do_fp_monadic},
589 {"exp", 0x0e708100, "sde", round_flags, FPU_ALL, do_fp_monadic},
590 {"sin", 0x0e808100, "sde", round_flags, FPU_ALL, do_fp_monadic},
591 {"cos", 0x0e908100, "sde", round_flags, FPU_ALL, do_fp_monadic},
592 {"tan", 0x0ea08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
593 {"asn", 0x0eb08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
594 {"acs", 0x0ec08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
595 {"atn", 0x0ed08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
596 {"urd", 0x0ee08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
597 {"nrm", 0x0ef08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
598 {"adf", 0x0e000100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
599 {"suf", 0x0e200100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
600 {"rsf", 0x0e300100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
601 {"muf", 0x0e100100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
602 {"dvf", 0x0e400100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
603 {"rdf", 0x0e500100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
604 {"pow", 0x0e600100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
605 {"rpw", 0x0e700100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
606 {"rmf", 0x0e800100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
607 {"fml", 0x0e900100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
608 {"fdv", 0x0ea00100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
609 {"frd", 0x0eb00100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
610 {"pol", 0x0ec00100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
611 {"cmf", 0x0e90f110, NULL, except_flag, FPU_ALL, do_fp_cmp},
612 {"cnf", 0x0eb0f110, NULL, except_flag, FPU_ALL, do_fp_cmp},
613 /* The FPA10 data sheet suggests that the 'E' of cmfe/cnfe should not
614 be an optional suffix, but part of the instruction. To be compatible,
616 {"cmfe", 0x0ed0f110, NULL, NULL, FPU_ALL, do_fp_cmp},
617 {"cnfe", 0x0ef0f110, NULL, NULL, FPU_ALL, do_fp_cmp},
618 {"flt", 0x0e000110, "sde", round_flags, FPU_ALL, do_fp_from_reg},
619 {"fix", 0x0e100110, NULL, fix_flags, FPU_ALL, do_fp_to_reg},
621 /* Generic copressor instructions */
622 {"cdp", 0x0e000000, NULL, NULL, ARM_2UP, do_cdp},
623 {"ldc", 0x0c100000, NULL, cplong_flag, ARM_2UP, do_lstc},
624 {"stc", 0x0c000000, NULL, cplong_flag, ARM_2UP, do_lstc},
625 {"mcr", 0x0e000010, NULL, NULL, ARM_2UP, do_co_reg},
626 {"mrc", 0x0e100010, NULL, NULL, ARM_2UP, do_co_reg},
629 /* defines for various bits that we will want to toggle */
631 #define INST_IMMEDIATE 0x02000000
632 #define OFFSET_REG 0x02000000
633 #define HWOFFSET_IMM 0x00400000
634 #define SHIFT_BY_REG 0x00000010
635 #define PRE_INDEX 0x01000000
636 #define INDEX_UP 0x00800000
637 #define WRITE_BACK 0x00200000
638 #define LDM_TYPE_2_OR_3 0x00400000
640 #define LITERAL_MASK 0xf000f000
641 #define COND_MASK 0xf0000000
642 #define OPCODE_MASK 0xfe1fffff
643 #define DATA_OP_SHIFT 21
645 /* Codes to distinguish the arithmetic instructions */
657 #define OPCODE_CMP 10
658 #define OPCODE_CMN 11
659 #define OPCODE_ORR 12
660 #define OPCODE_MOV 13
661 #define OPCODE_BIC 14
662 #define OPCODE_MVN 15
664 static void do_t_nop PARAMS ((char *));
665 static void do_t_arit PARAMS ((char *));
666 static void do_t_add PARAMS ((char *));
667 static void do_t_asr PARAMS ((char *));
668 static void do_t_branch9 PARAMS ((char *));
669 static void do_t_branch12 PARAMS ((char *));
670 static void do_t_branch23 PARAMS ((char *));
671 static void do_t_bx PARAMS ((char *));
672 static void do_t_compare PARAMS ((char *));
673 static void do_t_ldmstm PARAMS ((char *));
674 static void do_t_ldr PARAMS ((char *));
675 static void do_t_ldrb PARAMS ((char *));
676 static void do_t_ldrh PARAMS ((char *));
677 static void do_t_lds PARAMS ((char *));
678 static void do_t_lsl PARAMS ((char *));
679 static void do_t_lsr PARAMS ((char *));
680 static void do_t_mov PARAMS ((char *));
681 static void do_t_push_pop PARAMS ((char *));
682 static void do_t_str PARAMS ((char *));
683 static void do_t_strb PARAMS ((char *));
684 static void do_t_strh PARAMS ((char *));
685 static void do_t_sub PARAMS ((char *));
686 static void do_t_swi PARAMS ((char *));
687 static void do_t_adr PARAMS ((char *));
689 #define T_OPCODE_MUL 0x4340
690 #define T_OPCODE_TST 0x4200
691 #define T_OPCODE_CMN 0x42c0
692 #define T_OPCODE_NEG 0x4240
693 #define T_OPCODE_MVN 0x43c0
695 #define T_OPCODE_ADD_R3 0x1800
696 #define T_OPCODE_SUB_R3 0x1a00
697 #define T_OPCODE_ADD_HI 0x4400
698 #define T_OPCODE_ADD_ST 0xb000
699 #define T_OPCODE_SUB_ST 0xb080
700 #define T_OPCODE_ADD_SP 0xa800
701 #define T_OPCODE_ADD_PC 0xa000
702 #define T_OPCODE_ADD_I8 0x3000
703 #define T_OPCODE_SUB_I8 0x3800
704 #define T_OPCODE_ADD_I3 0x1c00
705 #define T_OPCODE_SUB_I3 0x1e00
707 #define T_OPCODE_ASR_R 0x4100
708 #define T_OPCODE_LSL_R 0x4080
709 #define T_OPCODE_LSR_R 0x40c0
710 #define T_OPCODE_ASR_I 0x1000
711 #define T_OPCODE_LSL_I 0x0000
712 #define T_OPCODE_LSR_I 0x0800
714 #define T_OPCODE_MOV_I8 0x2000
715 #define T_OPCODE_CMP_I8 0x2800
716 #define T_OPCODE_CMP_LR 0x4280
717 #define T_OPCODE_MOV_HR 0x4600
718 #define T_OPCODE_CMP_HR 0x4500
720 #define T_OPCODE_LDR_PC 0x4800
721 #define T_OPCODE_LDR_SP 0x9800
722 #define T_OPCODE_STR_SP 0x9000
723 #define T_OPCODE_LDR_IW 0x6800
724 #define T_OPCODE_STR_IW 0x6000
725 #define T_OPCODE_LDR_IH 0x8800
726 #define T_OPCODE_STR_IH 0x8000
727 #define T_OPCODE_LDR_IB 0x7800
728 #define T_OPCODE_STR_IB 0x7000
729 #define T_OPCODE_LDR_RW 0x5800
730 #define T_OPCODE_STR_RW 0x5000
731 #define T_OPCODE_LDR_RH 0x5a00
732 #define T_OPCODE_STR_RH 0x5200
733 #define T_OPCODE_LDR_RB 0x5c00
734 #define T_OPCODE_STR_RB 0x5400
736 #define T_OPCODE_PUSH 0xb400
737 #define T_OPCODE_POP 0xbc00
739 #define T_OPCODE_BRANCH 0xe7fe
741 static int thumb_reg PARAMS ((char ** str, int hi_lo));
743 #define THUMB_SIZE 2 /* Size of thumb instruction */
744 #define THUMB_REG_LO 0x1
745 #define THUMB_REG_HI 0x2
746 #define THUMB_REG_ANY 0x3
748 #define THUMB_H1 0x0080
749 #define THUMB_H2 0x0040
756 #define THUMB_COMPARE 1
759 #define THUMB_STORE 1
761 #define THUMB_PP_PC_LR 0x0100
763 /* These three are used for immediate shifts, do not alter */
765 #define THUMB_HALFWORD 1
770 CONST char * template; /* Basic string to match */
771 unsigned long value; /* Basic instruction code */
773 unsigned long variants; /* Which CPU variants this exists for */
774 void (* parms) PARAMS ((char *)); /* Function to call to parse args */
777 static CONST struct thumb_opcode tinsns[] =
779 {"adc", 0x4140, 2, ARM_THUMB, do_t_arit},
780 {"add", 0x0000, 2, ARM_THUMB, do_t_add},
781 {"and", 0x4000, 2, ARM_THUMB, do_t_arit},
782 {"asr", 0x0000, 2, ARM_THUMB, do_t_asr},
783 {"b", T_OPCODE_BRANCH, 2, ARM_THUMB, do_t_branch12},
784 {"beq", 0xd0fe, 2, ARM_THUMB, do_t_branch9},
785 {"bne", 0xd1fe, 2, ARM_THUMB, do_t_branch9},
786 {"bcs", 0xd2fe, 2, ARM_THUMB, do_t_branch9},
787 {"bhs", 0xd2fe, 2, ARM_THUMB, do_t_branch9},
788 {"bcc", 0xd3fe, 2, ARM_THUMB, do_t_branch9},
789 {"bul", 0xd3fe, 2, ARM_THUMB, do_t_branch9},
790 {"blo", 0xd3fe, 2, ARM_THUMB, do_t_branch9},
791 {"bmi", 0xd4fe, 2, ARM_THUMB, do_t_branch9},
792 {"bpl", 0xd5fe, 2, ARM_THUMB, do_t_branch9},
793 {"bvs", 0xd6fe, 2, ARM_THUMB, do_t_branch9},
794 {"bvc", 0xd7fe, 2, ARM_THUMB, do_t_branch9},
795 {"bhi", 0xd8fe, 2, ARM_THUMB, do_t_branch9},
796 {"bls", 0xd9fe, 2, ARM_THUMB, do_t_branch9},
797 {"bge", 0xdafe, 2, ARM_THUMB, do_t_branch9},
798 {"blt", 0xdbfe, 2, ARM_THUMB, do_t_branch9},
799 {"bgt", 0xdcfe, 2, ARM_THUMB, do_t_branch9},
800 {"ble", 0xddfe, 2, ARM_THUMB, do_t_branch9},
801 {"bic", 0x4380, 2, ARM_THUMB, do_t_arit},
802 {"bl", 0xf7fffffe, 4, ARM_THUMB, do_t_branch23},
803 {"bx", 0x4700, 2, ARM_THUMB, do_t_bx},
804 {"cmn", T_OPCODE_CMN, 2, ARM_THUMB, do_t_arit},
805 {"cmp", 0x0000, 2, ARM_THUMB, do_t_compare},
806 {"eor", 0x4040, 2, ARM_THUMB, do_t_arit},
807 {"ldmia", 0xc800, 2, ARM_THUMB, do_t_ldmstm},
808 {"ldr", 0x0000, 2, ARM_THUMB, do_t_ldr},
809 {"ldrb", 0x0000, 2, ARM_THUMB, do_t_ldrb},
810 {"ldrh", 0x0000, 2, ARM_THUMB, do_t_ldrh},
811 {"ldrsb", 0x5600, 2, ARM_THUMB, do_t_lds},
812 {"ldrsh", 0x5e00, 2, ARM_THUMB, do_t_lds},
813 {"ldsb", 0x5600, 2, ARM_THUMB, do_t_lds},
814 {"ldsh", 0x5e00, 2, ARM_THUMB, do_t_lds},
815 {"lsl", 0x0000, 2, ARM_THUMB, do_t_lsl},
816 {"lsr", 0x0000, 2, ARM_THUMB, do_t_lsr},
817 {"mov", 0x0000, 2, ARM_THUMB, do_t_mov},
818 {"mul", T_OPCODE_MUL, 2, ARM_THUMB, do_t_arit},
819 {"mvn", T_OPCODE_MVN, 2, ARM_THUMB, do_t_arit},
820 {"neg", T_OPCODE_NEG, 2, ARM_THUMB, do_t_arit},
821 {"orr", 0x4300, 2, ARM_THUMB, do_t_arit},
822 {"pop", 0xbc00, 2, ARM_THUMB, do_t_push_pop},
823 {"push", 0xb400, 2, ARM_THUMB, do_t_push_pop},
824 {"ror", 0x41c0, 2, ARM_THUMB, do_t_arit},
825 {"sbc", 0x4180, 2, ARM_THUMB, do_t_arit},
826 {"stmia", 0xc000, 2, ARM_THUMB, do_t_ldmstm},
827 {"str", 0x0000, 2, ARM_THUMB, do_t_str},
828 {"strb", 0x0000, 2, ARM_THUMB, do_t_strb},
829 {"strh", 0x0000, 2, ARM_THUMB, do_t_strh},
830 {"swi", 0xdf00, 2, ARM_THUMB, do_t_swi},
831 {"sub", 0x0000, 2, ARM_THUMB, do_t_sub},
832 {"tst", T_OPCODE_TST, 2, ARM_THUMB, do_t_arit},
834 {"adr", 0x0000, 2, ARM_THUMB, do_t_adr},
835 {"nop", 0x46C0, 2, ARM_THUMB, do_t_nop}, /* mov r8,r8 */
844 #define int_register(reg) ((reg) >= 0 && (reg) <= 15)
845 #define cp_register(reg) ((reg) >= 32 && (reg) <= 47)
846 #define fp_register(reg) ((reg) >= 16 && (reg) <= 23)
852 /* These are the standard names; Users can add aliases with .req */
853 static CONST struct reg_entry reg_table[] =
855 /* Processor Register Numbers */
856 {"r0", 0}, {"r1", 1}, {"r2", 2}, {"r3", 3},
857 {"r4", 4}, {"r5", 5}, {"r6", 6}, {"r7", 7},
858 {"r8", 8}, {"r9", 9}, {"r10", 10}, {"r11", 11},
859 {"r12", 12}, {"r13", REG_SP},{"r14", REG_LR},{"r15", REG_PC},
860 /* APCS conventions */
861 {"a1", 0}, {"a2", 1}, {"a3", 2}, {"a4", 3},
862 {"v1", 4}, {"v2", 5}, {"v3", 6}, {"v4", 7}, {"v5", 8},
863 {"v6", 9}, {"sb", 9}, {"v7", 10}, {"sl", 10},
864 {"fp", 11}, {"ip", 12}, {"sp", REG_SP},{"lr", REG_LR},{"pc", REG_PC},
866 {"f0", 16}, {"f1", 17}, {"f2", 18}, {"f3", 19},
867 {"f4", 20}, {"f5", 21}, {"f6", 22}, {"f7", 23},
868 {"c0", 32}, {"c1", 33}, {"c2", 34}, {"c3", 35},
869 {"c4", 36}, {"c5", 37}, {"c6", 38}, {"c7", 39},
870 {"c8", 40}, {"c9", 41}, {"c10", 42}, {"c11", 43},
871 {"c12", 44}, {"c13", 45}, {"c14", 46}, {"c15", 47},
872 {"cr0", 32}, {"cr1", 33}, {"cr2", 34}, {"cr3", 35},
873 {"cr4", 36}, {"cr5", 37}, {"cr6", 38}, {"cr7", 39},
874 {"cr8", 40}, {"cr9", 41}, {"cr10", 42}, {"cr11", 43},
875 {"cr12", 44}, {"cr13", 45}, {"cr14", 46}, {"cr15", 47},
879 #define BAD_ARGS _("Bad arguments to instruction");
880 #define BAD_PC _("r15 not allowed here");
882 static struct hash_control * arm_ops_hsh = NULL;
883 static struct hash_control * arm_tops_hsh = NULL;
884 static struct hash_control * arm_cond_hsh = NULL;
885 static struct hash_control * arm_shift_hsh = NULL;
886 static struct hash_control * arm_reg_hsh = NULL;
887 static struct hash_control * arm_psr_hsh = NULL;
889 /* This table describes all the machine specific pseudo-ops the assembler
890 has to support. The fields are:
891 pseudo-op name without dot
892 function to call to execute this pseudo-op
893 Integer arg to pass to the function
896 static void s_req PARAMS ((int));
897 static void s_align PARAMS ((int));
898 static void s_bss PARAMS ((int));
899 static void s_even PARAMS ((int));
900 static void s_ltorg PARAMS ((int));
901 static void s_arm PARAMS ((int));
902 static void s_thumb PARAMS ((int));
903 static void s_code PARAMS ((int));
904 static void s_force_thumb PARAMS ((int));
905 static void s_thumb_func PARAMS ((int));
906 static void s_thumb_set PARAMS ((int));
907 static void arm_s_text PARAMS ((int));
908 static void arm_s_data PARAMS ((int));
910 static void arm_s_section PARAMS ((int));
911 static void s_arm_elf_cons PARAMS ((int));
914 static int my_get_expression PARAMS ((expressionS *, char **));
916 CONST pseudo_typeS md_pseudo_table[] =
918 { "req", s_req, 0 }, /* Never called becasue '.req' does not start line */
920 { "align", s_align, 0 },
922 { "thumb", s_thumb, 0 },
923 { "code", s_code, 0 },
924 { "force_thumb", s_force_thumb, 0 },
925 { "thumb_func", s_thumb_func, 0 },
926 { "thumb_set", s_thumb_set, 0 },
927 { "even", s_even, 0 },
928 { "ltorg", s_ltorg, 0 },
929 { "pool", s_ltorg, 0 },
930 /* Allow for the effect of section changes. */
931 { "text", arm_s_text, 0 },
932 { "data", arm_s_data, 0 },
934 { "section", arm_s_section, 0 },
935 { "section.s", arm_s_section, 0 },
936 { "sect", arm_s_section, 0 },
937 { "sect.s", arm_s_section, 0 },
938 { "word", s_arm_elf_cons, 4 },
939 { "long", s_arm_elf_cons, 4 },
943 { "extend", float_cons, 'x' },
944 { "ldouble", float_cons, 'x' },
945 { "packed", float_cons, 'p' },
949 /* Stuff needed to resolve the label ambiguity
959 symbolS * last_label_seen;
960 static int label_is_thumb_function_name = false;
964 #define MAX_LITERAL_POOL_SIZE 1024
966 typedef struct literalS
968 struct expressionS exp;
969 struct arm_it * inst;
972 literalT literals[MAX_LITERAL_POOL_SIZE];
973 int next_literal_pool_place = 0; /* Next free entry in the pool */
974 int lit_pool_num = 1; /* Next literal pool number */
975 symbolS * current_poolP = NULL;
982 if (current_poolP == NULL)
983 current_poolP = symbol_create (FAKE_LABEL_NAME, undefined_section,
984 (valueT) 0, &zero_address_frag);
986 /* Check if this literal value is already in the pool: */
987 while (lit_count < next_literal_pool_place)
989 if (literals[lit_count].exp.X_op == inst.reloc.exp.X_op
990 && inst.reloc.exp.X_op == O_constant
991 && literals[lit_count].exp.X_add_number == inst.reloc.exp.X_add_number
992 && literals[lit_count].exp.X_unsigned == inst.reloc.exp.X_unsigned)
997 if (lit_count == next_literal_pool_place) /* new entry */
999 if (next_literal_pool_place > MAX_LITERAL_POOL_SIZE)
1001 inst.error = _("Literal Pool Overflow");
1005 literals[next_literal_pool_place].exp = inst.reloc.exp;
1006 lit_count = next_literal_pool_place++;
1009 inst.reloc.exp.X_op = O_symbol;
1010 inst.reloc.exp.X_add_number = (lit_count) * 4 - 8;
1011 inst.reloc.exp.X_add_symbol = current_poolP;
1016 /* Can't use symbol_new here, so have to create a symbol and then at
1017 a later date assign it a value. Thats what these functions do. */
1019 symbol_locate (symbolP, name, segment, valu, frag)
1021 CONST char * name; /* It is copied, the caller can modify */
1022 segT segment; /* Segment identifier (SEG_<something>) */
1023 valueT valu; /* Symbol value */
1024 fragS * frag; /* Associated fragment */
1026 unsigned int name_length;
1027 char * preserved_copy_of_name;
1029 name_length = strlen (name) + 1; /* +1 for \0 */
1030 obstack_grow (¬es, name, name_length);
1031 preserved_copy_of_name = obstack_finish (¬es);
1032 #ifdef STRIP_UNDERSCORE
1033 if (preserved_copy_of_name[0] == '_')
1034 preserved_copy_of_name++;
1037 #ifdef tc_canonicalize_symbol_name
1038 preserved_copy_of_name =
1039 tc_canonicalize_symbol_name (preserved_copy_of_name);
1042 S_SET_NAME (symbolP, preserved_copy_of_name);
1044 S_SET_SEGMENT (symbolP, segment);
1045 S_SET_VALUE (symbolP, valu);
1046 symbol_clear_list_pointers(symbolP);
1048 symbol_set_frag (symbolP, frag);
1050 /* Link to end of symbol chain. */
1052 extern int symbol_table_frozen;
1053 if (symbol_table_frozen)
1057 symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
1059 obj_symbol_new_hook (symbolP);
1061 #ifdef tc_symbol_new_hook
1062 tc_symbol_new_hook (symbolP);
1066 verify_symbol_chain (symbol_rootP, symbol_lastP);
1067 #endif /* DEBUG_SYMS */
1070 /* Check that an immediate is valid, and if so, convert it to the right format. */
1073 validate_immediate (val)
1079 #define rotate_left(v, n) (v << n | v >> (32 - n))
1081 for (i = 0; i < 32; i += 2)
1082 if ((a = rotate_left (val, i)) <= 0xff)
1083 return a | (i << 7); /* 12-bit pack: [shift-cnt,const] */
1088 /* Check to see if an immediate can be computed as two seperate immediate
1089 values, added together. We already know that this value cannot be
1090 computed by just one ARM instruction. */
1093 validate_immediate_twopart (val, highpart)
1095 unsigned int * highpart;
1100 for (i = 0; i < 32; i += 2)
1101 if (((a = rotate_left (val, i)) & 0xff) != 0)
1107 * highpart = (a >> 8) | ((i + 24) << 7);
1109 else if (a & 0xff0000)
1114 * highpart = (a >> 16) | ((i + 16) << 7);
1118 assert (a & 0xff000000);
1120 * highpart = (a >> 24) | ((i + 8) << 7);
1123 return (a & 0xff) | (i << 7);
1130 validate_offset_imm (val, hwse)
1134 if ((hwse && val > 255) || val > 4095)
1144 as_bad (_("Invalid syntax for .req directive."));
1151 /* We don't support putting frags in the BSS segment, we fake it by
1152 marking in_bss, then looking at s_skip for clues?.. */
1153 subseg_set (bss_section, 0);
1154 demand_empty_rest_of_line ();
1161 if (!need_pass_2) /* Never make frag if expect extra pass. */
1162 frag_align (1, 0, 0);
1164 record_alignment (now_seg, 1);
1166 demand_empty_rest_of_line ();
1176 if (current_poolP == NULL)
1179 /* Align pool as you have word accesses */
1180 /* Only make a frag if we have to ... */
1182 frag_align (2, 0, 0);
1184 record_alignment (now_seg, 2);
1186 sprintf (sym_name, "$$lit_\002%x", lit_pool_num++);
1188 symbol_locate (current_poolP, sym_name, now_seg,
1189 (valueT) frag_now_fix (), frag_now);
1190 symbol_table_insert (current_poolP);
1192 ARM_SET_THUMB (current_poolP, thumb_mode);
1194 #if defined OBJ_COFF || defined OBJ_ELF
1195 ARM_SET_INTERWORK (current_poolP, support_interwork);
1198 while (lit_count < next_literal_pool_place)
1199 /* First output the expression in the instruction to the pool */
1200 emit_expr (&(literals[lit_count++].exp), 4); /* .word */
1202 next_literal_pool_place = 0;
1203 current_poolP = NULL;
1207 s_align (unused) /* Same as s_align_ptwo but align 0 => align 2 */
1211 register long temp_fill;
1212 long max_alignment = 15;
1214 temp = get_absolute_expression ();
1215 if (temp > max_alignment)
1216 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
1219 as_bad (_("Alignment negative. 0 assumed."));
1223 if (*input_line_pointer == ',')
1225 input_line_pointer++;
1226 temp_fill = get_absolute_expression ();
1234 /* Only make a frag if we HAVE to. . . */
1235 if (temp && !need_pass_2)
1236 frag_align (temp, (int) temp_fill, 0);
1237 demand_empty_rest_of_line ();
1239 record_alignment (now_seg, temp);
1243 s_force_thumb (ignore)
1246 /* If we are not already in thumb mode go into it, EVEN if
1247 the target processor does not support thumb instructions.
1248 This is used by gcc/config/arm/lib1funcs.asm for example
1249 to compile interworking support functions even if the
1250 target processor should not support interworking. */
1256 record_alignment (now_seg, 1);
1259 demand_empty_rest_of_line ();
1263 s_thumb_func (ignore)
1266 /* The following label is the name/address of the start of a Thumb function.
1267 We need to know this for the interworking support. */
1269 label_is_thumb_function_name = true;
1271 demand_empty_rest_of_line ();
1274 /* Perform a .set directive, but also mark the alias as
1275 being a thumb function. */
1281 /* XXX the following is a duplicate of the code for s_set() in read.c
1282 We cannot just call that code as we need to get at the symbol that
1284 register char * name;
1285 register char delim;
1286 register char * end_name;
1287 register symbolS * symbolP;
1290 * Especial apologies for the random logic:
1291 * this just grew, and could be parsed much more simply!
1294 name = input_line_pointer;
1295 delim = get_symbol_end ();
1296 end_name = input_line_pointer;
1301 if (*input_line_pointer != ',')
1304 as_bad (_("Expected comma after name \"%s\""), name);
1306 ignore_rest_of_line ();
1310 input_line_pointer++;
1313 if (name[0] == '.' && name[1] == '\0')
1315 /* XXX - this should not happen to .thumb_set */
1319 if ((symbolP = symbol_find (name)) == NULL
1320 && (symbolP = md_undefined_symbol (name)) == NULL)
1323 /* When doing symbol listings, play games with dummy fragments living
1324 outside the normal fragment chain to record the file and line info
1326 if (listing & LISTING_SYMBOLS)
1328 extern struct list_info_struct * listing_tail;
1329 fragS * dummy_frag = (fragS *) xmalloc (sizeof(fragS));
1330 memset (dummy_frag, 0, sizeof(fragS));
1331 dummy_frag->fr_type = rs_fill;
1332 dummy_frag->line = listing_tail;
1333 symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
1334 dummy_frag->fr_symbol = symbolP;
1338 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
1341 /* "set" symbols are local unless otherwise specified. */
1342 SF_SET_LOCAL (symbolP);
1343 #endif /* OBJ_COFF */
1344 } /* make a new symbol */
1346 symbol_table_insert (symbolP);
1351 && S_IS_DEFINED (symbolP)
1352 && S_GET_SEGMENT (symbolP) != reg_section)
1353 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
1355 pseudo_set (symbolP);
1357 demand_empty_rest_of_line ();
1359 /* XXX Now we come to the Thumb specific bit of code. */
1361 THUMB_SET_FUNC (symbolP, 1);
1362 ARM_SET_THUMB (symbolP, 1);
1363 #if defined OBJ_COFF || defined OBJ_ELF
1364 ARM_SET_INTERWORK (symbolP, support_interwork);
1368 /* If we change section we must dump the literal pool first. */
1373 if (now_seg != text_section)
1383 if (flag_readonly_data_in_text)
1385 if (now_seg != text_section)
1388 else if (now_seg != data_section)
1396 arm_s_section (ignore)
1401 obj_elf_section (ignore);
1406 opcode_select (width)
1414 if (! (cpu_variant & ARM_THUMB))
1415 as_bad (_("selected processor does not support THUMB opcodes"));
1417 /* No need to force the alignment, since we will have been
1418 coming from ARM mode, which is word-aligned. */
1419 record_alignment (now_seg, 1);
1426 if ((cpu_variant & ARM_ANY) == ARM_THUMB)
1427 as_bad (_("selected processor does not support ARM opcodes"));
1430 frag_align (2, 0, 0);
1431 record_alignment (now_seg, 1);
1436 as_bad (_("invalid instruction size selected (%d)"), width);
1445 demand_empty_rest_of_line ();
1453 demand_empty_rest_of_line ();
1462 temp = get_absolute_expression ();
1467 opcode_select (temp);
1471 as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
1479 skip_whitespace (str);
1482 inst.error = _("Garbage following instruction");
1486 skip_past_comma (str)
1492 while ((c = *p) == ' ' || c == ',')
1495 if (c == ',' && comma++)
1503 return comma ? SUCCESS : FAIL;
1506 /* A standard register must be given at this point. Shift is the place to
1507 put it in the instruction. */
1510 reg_required_here (str, shift)
1514 static char buff [128]; /* XXX */
1516 char * start = *str;
1518 if ((reg = arm_reg_parse (str)) != FAIL && int_register (reg))
1521 inst.instruction |= reg << shift;
1525 /* Restore the start point, we may have got a reg of the wrong class. */
1528 /* In the few cases where we might be able to accept something else
1529 this error can be overridden. */
1530 sprintf (buff, _("Register expected, not '%.100s'"), start);
1537 psr_required_here (str, cpsr, spsr)
1543 char * start = *str;
1544 psr = arm_psr_parse (str);
1546 if (psr == cpsr || psr == spsr)
1549 inst.instruction |= 1 << 22;
1554 /* In the few cases where we might be able to accept something else
1555 this error can be overridden. */
1556 inst.error = _("<psr(f)> expected");
1558 /* Restore the start point. */
1564 co_proc_number (str)
1567 int processor, pchar;
1569 skip_whitespace (* str);
1571 /* The data sheet seems to imply that just a number on its own is valid
1572 here, but the RISC iX assembler seems to accept a prefix 'p'. We will
1574 if (**str == 'p' || **str == 'P')
1578 if (pchar >= '0' && pchar <= '9')
1580 processor = pchar - '0';
1581 if (**str >= '0' && **str <= '9')
1583 processor = processor * 10 + *(*str)++ - '0';
1586 inst.error = _("Illegal co-processor number");
1593 inst.error = _("Bad or missing co-processor number");
1597 inst.instruction |= processor << 8;
1602 cp_opc_expr (str, where, length)
1609 skip_whitespace (* str);
1611 memset (&expr, '\0', sizeof (expr));
1613 if (my_get_expression (&expr, str))
1615 if (expr.X_op != O_constant)
1617 inst.error = _("bad or missing expression");
1621 if ((expr.X_add_number & ((1 << length) - 1)) != expr.X_add_number)
1623 inst.error = _("immediate co-processor expression too large");
1627 inst.instruction |= expr.X_add_number << where;
1632 cp_reg_required_here (str, where)
1637 char * start = *str;
1639 if ((reg = arm_reg_parse (str)) != FAIL && cp_register (reg))
1642 inst.instruction |= reg << where;
1646 /* In the few cases where we might be able to accept something else
1647 this error can be overridden. */
1648 inst.error = _("Co-processor register expected");
1650 /* Restore the start point. */
1656 fp_reg_required_here (str, where)
1661 char * start = *str;
1663 if ((reg = arm_reg_parse (str)) != FAIL && fp_register (reg))
1666 inst.instruction |= reg << where;
1670 /* In the few cases where we might be able to accept something else
1671 this error can be overridden. */
1672 inst.error = _("Floating point register expected");
1674 /* Restore the start point. */
1680 cp_address_offset (str)
1685 skip_whitespace (* str);
1687 if (! is_immediate_prefix (**str))
1689 inst.error = _("immediate expression expected");
1695 if (my_get_expression (& inst.reloc.exp, str))
1698 if (inst.reloc.exp.X_op == O_constant)
1700 offset = inst.reloc.exp.X_add_number;
1704 inst.error = _("co-processor address must be word aligned");
1708 if (offset > 1023 || offset < -1023)
1710 inst.error = _("offset too large");
1715 inst.instruction |= INDEX_UP;
1719 inst.instruction |= offset >> 2;
1722 inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
1728 cp_address_required_here (str)
1740 skip_whitespace (p);
1742 if ((reg = reg_required_here (& p, 16)) == FAIL)
1745 skip_whitespace (p);
1751 if (skip_past_comma (& p) == SUCCESS)
1754 write_back = WRITE_BACK;
1758 inst.error = _("pc may not be used in post-increment");
1762 if (cp_address_offset (& p) == FAIL)
1766 pre_inc = PRE_INDEX | INDEX_UP;
1770 /* '['Rn, #expr']'[!] */
1772 if (skip_past_comma (& p) == FAIL)
1774 inst.error = _("pre-indexed expression expected");
1778 pre_inc = PRE_INDEX;
1780 if (cp_address_offset (& p) == FAIL)
1783 skip_whitespace (p);
1787 inst.error = _("missing ]");
1791 skip_whitespace (p);
1797 inst.error = _("pc may not be used with write-back");
1802 write_back = WRITE_BACK;
1808 if (my_get_expression (&inst.reloc.exp, &p))
1811 inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
1812 inst.reloc.exp.X_add_number -= 8; /* PC rel adjust */
1813 inst.reloc.pc_rel = 1;
1814 inst.instruction |= (REG_PC << 16);
1815 pre_inc = PRE_INDEX;
1818 inst.instruction |= write_back | pre_inc;
1826 unsigned long flags;
1828 /* Do nothing really. */
1829 inst.instruction |= flags; /* This is pointless. */
1837 unsigned long flags;
1839 /* Only one syntax. */
1840 skip_whitespace (str);
1842 if (reg_required_here (&str, 12) == FAIL)
1844 inst.error = BAD_ARGS;
1848 if (skip_past_comma (&str) == FAIL
1849 || psr_required_here (& str, CPSR_ALL, SPSR_ALL) == FAIL)
1851 inst.error = _("<psr> expected");
1855 inst.instruction |= flags;
1860 /* Three possible forms: "<psr>, Rm", "<psrf>, Rm", "<psrf>, #expression". */
1864 unsigned long flags;
1868 skip_whitespace (str);
1870 if (psr_required_here (&str, CPSR_ALL, SPSR_ALL) == SUCCESS)
1872 inst.instruction |= PSR_ALL;
1874 /* Sytax should be "<psr>, Rm" */
1875 if (skip_past_comma (&str) == FAIL
1876 || (reg = reg_required_here (&str, 0)) == FAIL)
1878 inst.error = BAD_ARGS;
1884 if (psr_required_here (& str, CPSR_FLG, SPSR_FLG) == SUCCESS)
1885 inst.instruction |= PSR_FLAGS;
1886 else if (psr_required_here (& str, CPSR_CTL, SPSR_CTL) == SUCCESS)
1887 inst.instruction |= PSR_CONTROL;
1890 inst.error = BAD_ARGS;
1894 if (skip_past_comma (&str) == FAIL)
1896 inst.error = BAD_ARGS;
1900 /* Syntax could be "<psrf>, rm", "<psrf>, #expression" */
1902 if ((reg = reg_required_here (& str, 0)) != FAIL)
1904 /* Immediate expression. */
1905 else if (is_immediate_prefix (* str))
1910 if (my_get_expression (& inst.reloc.exp, & str))
1912 inst.error = _("Register or shift expression expected");
1916 if (inst.reloc.exp.X_add_symbol)
1918 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
1919 inst.reloc.pc_rel = 0;
1923 unsigned value = validate_immediate (inst.reloc.exp.X_add_number);
1926 inst.error = _("Invalid constant");
1930 inst.instruction |= value;
1933 flags |= INST_IMMEDIATE;
1937 inst.error = _("Error: unrecognised syntax for second argument to msr instruction");
1943 inst.instruction |= flags;
1948 /* Long Multiply Parser
1949 UMULL RdLo, RdHi, Rm, Rs
1950 SMULL RdLo, RdHi, Rm, Rs
1951 UMLAL RdLo, RdHi, Rm, Rs
1952 SMLAL RdLo, RdHi, Rm, Rs
1955 do_mull (str, flags)
1957 unsigned long flags;
1959 int rdlo, rdhi, rm, rs;
1961 /* Only one format "rdlo, rdhi, rm, rs" */
1962 skip_whitespace (str);
1964 if ((rdlo = reg_required_here (&str, 12)) == FAIL)
1966 inst.error = BAD_ARGS;
1970 if (skip_past_comma (&str) == FAIL
1971 || (rdhi = reg_required_here (&str, 16)) == FAIL)
1973 inst.error = BAD_ARGS;
1977 if (skip_past_comma (&str) == FAIL
1978 || (rm = reg_required_here (&str, 0)) == FAIL)
1980 inst.error = BAD_ARGS;
1984 /* rdhi, rdlo and rm must all be different */
1985 if (rdlo == rdhi || rdlo == rm || rdhi == rm)
1986 as_tsktsk (_("rdhi, rdlo and rm must all be different"));
1988 if (skip_past_comma (&str) == FAIL
1989 || (rs = reg_required_here (&str, 8)) == FAIL)
1991 inst.error = BAD_ARGS;
1995 if (rdhi == REG_PC || rdhi == REG_PC || rdhi == REG_PC || rdhi == REG_PC)
1997 inst.error = BAD_PC;
2001 inst.instruction |= flags;
2009 unsigned long flags;
2013 /* Only one format "rd, rm, rs" */
2014 skip_whitespace (str);
2016 if ((rd = reg_required_here (&str, 16)) == FAIL)
2018 inst.error = BAD_ARGS;
2024 inst.error = BAD_PC;
2028 if (skip_past_comma (&str) == FAIL
2029 || (rm = reg_required_here (&str, 0)) == FAIL)
2031 inst.error = BAD_ARGS;
2037 inst.error = BAD_PC;
2042 as_tsktsk (_("rd and rm should be different in mul"));
2044 if (skip_past_comma (&str) == FAIL
2045 || (rm = reg_required_here (&str, 8)) == FAIL)
2047 inst.error = BAD_ARGS;
2053 inst.error = BAD_PC;
2057 inst.instruction |= flags;
2065 unsigned long flags;
2069 /* Only one format "rd, rm, rs, rn" */
2070 skip_whitespace (str);
2072 if ((rd = reg_required_here (&str, 16)) == FAIL)
2074 inst.error = BAD_ARGS;
2080 inst.error = BAD_PC;
2084 if (skip_past_comma (&str) == FAIL
2085 || (rm = reg_required_here (&str, 0)) == FAIL)
2087 inst.error = BAD_ARGS;
2093 inst.error = BAD_PC;
2098 as_tsktsk (_("rd and rm should be different in mla"));
2100 if (skip_past_comma (&str) == FAIL
2101 || (rd = reg_required_here (&str, 8)) == FAIL
2102 || skip_past_comma (&str) == FAIL
2103 || (rm = reg_required_here (&str, 12)) == FAIL)
2105 inst.error = BAD_ARGS;
2109 if (rd == REG_PC || rm == REG_PC)
2111 inst.error = BAD_PC;
2115 inst.instruction |= flags;
2120 /* Returns the index into fp_values of a floating point number, or -1 if
2121 not in the table. */
2123 my_get_float_expression (str)
2126 LITTLENUM_TYPE words[MAX_LITTLENUMS];
2132 memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
2133 /* Look for a raw floating point number */
2134 if ((save_in = atof_ieee (*str, 'x', words)) != NULL
2135 && (is_end_of_line [(int)(*save_in)] || *save_in == '\0'))
2137 for (i = 0; i < NUM_FLOAT_VALS; i++)
2139 for (j = 0; j < MAX_LITTLENUMS; j++)
2141 if (words[j] != fp_values[i][j])
2145 if (j == MAX_LITTLENUMS)
2153 /* Try and parse a more complex expression, this will probably fail
2154 unless the code uses a floating point prefix (eg "0f") */
2155 save_in = input_line_pointer;
2156 input_line_pointer = *str;
2157 if (expression (&exp) == absolute_section
2158 && exp.X_op == O_big
2159 && exp.X_add_number < 0)
2161 /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
2163 if (gen_to_words (words, 5, (long)15) == 0)
2165 for (i = 0; i < NUM_FLOAT_VALS; i++)
2167 for (j = 0; j < MAX_LITTLENUMS; j++)
2169 if (words[j] != fp_values[i][j])
2173 if (j == MAX_LITTLENUMS)
2175 *str = input_line_pointer;
2176 input_line_pointer = save_in;
2183 *str = input_line_pointer;
2184 input_line_pointer = save_in;
2188 /* Return true if anything in the expression is a bignum */
2190 walk_no_bignums (sp)
2193 if (symbol_get_value_expression (sp)->X_op == O_big)
2196 if (symbol_get_value_expression (sp)->X_add_symbol)
2198 return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
2199 || (symbol_get_value_expression (sp)->X_op_symbol
2200 && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
2207 my_get_expression (ep, str)
2214 save_in = input_line_pointer;
2215 input_line_pointer = *str;
2216 seg = expression (ep);
2219 if (seg != absolute_section
2220 && seg != text_section
2221 && seg != data_section
2222 && seg != bss_section
2223 && seg != undefined_section)
2225 inst.error = _("bad_segment");
2226 *str = input_line_pointer;
2227 input_line_pointer = save_in;
2232 /* Get rid of any bignums now, so that we don't generate an error for which
2233 we can't establish a line number later on. Big numbers are never valid
2234 in instructions, which is where this routine is always called. */
2235 if (ep->X_op == O_big
2236 || (ep->X_add_symbol
2237 && (walk_no_bignums (ep->X_add_symbol)
2239 && walk_no_bignums (ep->X_op_symbol)))))
2241 inst.error = _("Invalid constant");
2242 *str = input_line_pointer;
2243 input_line_pointer = save_in;
2247 *str = input_line_pointer;
2248 input_line_pointer = save_in;
2252 /* unrestrict should be one if <shift> <register> is permitted for this
2256 decode_shift (str, unrestrict)
2260 struct asm_shift * shft;
2264 skip_whitespace (* str);
2266 for (p = *str; isalpha (*p); p++)
2271 inst.error = _("Shift expression expected");
2277 shft = (struct asm_shift *) hash_find (arm_shift_hsh, *str);
2281 if (!strncmp (*str, "rrx", 3)
2282 || !strncmp (*str, "RRX", 3))
2285 inst.instruction |= shft->value;
2289 skip_whitespace (p);
2291 if (unrestrict && reg_required_here (&p, 8) != FAIL)
2293 inst.instruction |= shft->value | SHIFT_BY_REG;
2297 else if (is_immediate_prefix (* p))
2301 if (my_get_expression (&inst.reloc.exp, &p))
2304 /* Validate some simple #expressions */
2305 if (inst.reloc.exp.X_op == O_constant)
2307 unsigned num = inst.reloc.exp.X_add_number;
2309 /* Reject operations greater than 32, or lsl #32 */
2310 if (num > 32 || (num == 32 && shft->value == 0))
2312 inst.error = _("Invalid immediate shift");
2316 /* Shifts of zero should be converted to lsl (which is zero)*/
2323 /* Shifts of 32 are encoded as 0, for those shifts that
2328 inst.instruction |= (num << 7) | shft->value;
2333 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
2334 inst.reloc.pc_rel = 0;
2335 inst.instruction |= shft->value;
2341 inst.error = unrestrict ? _("shift requires register or #expression")
2342 : _("shift requires #expression");
2348 inst.error = _("Shift expression expected");
2352 /* Do those data_ops which can take a negative immediate constant */
2353 /* by altering the instuction. A bit of a hack really */
2357 by inverting the second operand, and
2360 by negating the second operand.
2363 negate_data_op (instruction, value)
2364 unsigned long * instruction;
2365 unsigned long value;
2368 unsigned long negated, inverted;
2370 negated = validate_immediate (-value);
2371 inverted = validate_immediate (~value);
2373 op = (*instruction >> DATA_OP_SHIFT) & 0xf;
2377 case OPCODE_SUB: /* ADD <-> SUB */
2378 new_inst = OPCODE_ADD;
2383 new_inst = OPCODE_SUB;
2387 case OPCODE_CMP: /* CMP <-> CMN */
2388 new_inst = OPCODE_CMN;
2393 new_inst = OPCODE_CMP;
2397 /* Now Inverted ops */
2398 case OPCODE_MOV: /* MOV <-> MVN */
2399 new_inst = OPCODE_MVN;
2404 new_inst = OPCODE_MOV;
2408 case OPCODE_AND: /* AND <-> BIC */
2409 new_inst = OPCODE_BIC;
2414 new_inst = OPCODE_AND;
2418 case OPCODE_ADC: /* ADC <-> SBC */
2419 new_inst = OPCODE_SBC;
2424 new_inst = OPCODE_ADC;
2428 /* We cannot do anything */
2436 *instruction &= OPCODE_MASK;
2437 *instruction |= new_inst << DATA_OP_SHIFT;
2448 skip_whitespace (* str);
2450 if (reg_required_here (str, 0) != FAIL)
2452 if (skip_past_comma (str) == SUCCESS)
2453 /* Shift operation on register. */
2454 return decode_shift (str, NO_SHIFT_RESTRICT);
2460 /* Immediate expression */
2461 if (is_immediate_prefix (**str))
2466 if (my_get_expression (&inst.reloc.exp, str))
2469 if (inst.reloc.exp.X_add_symbol)
2471 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
2472 inst.reloc.pc_rel = 0;
2476 if (skip_past_comma (str) == SUCCESS)
2478 /* #x, y -- ie explicit rotation by Y */
2479 if (my_get_expression (&expr, str))
2482 if (expr.X_op != O_constant)
2484 inst.error = _("Constant expression expected");
2488 /* Rotate must be a multiple of 2 */
2489 if (((unsigned) expr.X_add_number) > 30
2490 || (expr.X_add_number & 1) != 0
2491 || ((unsigned) inst.reloc.exp.X_add_number) > 255)
2493 inst.error = _("Invalid constant");
2496 inst.instruction |= INST_IMMEDIATE;
2497 inst.instruction |= inst.reloc.exp.X_add_number;
2498 inst.instruction |= expr.X_add_number << 7;
2502 /* Implicit rotation, select a suitable one */
2503 value = validate_immediate (inst.reloc.exp.X_add_number);
2507 /* Can't be done, perhaps the code reads something like
2508 "add Rd, Rn, #-n", where "sub Rd, Rn, #n" would be ok */
2509 if ((value = negate_data_op (&inst.instruction,
2510 inst.reloc.exp.X_add_number))
2513 inst.error = _("Invalid constant");
2518 inst.instruction |= value;
2521 inst.instruction |= INST_IMMEDIATE;
2526 inst.error = _("Register or shift expression expected");
2535 skip_whitespace (* str);
2537 if (fp_reg_required_here (str, 0) != FAIL)
2541 /* Immediate expression */
2542 if (*((*str)++) == '#')
2548 skip_whitespace (* str);
2550 /* First try and match exact strings, this is to guarantee that
2551 some formats will work even for cross assembly */
2553 for (i = 0; fp_const[i]; i++)
2555 if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
2559 *str += strlen (fp_const[i]);
2560 if (is_end_of_line[(int)**str] || **str == '\0')
2562 inst.instruction |= i + 8;
2569 /* Just because we didn't get a match doesn't mean that the
2570 constant isn't valid, just that it is in a format that we
2571 don't automatically recognize. Try parsing it with
2572 the standard expression routines. */
2573 if ((i = my_get_float_expression (str)) >= 0)
2575 inst.instruction |= i + 8;
2579 inst.error = _("Invalid floating point immediate expression");
2582 inst.error = _("Floating point register or immediate expression expected");
2588 do_arit (str, flags)
2590 unsigned long flags;
2592 skip_whitespace (str);
2594 if (reg_required_here (&str, 12) == FAIL
2595 || skip_past_comma (&str) == FAIL
2596 || reg_required_here (&str, 16) == FAIL
2597 || skip_past_comma (&str) == FAIL
2598 || data_op2 (&str) == FAIL)
2601 inst.error = BAD_ARGS;
2605 inst.instruction |= flags;
2613 unsigned long flags;
2615 /* This is a pseudo-op of the form "adr rd, label" to be converted
2616 into a relative address of the form "add rd, pc, #label-.-8" */
2618 skip_whitespace (str);
2620 if (reg_required_here (&str, 12) == FAIL
2621 || skip_past_comma (&str) == FAIL
2622 || my_get_expression (&inst.reloc.exp, &str))
2625 inst.error = BAD_ARGS;
2628 /* Frag hacking will turn this into a sub instruction if the offset turns
2629 out to be negative. */
2630 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
2631 inst.reloc.exp.X_add_number -= 8; /* PC relative adjust */
2632 inst.reloc.pc_rel = 1;
2633 inst.instruction |= flags;
2639 do_adrl (str, flags)
2641 unsigned long flags;
2643 /* This is a pseudo-op of the form "adrl rd, label" to be converted
2644 into a relative address of the form:
2645 add rd, pc, #low(label-.-8)"
2646 add rd, rd, #high(label-.-8)" */
2648 skip_whitespace (str);
2650 if (reg_required_here (& str, 12) == FAIL
2651 || skip_past_comma (& str) == FAIL
2652 || my_get_expression (& inst.reloc.exp, & str))
2655 inst.error = BAD_ARGS;
2661 /* Frag hacking will turn this into a sub instruction if the offset turns
2662 out to be negative. */
2663 inst.reloc.type = BFD_RELOC_ARM_ADRL_IMMEDIATE;
2664 inst.reloc.exp.X_add_number -= 8; /* PC relative adjust */
2665 inst.reloc.pc_rel = 1;
2666 inst.instruction |= flags;
2667 inst.size = INSN_SIZE * 2;
2675 unsigned long flags;
2677 skip_whitespace (str);
2679 if (reg_required_here (&str, 16) == FAIL)
2682 inst.error = BAD_ARGS;
2686 if (skip_past_comma (&str) == FAIL
2687 || data_op2 (&str) == FAIL)
2690 inst.error = BAD_ARGS;
2694 inst.instruction |= flags;
2695 if ((flags & 0x0000f000) == 0)
2696 inst.instruction |= CONDS_BIT;
2705 unsigned long flags;
2707 skip_whitespace (str);
2709 if (reg_required_here (&str, 12) == FAIL)
2712 inst.error = BAD_ARGS;
2716 if (skip_past_comma (&str) == FAIL
2717 || data_op2 (&str) == FAIL)
2720 inst.error = BAD_ARGS;
2724 inst.instruction |= flags;
2730 ldst_extend (str, hwse)
2741 if (my_get_expression (& inst.reloc.exp, str))
2744 if (inst.reloc.exp.X_op == O_constant)
2746 int value = inst.reloc.exp.X_add_number;
2748 if ((hwse && (value < -255 || value > 255))
2749 || (value < -4095 || value > 4095))
2751 inst.error = _("address offset too large");
2761 /* Halfword and signextension instructions have the
2762 immediate value split across bits 11..8 and bits 3..0 */
2764 inst.instruction |= add | HWOFFSET_IMM | ((value >> 4) << 8) | (value & 0xF);
2766 inst.instruction |= add | value;
2772 inst.instruction |= HWOFFSET_IMM;
2773 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
2776 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
2777 inst.reloc.pc_rel = 0;
2782 add = 0; /* and fall through */
2784 (*str)++; /* and fall through */
2786 if (reg_required_here (str, 0) == FAIL)
2790 inst.instruction |= add;
2793 inst.instruction |= add | OFFSET_REG;
2794 if (skip_past_comma (str) == SUCCESS)
2795 return decode_shift (str, SHIFT_RESTRICT);
2803 do_ldst (str, flags)
2805 unsigned long flags;
2812 /* This is not ideal, but it is the simplest way of dealing with the
2813 ARM7T halfword instructions (since they use a different
2814 encoding, but the same mnemonic): */
2815 halfword = (flags & 0x80000000) != 0;
2818 /* This is actually a load/store of a halfword, or a
2819 signed-extension load */
2820 if ((cpu_variant & ARM_HALFWORD) == 0)
2823 = _("Processor does not support halfwords or signed bytes");
2827 inst.instruction = (inst.instruction & COND_MASK)
2828 | (flags & ~COND_MASK);
2833 skip_whitespace (str);
2835 if ((conflict_reg = reg_required_here (& str, 12)) == FAIL)
2838 inst.error = BAD_ARGS;
2842 if (skip_past_comma (& str) == FAIL)
2844 inst.error = _("Address expected");
2854 skip_whitespace (str);
2856 if ((reg = reg_required_here (&str, 16)) == FAIL)
2859 /* Conflicts can occur on stores as well as loads. */
2860 conflict_reg = (conflict_reg == reg);
2862 skip_whitespace (str);
2868 if (skip_past_comma (&str) == SUCCESS)
2870 /* [Rn],... (post inc) */
2871 if (ldst_extend (&str, halfword) == FAIL)
2874 as_warn (_("%s register same as write-back base"),
2875 (inst.instruction & LOAD_BIT) ? _("destination") : _("source") );
2881 inst.instruction |= HWOFFSET_IMM;
2883 skip_whitespace (str);
2888 as_warn (_("%s register same as write-back base"),
2889 (inst.instruction & LOAD_BIT) ? _("destination") : _("source") );
2891 inst.instruction |= WRITE_BACK;
2895 if (! (flags & TRANS_BIT))
2902 if (skip_past_comma (&str) == FAIL)
2904 inst.error = _("pre-indexed expression expected");
2909 if (ldst_extend (&str, halfword) == FAIL)
2912 skip_whitespace (str);
2916 inst.error = _("missing ]");
2920 skip_whitespace (str);
2925 as_warn (_("%s register same as write-back base"),
2926 (inst.instruction & LOAD_BIT) ? _("destination") : _("source") );
2928 inst.instruction |= WRITE_BACK;
2932 else if (*str == '=')
2934 /* Parse an "ldr Rd, =expr" instruction; this is another pseudo op */
2937 skip_whitespace (str);
2939 if (my_get_expression (&inst.reloc.exp, &str))
2942 if (inst.reloc.exp.X_op != O_constant
2943 && inst.reloc.exp.X_op != O_symbol)
2945 inst.error = _("Constant expression expected");
2949 if (inst.reloc.exp.X_op == O_constant
2950 && (value = validate_immediate(inst.reloc.exp.X_add_number)) != FAIL)
2952 /* This can be done with a mov instruction */
2953 inst.instruction &= LITERAL_MASK;
2954 inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
2955 inst.instruction |= (flags & COND_MASK) | (value & 0xfff);
2961 /* Insert into literal pool */
2962 if (add_to_lit_pool () == FAIL)
2965 inst.error = _("literal pool insertion failed");
2969 /* Change the instruction exp to point to the pool */
2972 inst.instruction |= HWOFFSET_IMM;
2973 inst.reloc.type = BFD_RELOC_ARM_HWLITERAL;
2976 inst.reloc.type = BFD_RELOC_ARM_LITERAL;
2977 inst.reloc.pc_rel = 1;
2978 inst.instruction |= (REG_PC << 16);
2984 if (my_get_expression (&inst.reloc.exp, &str))
2989 inst.instruction |= HWOFFSET_IMM;
2990 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
2993 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
2994 inst.reloc.exp.X_add_number -= 8; /* PC rel adjust */
2995 inst.reloc.pc_rel = 1;
2996 inst.instruction |= (REG_PC << 16);
3000 if (pre_inc && (flags & TRANS_BIT))
3001 inst.error = _("Pre-increment instruction with translate");
3003 inst.instruction |= flags | (pre_inc ? PRE_INDEX : 0);
3016 /* We come back here if we get ranges concatenated by '+' or '|' */
3031 skip_whitespace (str);
3033 if ((reg = reg_required_here (& str, -1)) == FAIL)
3042 inst.error = _("Bad range in register list");
3046 for (i = cur_reg + 1; i < reg; i++)
3048 if (range & (1 << i))
3050 (_("Warning: Duplicated register (r%d) in register list"),
3058 if (range & (1 << reg))
3059 as_tsktsk (_("Warning: Duplicated register (r%d) in register list"),
3061 else if (reg <= cur_reg)
3062 as_tsktsk (_("Warning: Register range not in ascending order"));
3066 } while (skip_past_comma (&str) != FAIL
3067 || (in_range = 1, *str++ == '-'));
3069 skip_whitespace (str);
3073 inst.error = _("Missing `}'");
3081 if (my_get_expression (&expr, &str))
3084 if (expr.X_op == O_constant)
3086 if (expr.X_add_number
3087 != (expr.X_add_number & 0x0000ffff))
3089 inst.error = _("invalid register mask");
3093 if ((range & expr.X_add_number) != 0)
3095 int regno = range & expr.X_add_number;
3098 regno = (1 << regno) - 1;
3100 (_("Warning: Duplicated register (r%d) in register list"),
3104 range |= expr.X_add_number;
3108 if (inst.reloc.type != 0)
3110 inst.error = _("expression too complex");
3114 memcpy (&inst.reloc.exp, &expr, sizeof (expressionS));
3115 inst.reloc.type = BFD_RELOC_ARM_MULTI;
3116 inst.reloc.pc_rel = 0;
3120 skip_whitespace (str);
3122 if (*str == '|' || *str == '+')
3127 } while (another_range);
3134 do_ldmstm (str, flags)
3136 unsigned long flags;
3141 skip_whitespace (str);
3143 if ((base_reg = reg_required_here (&str, 16)) == FAIL)
3146 if (base_reg == REG_PC)
3148 inst.error = _("r15 not allowed as base register");
3152 skip_whitespace (str);
3156 flags |= WRITE_BACK;
3160 if (skip_past_comma (&str) == FAIL
3161 || (range = reg_list (&str)) == FAIL)
3164 inst.error = BAD_ARGS;
3171 flags |= LDM_TYPE_2_OR_3;
3174 inst.instruction |= flags | range;
3182 unsigned long flags;
3184 skip_whitespace (str);
3186 /* Allow optional leading '#'. */
3187 if (is_immediate_prefix (*str))
3190 if (my_get_expression (& inst.reloc.exp, & str))
3193 inst.reloc.type = BFD_RELOC_ARM_SWI;
3194 inst.reloc.pc_rel = 0;
3195 inst.instruction |= flags;
3203 do_swap (str, flags)
3205 unsigned long flags;
3209 skip_whitespace (str);
3211 if ((reg = reg_required_here (&str, 12)) == FAIL)
3216 inst.error = _("r15 not allowed in swap");
3220 if (skip_past_comma (&str) == FAIL
3221 || (reg = reg_required_here (&str, 0)) == FAIL)
3224 inst.error = BAD_ARGS;
3230 inst.error = _("r15 not allowed in swap");
3234 if (skip_past_comma (&str) == FAIL
3237 inst.error = BAD_ARGS;
3241 skip_whitespace (str);
3243 if ((reg = reg_required_here (&str, 16)) == FAIL)
3248 inst.error = BAD_PC;
3252 skip_whitespace (str);
3256 inst.error = _("missing ]");
3260 inst.instruction |= flags;
3266 do_branch (str, flags)
3268 unsigned long flags;
3270 if (my_get_expression (&inst.reloc.exp, &str))
3277 /* ScottB: February 5, 1998 */
3278 /* Check to see of PLT32 reloc required for the instruction. */
3280 /* arm_parse_reloc() works on input_line_pointer.
3281 We actually want to parse the operands to the branch instruction
3282 passed in 'str'. Save the input pointer and restore it later. */
3283 save_in = input_line_pointer;
3284 input_line_pointer = str;
3285 if (inst.reloc.exp.X_op == O_symbol
3287 && arm_parse_reloc () == BFD_RELOC_ARM_PLT32)
3289 inst.reloc.type = BFD_RELOC_ARM_PLT32;
3290 inst.reloc.pc_rel = 0;
3291 /* Modify str to point to after parsed operands, otherwise
3292 end_of_line() will complain about the (PLT) left in str. */
3293 str = input_line_pointer;
3297 inst.reloc.type = BFD_RELOC_ARM_PCREL_BRANCH;
3298 inst.reloc.pc_rel = 1;
3300 input_line_pointer = save_in;
3303 inst.reloc.type = BFD_RELOC_ARM_PCREL_BRANCH;
3304 inst.reloc.pc_rel = 1;
3305 #endif /* OBJ_ELF */
3314 unsigned long flags;
3318 skip_whitespace (str);
3320 if ((reg = reg_required_here (&str, 0)) == FAIL)
3324 as_tsktsk (_("Use of r15 in bx has undefined behaviour"));
3333 unsigned long flags;
3335 /* Co-processor data operation.
3336 Format: CDP{cond} CP#,<expr>,CRd,CRn,CRm{,<expr>} */
3337 skip_whitespace (str);
3339 if (co_proc_number (&str) == FAIL)
3342 inst.error = BAD_ARGS;
3346 if (skip_past_comma (&str) == FAIL
3347 || cp_opc_expr (&str, 20,4) == FAIL)
3350 inst.error = BAD_ARGS;
3354 if (skip_past_comma (&str) == FAIL
3355 || cp_reg_required_here (&str, 12) == FAIL)
3358 inst.error = BAD_ARGS;
3362 if (skip_past_comma (&str) == FAIL
3363 || cp_reg_required_here (&str, 16) == FAIL)
3366 inst.error = BAD_ARGS;
3370 if (skip_past_comma (&str) == FAIL
3371 || cp_reg_required_here (&str, 0) == FAIL)
3374 inst.error = BAD_ARGS;
3378 if (skip_past_comma (&str) == SUCCESS)
3380 if (cp_opc_expr (&str, 5, 3) == FAIL)
3383 inst.error = BAD_ARGS;
3393 do_lstc (str, flags)
3395 unsigned long flags;
3397 /* Co-processor register load/store.
3398 Format: <LDC|STC{cond}[L] CP#,CRd,<address> */
3400 skip_whitespace (str);
3402 if (co_proc_number (&str) == FAIL)
3405 inst.error = BAD_ARGS;
3409 if (skip_past_comma (&str) == FAIL
3410 || cp_reg_required_here (&str, 12) == FAIL)
3413 inst.error = BAD_ARGS;
3417 if (skip_past_comma (&str) == FAIL
3418 || cp_address_required_here (&str) == FAIL)
3421 inst.error = BAD_ARGS;
3425 inst.instruction |= flags;
3431 do_co_reg (str, flags)
3433 unsigned long flags;
3435 /* Co-processor register transfer.
3436 Format: <MCR|MRC>{cond} CP#,<expr1>,Rd,CRn,CRm{,<expr2>} */
3438 skip_whitespace (str);
3440 if (co_proc_number (&str) == FAIL)
3443 inst.error = BAD_ARGS;
3447 if (skip_past_comma (&str) == FAIL
3448 || cp_opc_expr (&str, 21, 3) == FAIL)
3451 inst.error = BAD_ARGS;
3455 if (skip_past_comma (&str) == FAIL
3456 || reg_required_here (&str, 12) == FAIL)
3459 inst.error = BAD_ARGS;
3463 if (skip_past_comma (&str) == FAIL
3464 || cp_reg_required_here (&str, 16) == FAIL)
3467 inst.error = BAD_ARGS;
3471 if (skip_past_comma (&str) == FAIL
3472 || cp_reg_required_here (&str, 0) == FAIL)
3475 inst.error = BAD_ARGS;
3479 if (skip_past_comma (&str) == SUCCESS)
3481 if (cp_opc_expr (&str, 5, 3) == FAIL)
3484 inst.error = BAD_ARGS;
3494 do_fp_ctrl (str, flags)
3496 unsigned long flags;
3498 /* FP control registers.
3499 Format: <WFS|RFS|WFC|RFC>{cond} Rn */
3501 skip_whitespace (str);
3503 if (reg_required_here (&str, 12) == FAIL)
3506 inst.error = BAD_ARGS;
3515 do_fp_ldst (str, flags)
3517 unsigned long flags;
3519 skip_whitespace (str);
3521 switch (inst.suffix)
3526 inst.instruction |= CP_T_X;
3529 inst.instruction |= CP_T_Y;
3532 inst.instruction |= CP_T_X | CP_T_Y;
3538 if (fp_reg_required_here (&str, 12) == FAIL)
3541 inst.error = BAD_ARGS;
3545 if (skip_past_comma (&str) == FAIL
3546 || cp_address_required_here (&str) == FAIL)
3549 inst.error = BAD_ARGS;
3557 do_fp_ldmstm (str, flags)
3559 unsigned long flags;
3563 skip_whitespace (str);
3565 if (fp_reg_required_here (&str, 12) == FAIL)
3568 inst.error = BAD_ARGS;
3572 /* Get Number of registers to transfer */
3573 if (skip_past_comma (&str) == FAIL
3574 || my_get_expression (&inst.reloc.exp, &str))
3577 inst.error = _("constant expression expected");
3581 if (inst.reloc.exp.X_op != O_constant)
3583 inst.error = _("Constant value required for number of registers");
3587 num_regs = inst.reloc.exp.X_add_number;
3589 if (num_regs < 1 || num_regs > 4)
3591 inst.error = _("number of registers must be in the range [1:4]");
3598 inst.instruction |= CP_T_X;
3601 inst.instruction |= CP_T_Y;
3604 inst.instruction |= CP_T_Y | CP_T_X;
3618 /* The instruction specified "ea" or "fd", so we can only accept
3619 [Rn]{!}. The instruction does not really support stacking or
3620 unstacking, so we have to emulate these by setting appropriate
3621 bits and offsets. */
3622 if (skip_past_comma (&str) == FAIL
3626 inst.error = BAD_ARGS;
3631 skip_whitespace (str);
3633 if ((reg = reg_required_here (&str, 16)) == FAIL)
3636 skip_whitespace (str);
3640 inst.error = BAD_ARGS;
3651 inst.error = _("R15 not allowed as base register with write-back");
3658 if (flags & CP_T_Pre)
3661 offset = 3 * num_regs;
3667 /* Post-increment */
3671 offset = 3 * num_regs;
3675 /* No write-back, so convert this into a standard pre-increment
3676 instruction -- aesthetically more pleasing. */
3677 flags = CP_T_Pre | CP_T_UD;
3682 inst.instruction |= flags | offset;
3684 else if (skip_past_comma (&str) == FAIL
3685 || cp_address_required_here (&str) == FAIL)
3688 inst.error = BAD_ARGS;
3696 do_fp_dyadic (str, flags)
3698 unsigned long flags;
3700 skip_whitespace (str);
3702 switch (inst.suffix)
3707 inst.instruction |= 0x00000080;
3710 inst.instruction |= 0x00080000;
3716 if (fp_reg_required_here (&str, 12) == FAIL)
3719 inst.error = BAD_ARGS;
3723 if (skip_past_comma (&str) == FAIL
3724 || fp_reg_required_here (&str, 16) == FAIL)
3727 inst.error = BAD_ARGS;
3731 if (skip_past_comma (&str) == FAIL
3732 || fp_op2 (&str) == FAIL)
3735 inst.error = BAD_ARGS;
3739 inst.instruction |= flags;
3745 do_fp_monadic (str, flags)
3747 unsigned long flags;
3749 skip_whitespace (str);
3751 switch (inst.suffix)
3756 inst.instruction |= 0x00000080;
3759 inst.instruction |= 0x00080000;
3765 if (fp_reg_required_here (&str, 12) == FAIL)
3768 inst.error = BAD_ARGS;
3772 if (skip_past_comma (&str) == FAIL
3773 || fp_op2 (&str) == FAIL)
3776 inst.error = BAD_ARGS;
3780 inst.instruction |= flags;
3786 do_fp_cmp (str, flags)
3788 unsigned long flags;
3790 skip_whitespace (str);
3792 if (fp_reg_required_here (&str, 16) == FAIL)
3795 inst.error = BAD_ARGS;
3799 if (skip_past_comma (&str) == FAIL
3800 || fp_op2 (&str) == FAIL)
3803 inst.error = BAD_ARGS;
3807 inst.instruction |= flags;
3813 do_fp_from_reg (str, flags)
3815 unsigned long flags;
3817 skip_whitespace (str);
3819 switch (inst.suffix)
3824 inst.instruction |= 0x00000080;
3827 inst.instruction |= 0x00080000;
3833 if (fp_reg_required_here (&str, 16) == FAIL)
3836 inst.error = BAD_ARGS;
3840 if (skip_past_comma (&str) == FAIL
3841 || reg_required_here (&str, 12) == FAIL)
3844 inst.error = BAD_ARGS;
3848 inst.instruction |= flags;
3854 do_fp_to_reg (str, flags)
3856 unsigned long flags;
3858 skip_whitespace (str);
3860 if (reg_required_here (&str, 12) == FAIL)
3863 if (skip_past_comma (&str) == FAIL
3864 || fp_reg_required_here (&str, 0) == FAIL)
3867 inst.error = BAD_ARGS;
3871 inst.instruction |= flags;
3876 /* Thumb specific routines */
3878 /* Parse and validate that a register is of the right form, this saves
3879 repeated checking of this information in many similar cases.
3880 Unlike the 32-bit case we do not insert the register into the opcode
3881 here, since the position is often unknown until the full instruction
3884 thumb_reg (strp, hi_lo)
3890 if ((reg = reg_required_here (strp, -1)) == FAIL)
3898 inst.error = _("lo register required");
3906 inst.error = _("hi register required");
3918 /* Parse an add or subtract instruction, SUBTRACT is non-zero if the opcode
3921 thumb_add_sub (str, subtract)
3925 int Rd, Rs, Rn = FAIL;
3927 skip_whitespace (str);
3929 if ((Rd = thumb_reg (&str, THUMB_REG_ANY)) == FAIL
3930 || skip_past_comma (&str) == FAIL)
3933 inst.error = BAD_ARGS;
3937 if (is_immediate_prefix (*str))
3941 if (my_get_expression (&inst.reloc.exp, &str))
3946 if ((Rs = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
3949 if (skip_past_comma (&str) == FAIL)
3951 /* Two operand format, shuffle the registers and pretend there
3956 else if (is_immediate_prefix (*str))
3959 if (my_get_expression (&inst.reloc.exp, &str))
3962 else if ((Rn = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
3966 /* We now have Rd and Rs set to registers, and Rn set to a register or FAIL;
3967 for the latter case, EXPR contains the immediate that was found. */
3970 /* All register format. */
3971 if (Rd > 7 || Rs > 7 || Rn > 7)
3975 inst.error = _("dest and source1 must be the same register");
3979 /* Can't do this for SUB */
3982 inst.error = _("subtract valid only on lo regs");
3986 inst.instruction = (T_OPCODE_ADD_HI
3987 | (Rd > 7 ? THUMB_H1 : 0)
3988 | (Rn > 7 ? THUMB_H2 : 0));
3989 inst.instruction |= (Rd & 7) | ((Rn & 7) << 3);
3993 inst.instruction = subtract ? T_OPCODE_SUB_R3 : T_OPCODE_ADD_R3;
3994 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
3999 /* Immediate expression, now things start to get nasty. */
4001 /* First deal with HI regs, only very restricted cases allowed:
4002 Adjusting SP, and using PC or SP to get an address. */
4003 if ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
4004 || (Rs > 7 && Rs != REG_SP && Rs != REG_PC))
4006 inst.error = _("invalid Hi register with immediate");
4010 if (inst.reloc.exp.X_op != O_constant)
4012 /* Value isn't known yet, all we can do is store all the fragments
4013 we know about in the instruction and let the reloc hacking
4015 inst.instruction = (subtract ? 0x8000 : 0) | (Rd << 4) | Rs;
4016 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
4020 int offset = inst.reloc.exp.X_add_number;
4030 /* Quick check, in case offset is MIN_INT */
4033 inst.error = _("immediate value out of range");
4042 if (offset & ~0x1fc)
4044 inst.error = _("invalid immediate value for stack adjust");
4047 inst.instruction = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
4048 inst.instruction |= offset >> 2;
4050 else if (Rs == REG_PC || Rs == REG_SP)
4053 || (offset & ~0x3fc))
4055 inst.error = _("invalid immediate for address calculation");
4058 inst.instruction = (Rs == REG_PC ? T_OPCODE_ADD_PC
4060 inst.instruction |= (Rd << 8) | (offset >> 2);
4066 inst.error = _("immediate value out of range");
4069 inst.instruction = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
4070 inst.instruction |= (Rd << 8) | offset;
4076 inst.error = _("immediate value out of range");
4079 inst.instruction = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
4080 inst.instruction |= Rd | (Rs << 3) | (offset << 6);
4088 thumb_shift (str, shift)
4092 int Rd, Rs, Rn = FAIL;
4094 skip_whitespace (str);
4096 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4097 || skip_past_comma (&str) == FAIL)
4100 inst.error = BAD_ARGS;
4104 if (is_immediate_prefix (*str))
4106 /* Two operand immediate format, set Rs to Rd. */
4109 if (my_get_expression (&inst.reloc.exp, &str))
4114 if ((Rs = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4117 if (skip_past_comma (&str) == FAIL)
4119 /* Two operand format, shuffle the registers and pretend there
4124 else if (is_immediate_prefix (*str))
4127 if (my_get_expression (&inst.reloc.exp, &str))
4130 else if ((Rn = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4134 /* We now have Rd and Rs set to registers, and Rn set to a register or FAIL;
4135 for the latter case, EXPR contains the immediate that was found. */
4141 inst.error = _("source1 and dest must be same register");
4147 case THUMB_ASR: inst.instruction = T_OPCODE_ASR_R; break;
4148 case THUMB_LSL: inst.instruction = T_OPCODE_LSL_R; break;
4149 case THUMB_LSR: inst.instruction = T_OPCODE_LSR_R; break;
4152 inst.instruction |= Rd | (Rn << 3);
4158 case THUMB_ASR: inst.instruction = T_OPCODE_ASR_I; break;
4159 case THUMB_LSL: inst.instruction = T_OPCODE_LSL_I; break;
4160 case THUMB_LSR: inst.instruction = T_OPCODE_LSR_I; break;
4163 if (inst.reloc.exp.X_op != O_constant)
4165 /* Value isn't known yet, create a dummy reloc and let reloc
4166 hacking fix it up */
4168 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
4172 unsigned shift_value = inst.reloc.exp.X_add_number;
4174 if (shift_value > 32 || (shift_value == 32 && shift == THUMB_LSL))
4176 inst.error = _("Invalid immediate for shift");
4180 /* Shifts of zero are handled by converting to LSL */
4181 if (shift_value == 0)
4182 inst.instruction = T_OPCODE_LSL_I;
4184 /* Shifts of 32 are encoded as a shift of zero */
4185 if (shift_value == 32)
4188 inst.instruction |= shift_value << 6;
4191 inst.instruction |= Rd | (Rs << 3);
4197 thumb_mov_compare (str, move)
4203 skip_whitespace (str);
4205 if ((Rd = thumb_reg (&str, THUMB_REG_ANY)) == FAIL
4206 || skip_past_comma (&str) == FAIL)
4209 inst.error = BAD_ARGS;
4213 if (is_immediate_prefix (*str))
4216 if (my_get_expression (&inst.reloc.exp, &str))
4219 else if ((Rs = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4224 if (Rs < 8 && Rd < 8)
4226 if (move == THUMB_MOVE)
4227 /* A move of two lowregs is encoded as ADD Rd, Rs, #0
4228 since a MOV instruction produces unpredictable results */
4229 inst.instruction = T_OPCODE_ADD_I3;
4231 inst.instruction = T_OPCODE_CMP_LR;
4232 inst.instruction |= Rd | (Rs << 3);
4236 if (move == THUMB_MOVE)
4237 inst.instruction = T_OPCODE_MOV_HR;
4239 inst.instruction = T_OPCODE_CMP_HR;
4242 inst.instruction |= THUMB_H1;
4245 inst.instruction |= THUMB_H2;
4247 inst.instruction |= (Rd & 7) | ((Rs & 7) << 3);
4254 inst.error = _("only lo regs allowed with immediate");
4258 if (move == THUMB_MOVE)
4259 inst.instruction = T_OPCODE_MOV_I8;
4261 inst.instruction = T_OPCODE_CMP_I8;
4263 inst.instruction |= Rd << 8;
4265 if (inst.reloc.exp.X_op != O_constant)
4266 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
4269 unsigned value = inst.reloc.exp.X_add_number;
4273 inst.error = _("invalid immediate");
4277 inst.instruction |= value;
4285 thumb_load_store (str, load_store, size)
4290 int Rd, Rb, Ro = FAIL;
4292 skip_whitespace (str);
4294 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4295 || skip_past_comma (&str) == FAIL)
4298 inst.error = BAD_ARGS;
4305 if ((Rb = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4308 if (skip_past_comma (&str) != FAIL)
4310 if (is_immediate_prefix (*str))
4313 if (my_get_expression (&inst.reloc.exp, &str))
4316 else if ((Ro = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4321 inst.reloc.exp.X_op = O_constant;
4322 inst.reloc.exp.X_add_number = 0;
4327 inst.error = _("expected ']'");
4332 else if (*str == '=')
4334 /* Parse an "ldr Rd, =expr" instruction; this is another pseudo op */
4337 skip_whitespace (str);
4339 if (my_get_expression (& inst.reloc.exp, & str))
4344 if ( inst.reloc.exp.X_op != O_constant
4345 && inst.reloc.exp.X_op != O_symbol)
4347 inst.error = "Constant expression expected";
4351 if (inst.reloc.exp.X_op == O_constant
4352 && ((inst.reloc.exp.X_add_number & ~0xFF) == 0))
4354 /* This can be done with a mov instruction */
4356 inst.instruction = T_OPCODE_MOV_I8 | (Rd << 8);
4357 inst.instruction |= inst.reloc.exp.X_add_number;
4361 /* Insert into literal pool */
4362 if (add_to_lit_pool () == FAIL)
4365 inst.error = "literal pool insertion failed";
4369 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4370 inst.reloc.pc_rel = 1;
4371 inst.instruction = T_OPCODE_LDR_PC | (Rd << 8);
4372 inst.reloc.exp.X_add_number += 4; /* Adjust ARM pipeline offset to Thumb */
4378 if (my_get_expression (&inst.reloc.exp, &str))
4381 inst.instruction = T_OPCODE_LDR_PC | (Rd << 8);
4382 inst.reloc.pc_rel = 1;
4383 inst.reloc.exp.X_add_number -= 4; /* Pipeline offset */
4384 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4389 if (Rb == REG_PC || Rb == REG_SP)
4391 if (size != THUMB_WORD)
4393 inst.error = _("byte or halfword not valid for base register");
4396 else if (Rb == REG_PC && load_store != THUMB_LOAD)
4398 inst.error = _("R15 based store not allowed");
4401 else if (Ro != FAIL)
4403 inst.error = _("Invalid base register for register offset");
4408 inst.instruction = T_OPCODE_LDR_PC;
4409 else if (load_store == THUMB_LOAD)
4410 inst.instruction = T_OPCODE_LDR_SP;
4412 inst.instruction = T_OPCODE_STR_SP;
4414 inst.instruction |= Rd << 8;
4415 if (inst.reloc.exp.X_op == O_constant)
4417 unsigned offset = inst.reloc.exp.X_add_number;
4419 if (offset & ~0x3fc)
4421 inst.error = _("invalid offset");
4425 inst.instruction |= offset >> 2;
4428 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4432 inst.error = _("invalid base register in load/store");
4435 else if (Ro == FAIL)
4437 /* Immediate offset */
4438 if (size == THUMB_WORD)
4439 inst.instruction = (load_store == THUMB_LOAD
4440 ? T_OPCODE_LDR_IW : T_OPCODE_STR_IW);
4441 else if (size == THUMB_HALFWORD)
4442 inst.instruction = (load_store == THUMB_LOAD
4443 ? T_OPCODE_LDR_IH : T_OPCODE_STR_IH);
4445 inst.instruction = (load_store == THUMB_LOAD
4446 ? T_OPCODE_LDR_IB : T_OPCODE_STR_IB);
4448 inst.instruction |= Rd | (Rb << 3);
4450 if (inst.reloc.exp.X_op == O_constant)
4452 unsigned offset = inst.reloc.exp.X_add_number;
4454 if (offset & ~(0x1f << size))
4456 inst.error = _("Invalid offset");
4459 inst.instruction |= (offset >> size) << 6;
4462 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4466 /* Register offset */
4467 if (size == THUMB_WORD)
4468 inst.instruction = (load_store == THUMB_LOAD
4469 ? T_OPCODE_LDR_RW : T_OPCODE_STR_RW);
4470 else if (size == THUMB_HALFWORD)
4471 inst.instruction = (load_store == THUMB_LOAD
4472 ? T_OPCODE_LDR_RH : T_OPCODE_STR_RH);
4474 inst.instruction = (load_store == THUMB_LOAD
4475 ? T_OPCODE_LDR_RB : T_OPCODE_STR_RB);
4477 inst.instruction |= Rd | (Rb << 3) | (Ro << 6);
4492 /* Handle the Format 4 instructions that do not have equivalents in other
4493 formats. That is, ADC, AND, EOR, SBC, ROR, TST, NEG, CMN, ORR, MUL,
4501 skip_whitespace (str);
4503 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4506 if (skip_past_comma (&str) == FAIL
4507 || (Rs = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4510 inst.error = BAD_ARGS;
4514 if (skip_past_comma (&str) != FAIL)
4516 /* Three operand format not allowed for TST, CMN, NEG and MVN.
4517 (It isn't allowed for CMP either, but that isn't handled by this
4519 if (inst.instruction == T_OPCODE_TST
4520 || inst.instruction == T_OPCODE_CMN
4521 || inst.instruction == T_OPCODE_NEG
4522 || inst.instruction == T_OPCODE_MVN)
4524 inst.error = BAD_ARGS;
4528 if ((Rn = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4533 inst.error = _("dest and source1 one must be the same register");
4539 if (inst.instruction == T_OPCODE_MUL
4541 as_tsktsk (_("Rs and Rd must be different in MUL"));
4543 inst.instruction |= Rd | (Rs << 3);
4551 thumb_add_sub (str, 0);
4558 thumb_shift (str, THUMB_ASR);
4565 if (my_get_expression (&inst.reloc.exp, &str))
4567 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH9;
4568 inst.reloc.pc_rel = 1;
4576 if (my_get_expression (&inst.reloc.exp, &str))
4578 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH12;
4579 inst.reloc.pc_rel = 1;
4583 /* Find the real, Thumb encoded start of a Thumb function. */
4586 find_real_start (symbolP)
4590 const char * name = S_GET_NAME (symbolP);
4591 symbolS * new_target;
4593 /* This definiton must agree with the one in gcc/config/arm/thumb.c */
4594 #define STUB_NAME ".real_start_of"
4599 /* Names that start with '.' are local labels, not function entry points.
4600 The compiler may generate BL instructions to these labels because it
4601 needs to perform a branch to a far away location. */
4605 real_start = malloc (strlen (name) + strlen (STUB_NAME) + 1);
4606 sprintf (real_start, "%s%s", STUB_NAME, name);
4608 new_target = symbol_find (real_start);
4610 if (new_target == NULL)
4612 as_warn ("Failed to find real start of function: %s\n", name);
4613 new_target = symbolP;
4626 if (my_get_expression (& inst.reloc.exp, & str))
4629 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
4630 inst.reloc.pc_rel = 1;
4633 /* If the destination of the branch is a defined symbol which does not have
4634 the THUMB_FUNC attribute, then we must be calling a function which has
4635 the (interfacearm) attribute. We look for the Thumb entry point to that
4636 function and change the branch to refer to that function instead. */
4637 if ( inst.reloc.exp.X_op == O_symbol
4638 && inst.reloc.exp.X_add_symbol != NULL
4639 && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
4640 && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
4641 inst.reloc.exp.X_add_symbol = find_real_start (inst.reloc.exp.X_add_symbol);
4650 skip_whitespace (str);
4652 if ((reg = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4655 /* This sets THUMB_H2 from the top bit of reg. */
4656 inst.instruction |= reg << 3;
4658 /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC. The reloc
4659 should cause the alignment to be checked once it is known. This is
4660 because BX PC only works if the instruction is word aligned. */
4669 thumb_mov_compare (str, THUMB_COMPARE);
4679 skip_whitespace (str);
4681 if ((Rb = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4685 as_warn (_("Inserted missing '!': load/store multiple always writes back base register"));
4689 if (skip_past_comma (&str) == FAIL
4690 || (range = reg_list (&str)) == FAIL)
4693 inst.error = BAD_ARGS;
4697 if (inst.reloc.type != BFD_RELOC_NONE)
4699 /* This really doesn't seem worth it. */
4700 inst.reloc.type = BFD_RELOC_NONE;
4701 inst.error = _("Expression too complex");
4707 inst.error = _("only lo-regs valid in load/store multiple");
4711 inst.instruction |= (Rb << 8) | range;
4719 thumb_load_store (str, THUMB_LOAD, THUMB_WORD);
4726 thumb_load_store (str, THUMB_LOAD, THUMB_BYTE);
4733 thumb_load_store (str, THUMB_LOAD, THUMB_HALFWORD);
4742 skip_whitespace (str);
4744 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4745 || skip_past_comma (&str) == FAIL
4747 || (Rb = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4748 || skip_past_comma (&str) == FAIL
4749 || (Ro = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4753 inst.error = _("Syntax: ldrs[b] Rd, [Rb, Ro]");
4757 inst.instruction |= Rd | (Rb << 3) | (Ro << 6);
4765 thumb_shift (str, THUMB_LSL);
4772 thumb_shift (str, THUMB_LSR);
4779 thumb_mov_compare (str, THUMB_MOVE);
4788 skip_whitespace (str);
4790 if ((range = reg_list (&str)) == FAIL)
4793 inst.error = BAD_ARGS;
4797 if (inst.reloc.type != BFD_RELOC_NONE)
4799 /* This really doesn't seem worth it. */
4800 inst.reloc.type = BFD_RELOC_NONE;
4801 inst.error = _("Expression too complex");
4807 if ((inst.instruction == T_OPCODE_PUSH
4808 && (range & ~0xff) == 1 << REG_LR)
4809 || (inst.instruction == T_OPCODE_POP
4810 && (range & ~0xff) == 1 << REG_PC))
4812 inst.instruction |= THUMB_PP_PC_LR;
4817 inst.error = _("invalid register list to push/pop instruction");
4822 inst.instruction |= range;
4830 thumb_load_store (str, THUMB_STORE, THUMB_WORD);
4837 thumb_load_store (str, THUMB_STORE, THUMB_BYTE);
4844 thumb_load_store (str, THUMB_STORE, THUMB_HALFWORD);
4851 thumb_add_sub (str, 1);
4858 skip_whitespace (str);
4860 if (my_get_expression (&inst.reloc.exp, &str))
4863 inst.reloc.type = BFD_RELOC_ARM_SWI;
4872 /* This is a pseudo-op of the form "adr rd, label" to be converted
4873 into a relative address of the form "add rd, pc, #label-.-4" */
4874 skip_whitespace (str);
4876 if (reg_required_here (&str, 4) == FAIL /* Store Rd in temporary location inside instruction. */
4877 || skip_past_comma (&str) == FAIL
4878 || my_get_expression (&inst.reloc.exp, &str))
4881 inst.error = BAD_ARGS;
4885 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
4886 inst.reloc.exp.X_add_number -= 4; /* PC relative adjust */
4887 inst.reloc.pc_rel = 1;
4888 inst.instruction |= REG_PC; /* Rd is already placed into the instruction */
4896 int len = strlen (reg_table[entry].name) + 2;
4897 char * buf = (char *) xmalloc (len);
4898 char * buf2 = (char *) xmalloc (len);
4901 #ifdef REGISTER_PREFIX
4902 buf[i++] = REGISTER_PREFIX;
4905 strcpy (buf + i, reg_table[entry].name);
4907 for (i = 0; buf[i]; i++)
4908 buf2[i] = islower (buf[i]) ? toupper (buf[i]) : buf[i];
4912 hash_insert (arm_reg_hsh, buf, (PTR) ®_table[entry]);
4913 hash_insert (arm_reg_hsh, buf2, (PTR) ®_table[entry]);
4917 insert_reg_alias (str, regnum)
4921 struct reg_entry *new =
4922 (struct reg_entry *)xmalloc (sizeof (struct reg_entry));
4923 char *name = xmalloc (strlen (str) + 1);
4927 new->number = regnum;
4929 hash_insert (arm_reg_hsh, name, (PTR) new);
4933 set_constant_flonums ()
4937 for (i = 0; i < NUM_FLOAT_VALS; i++)
4938 if (atof_ieee ((char *)fp_const[i], 'x', fp_values[i]) == NULL)
4947 if ( (arm_ops_hsh = hash_new ()) == NULL
4948 || (arm_tops_hsh = hash_new ()) == NULL
4949 || (arm_cond_hsh = hash_new ()) == NULL
4950 || (arm_shift_hsh = hash_new ()) == NULL
4951 || (arm_reg_hsh = hash_new ()) == NULL
4952 || (arm_psr_hsh = hash_new ()) == NULL)
4953 as_fatal (_("Virtual memory exhausted"));
4955 for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
4956 hash_insert (arm_ops_hsh, insns[i].template, (PTR) (insns + i));
4957 for (i = 0; i < sizeof (tinsns) / sizeof (struct thumb_opcode); i++)
4958 hash_insert (arm_tops_hsh, tinsns[i].template, (PTR) (tinsns + i));
4959 for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
4960 hash_insert (arm_cond_hsh, conds[i].template, (PTR) (conds + i));
4961 for (i = 0; i < sizeof (shift) / sizeof (struct asm_shift); i++)
4962 hash_insert (arm_shift_hsh, shift[i].template, (PTR) (shift + i));
4963 for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
4964 hash_insert (arm_psr_hsh, psrs[i].template, (PTR) (psrs + i));
4966 for (i = 0; reg_table[i].name; i++)
4969 set_constant_flonums ();
4971 #if defined OBJ_COFF || defined OBJ_ELF
4973 unsigned int flags = 0;
4975 /* Set the flags in the private structure */
4976 if (uses_apcs_26) flags |= F_APCS26;
4977 if (support_interwork) flags |= F_INTERWORK;
4978 if (uses_apcs_float) flags |= F_APCS_FLOAT;
4979 if (pic_code) flags |= F_PIC;
4980 if ((cpu_variant & FPU_ALL) == FPU_NONE) flags |= F_SOFT_FLOAT;
4982 bfd_set_private_flags (stdoutput, flags);
4989 /* Record the CPU type as well */
4990 switch (cpu_variant & ARM_CPU_MASK)
4993 mach = bfd_mach_arm_2;
4996 case ARM_3: /* also ARM_250 */
4997 mach = bfd_mach_arm_2a;
5001 case ARM_6 | ARM_3 | ARM_2: /* Actually no CPU type defined */
5002 mach = bfd_mach_arm_4;
5005 case ARM_7: /* also ARM_6 */
5006 mach = bfd_mach_arm_3;
5010 /* Catch special cases. */
5011 if (cpu_variant != (FPU_DEFAULT | CPU_DEFAULT))
5013 if (cpu_variant & (ARM_EXT_V5 & ARM_THUMB))
5014 mach = bfd_mach_arm_5T;
5015 else if (cpu_variant & ARM_EXT_V5)
5016 mach = bfd_mach_arm_5;
5017 else if (cpu_variant & ARM_THUMB)
5018 mach = bfd_mach_arm_4T;
5019 else if ((cpu_variant & ARM_ARCH_V4) == ARM_ARCH_V4)
5020 mach = bfd_mach_arm_4;
5021 else if (cpu_variant & ARM_LONGMUL)
5022 mach = bfd_mach_arm_3M;
5025 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
5029 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
5030 for use in the a.out file, and stores them in the array pointed to by buf.
5031 This knows about the endian-ness of the target machine and does
5032 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
5033 2 (short) and 4 (long) Floating numbers are put out as a series of
5034 LITTLENUMS (shorts, here at least). */
5036 md_number_to_chars (buf, val, n)
5041 if (target_big_endian)
5042 number_to_chars_bigendian (buf, val, n);
5044 number_to_chars_littleendian (buf, val, n);
5048 md_chars_to_number (buf, n)
5053 unsigned char * where = (unsigned char *) buf;
5055 if (target_big_endian)
5060 result |= (*where++ & 255);
5068 result |= (where[n] & 255);
5075 /* Turn a string in input_line_pointer into a floating point constant
5076 of type TYPE, and store the appropriate bytes in *litP. The number
5077 of LITTLENUMS emitted is stored in *sizeP . An error message is
5078 returned, or NULL on OK.
5080 Note that fp constants aren't represent in the normal way on the ARM.
5081 In big endian mode, things are as expected. However, in little endian
5082 mode fp constants are big-endian word-wise, and little-endian byte-wise
5083 within the words. For example, (double) 1.1 in big endian mode is
5084 the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
5085 the byte sequence 99 99 f1 3f 9a 99 99 99.
5087 ??? The format of 12 byte floats is uncertain according to gcc's arm.h. */
5090 md_atof (type, litP, sizeP)
5096 LITTLENUM_TYPE words[MAX_LITTLENUMS];
5128 return _("Bad call to MD_ATOF()");
5131 t = atof_ieee (input_line_pointer, type, words);
5133 input_line_pointer = t;
5136 if (target_big_endian)
5138 for (i = 0; i < prec; i++)
5140 md_number_to_chars (litP, (valueT) words[i], 2);
5146 /* For a 4 byte float the order of elements in `words' is 1 0. For an
5147 8 byte float the order is 1 0 3 2. */
5148 for (i = 0; i < prec; i += 2)
5150 md_number_to_chars (litP, (valueT) words[i + 1], 2);
5151 md_number_to_chars (litP + 2, (valueT) words[i], 2);
5159 /* The knowledge of the PC's pipeline offset is built into the insns themselves. */
5161 md_pcrel_from (fixP)
5165 && S_GET_SEGMENT (fixP->fx_addsy) == undefined_section
5166 && fixP->fx_subsy == NULL)
5169 if (fixP->fx_pcrel && (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_ADD))
5171 /* PC relative addressing on the Thumb is slightly odd
5172 as the bottom two bits of the PC are forced to zero
5173 for the calculation. */
5174 return (fixP->fx_where + fixP->fx_frag->fr_address) & ~3;
5177 return fixP->fx_where + fixP->fx_frag->fr_address;
5180 /* Round up a section size to the appropriate boundary. */
5182 md_section_align (segment, size)
5189 /* Round all sects to multiple of 4 */
5190 return (size + 3) & ~3;
5194 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE. Otherwise
5195 we have no need to default values of symbols. */
5199 md_undefined_symbol (name)
5203 if (name[0] == '_' && name[1] == 'G'
5204 && streq (name, GLOBAL_OFFSET_TABLE_NAME))
5208 if (symbol_find (name))
5209 as_bad ("GOT already in the symbol table");
5211 GOT_symbol = symbol_new (name, undefined_section,
5212 (valueT)0, & zero_address_frag);
5222 /* arm_reg_parse () := if it looks like a register, return its token and
5223 advance the pointer. */
5227 register char ** ccp;
5229 char * start = * ccp;
5232 struct reg_entry * reg;
5234 #ifdef REGISTER_PREFIX
5235 if (*start != REGISTER_PREFIX)
5240 #ifdef OPTIONAL_REGISTER_PREFIX
5241 if (*p == OPTIONAL_REGISTER_PREFIX)
5245 if (!isalpha (*p) || !is_name_beginner (*p))
5249 while (isalpha (c) || isdigit (c) || c == '_')
5253 reg = (struct reg_entry *) hash_find (arm_reg_hsh, start);
5267 register char ** ccp;
5269 char * start = * ccp;
5272 CONST struct asm_psr * psr;
5276 while (isalpha (c) || c == '_')
5280 psr = (CONST struct asm_psr *) hash_find (arm_psr_hsh, start);
5293 md_apply_fix3 (fixP, val, seg)
5298 offsetT value = * val;
5300 unsigned int newimm;
5303 char * buf = fixP->fx_where + fixP->fx_frag->fr_literal;
5304 arm_fix_data * arm_data = (arm_fix_data *) fixP->tc_fix_data;
5306 assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
5308 /* Note whether this will delete the relocation. */
5309 #if 0 /* patch from REarnshaw to JDavis (disabled for the moment, since it doesn't work fully) */
5310 if ((fixP->fx_addsy == 0 || symbol_constant_p (fixP->fx_addsy))
5313 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
5317 /* If this symbol is in a different section then we need to leave it for
5318 the linker to deal with. Unfortunately, md_pcrel_from can't tell,
5319 so we have to undo it's effects here. */
5322 if (fixP->fx_addsy != NULL
5323 && S_IS_DEFINED (fixP->fx_addsy)
5324 && S_GET_SEGMENT (fixP->fx_addsy) != seg)
5327 && fixP->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH)
5330 value += md_pcrel_from (fixP);
5334 fixP->fx_addnumber = value; /* Remember value for emit_reloc. */
5336 switch (fixP->fx_r_type)
5338 case BFD_RELOC_ARM_IMMEDIATE:
5339 newimm = validate_immediate (value);
5340 temp = md_chars_to_number (buf, INSN_SIZE);
5342 /* If the instruction will fail, see if we can fix things up by
5343 changing the opcode. */
5344 if (newimm == (unsigned int) FAIL
5345 && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
5347 as_bad_where (fixP->fx_file, fixP->fx_line,
5348 _("invalid constant (%lx) after fixup"),
5349 (unsigned long) value);
5353 newimm |= (temp & 0xfffff000);
5354 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
5357 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
5359 unsigned int highpart = 0;
5360 unsigned int newinsn = 0xe1a00000; /* nop */
5361 newimm = validate_immediate (value);
5362 temp = md_chars_to_number (buf, INSN_SIZE);
5364 /* If the instruction will fail, see if we can fix things up by
5365 changing the opcode. */
5366 if (newimm == (unsigned int) FAIL
5367 && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
5369 /* No ? OK - try using two ADD instructions to generate the value. */
5370 newimm = validate_immediate_twopart (value, & highpart);
5372 /* Yes - then make sure that the second instruction is also an add. */
5373 if (newimm != (unsigned int) FAIL)
5375 /* Still No ? Try using a negated value. */
5376 else if (validate_immediate_twopart (- value, & highpart) != (unsigned int) FAIL)
5377 temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
5378 /* Otherwise - give up. */
5381 as_bad_where (fixP->fx_file, fixP->fx_line,
5382 _("Unable to compute ADRL instructions for PC offset of 0x%x"), value);
5386 /* Replace the first operand in the 2nd instruction (which is the PC)
5387 with the destination register. We have already added in the PC in the
5388 first instruction and we do not want to do it again. */
5389 newinsn &= ~ 0xf0000;
5390 newinsn |= ((newinsn & 0x0f000) << 4);
5393 newimm |= (temp & 0xfffff000);
5394 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
5396 highpart |= (newinsn & 0xfffff000);
5397 md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
5401 case BFD_RELOC_ARM_OFFSET_IMM:
5407 if (validate_offset_imm (value, 0) == FAIL)
5409 as_bad_where (fixP->fx_file, fixP->fx_line,
5410 _("bad immediate value for offset (%ld)"), (long) value);
5414 newval = md_chars_to_number (buf, INSN_SIZE);
5415 newval &= 0xff7ff000;
5416 newval |= value | (sign ? INDEX_UP : 0);
5417 md_number_to_chars (buf, newval, INSN_SIZE);
5420 case BFD_RELOC_ARM_OFFSET_IMM8:
5421 case BFD_RELOC_ARM_HWLITERAL:
5427 if (validate_offset_imm (value, 1) == FAIL)
5429 if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
5430 as_bad_where (fixP->fx_file, fixP->fx_line,
5431 _("invalid literal constant: pool needs to be closer"));
5433 as_bad (_("bad immediate value for half-word offset (%ld)"),
5438 newval = md_chars_to_number (buf, INSN_SIZE);
5439 newval &= 0xff7ff0f0;
5440 newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
5441 md_number_to_chars (buf, newval, INSN_SIZE);
5444 case BFD_RELOC_ARM_LITERAL:
5450 if (validate_offset_imm (value, 0) == FAIL)
5452 as_bad_where (fixP->fx_file, fixP->fx_line,
5453 _("invalid literal constant: pool needs to be closer"));
5457 newval = md_chars_to_number (buf, INSN_SIZE);
5458 newval &= 0xff7ff000;
5459 newval |= value | (sign ? INDEX_UP : 0);
5460 md_number_to_chars (buf, newval, INSN_SIZE);
5463 case BFD_RELOC_ARM_SHIFT_IMM:
5464 newval = md_chars_to_number (buf, INSN_SIZE);
5465 if (((unsigned long) value) > 32
5467 && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
5469 as_bad_where (fixP->fx_file, fixP->fx_line,
5470 _("shift expression is too large"));
5475 newval &= ~0x60; /* Shifts of zero must be done as lsl */
5476 else if (value == 32)
5478 newval &= 0xfffff07f;
5479 newval |= (value & 0x1f) << 7;
5480 md_number_to_chars (buf, newval , INSN_SIZE);
5483 case BFD_RELOC_ARM_SWI:
5484 if (arm_data->thumb_mode)
5486 if (((unsigned long) value) > 0xff)
5487 as_bad_where (fixP->fx_file, fixP->fx_line,
5488 _("Invalid swi expression"));
5489 newval = md_chars_to_number (buf, THUMB_SIZE) & 0xff00;
5491 md_number_to_chars (buf, newval, THUMB_SIZE);
5495 if (((unsigned long) value) > 0x00ffffff)
5496 as_bad_where (fixP->fx_file, fixP->fx_line,
5497 _("Invalid swi expression"));
5498 newval = md_chars_to_number (buf, INSN_SIZE) & 0xff000000;
5500 md_number_to_chars (buf, newval , INSN_SIZE);
5504 case BFD_RELOC_ARM_MULTI:
5505 if (((unsigned long) value) > 0xffff)
5506 as_bad_where (fixP->fx_file, fixP->fx_line,
5507 _("Invalid expression in load/store multiple"));
5508 newval = value | md_chars_to_number (buf, INSN_SIZE);
5509 md_number_to_chars (buf, newval, INSN_SIZE);
5512 case BFD_RELOC_ARM_PCREL_BRANCH:
5513 newval = md_chars_to_number (buf, INSN_SIZE);
5517 value = fixP->fx_offset;
5519 value = (value >> 2) & 0x00ffffff;
5520 value = (value + (newval & 0x00ffffff)) & 0x00ffffff;
5521 newval = value | (newval & 0xff000000);
5522 md_number_to_chars (buf, newval, INSN_SIZE);
5525 case BFD_RELOC_THUMB_PCREL_BRANCH9: /* conditional branch */
5526 newval = md_chars_to_number (buf, THUMB_SIZE);
5528 addressT diff = (newval & 0xff) << 1;
5533 if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
5534 as_bad_where (fixP->fx_file, fixP->fx_line,
5535 _("Branch out of range"));
5536 newval = (newval & 0xff00) | ((value & 0x1ff) >> 1);
5538 md_number_to_chars (buf, newval, THUMB_SIZE);
5541 case BFD_RELOC_THUMB_PCREL_BRANCH12: /* unconditional branch */
5542 newval = md_chars_to_number (buf, THUMB_SIZE);
5544 addressT diff = (newval & 0x7ff) << 1;
5549 if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
5550 as_bad_where (fixP->fx_file, fixP->fx_line,
5551 _("Branch out of range"));
5552 newval = (newval & 0xf800) | ((value & 0xfff) >> 1);
5554 md_number_to_chars (buf, newval, THUMB_SIZE);
5557 case BFD_RELOC_THUMB_PCREL_BRANCH23:
5562 newval = md_chars_to_number (buf, THUMB_SIZE);
5563 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
5564 diff = ((newval & 0x7ff) << 12) | ((newval2 & 0x7ff) << 1);
5565 if (diff & 0x400000)
5568 value = fixP->fx_offset;
5571 if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
5572 as_bad_where (fixP->fx_file, fixP->fx_line,
5573 _("Branch with link out of range"));
5575 newval = (newval & 0xf800) | ((value & 0x7fffff) >> 12);
5576 newval2 = (newval2 & 0xf800) | ((value & 0xfff) >> 1);
5577 md_number_to_chars (buf, newval, THUMB_SIZE);
5578 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
5583 if (fixP->fx_done || fixP->fx_pcrel)
5584 md_number_to_chars (buf, value, 1);
5586 else if (!target_oabi)
5588 value = fixP->fx_offset;
5589 md_number_to_chars (buf, value, 1);
5595 if (fixP->fx_done || fixP->fx_pcrel)
5596 md_number_to_chars (buf, value, 2);
5598 else if (!target_oabi)
5600 value = fixP->fx_offset;
5601 md_number_to_chars (buf, value, 2);
5607 case BFD_RELOC_ARM_GOT32:
5608 case BFD_RELOC_ARM_GOTOFF:
5609 md_number_to_chars (buf, 0, 4);
5615 if (fixP->fx_done || fixP->fx_pcrel)
5616 md_number_to_chars (buf, value, 4);
5618 else if (!target_oabi)
5620 value = fixP->fx_offset;
5621 md_number_to_chars (buf, value, 4);
5627 case BFD_RELOC_ARM_PLT32:
5628 /* It appears the instruction is fully prepared at this point. */
5632 case BFD_RELOC_ARM_GOTPC:
5633 md_number_to_chars (buf, value, 4);
5636 case BFD_RELOC_ARM_CP_OFF_IMM:
5638 if (value < -1023 || value > 1023 || (value & 3))
5639 as_bad_where (fixP->fx_file, fixP->fx_line,
5640 _("Illegal value for co-processor offset"));
5643 newval = md_chars_to_number (buf, INSN_SIZE) & 0xff7fff00;
5644 newval |= (value >> 2) | (sign ? INDEX_UP : 0);
5645 md_number_to_chars (buf, newval , INSN_SIZE);
5648 case BFD_RELOC_ARM_THUMB_OFFSET:
5649 newval = md_chars_to_number (buf, THUMB_SIZE);
5650 /* Exactly what ranges, and where the offset is inserted depends on
5651 the type of instruction, we can establish this from the top 4 bits */
5652 switch (newval >> 12)
5654 case 4: /* PC load */
5655 /* Thumb PC loads are somewhat odd, bit 1 of the PC is
5656 forced to zero for these loads, so we will need to round
5657 up the offset if the instruction address is not word
5658 aligned (since the final address produced must be, and
5659 we can only describe word-aligned immediate offsets). */
5661 if ((fixP->fx_frag->fr_address + fixP->fx_where + value) & 3)
5662 as_bad_where (fixP->fx_file, fixP->fx_line,
5663 _("Invalid offset, target not word aligned (0x%08X)"),
5664 (unsigned int)(fixP->fx_frag->fr_address + fixP->fx_where + value));
5666 if ((value + 2) & ~0x3fe)
5667 as_bad_where (fixP->fx_file, fixP->fx_line,
5668 _("Invalid offset, value too big (0x%08X)"), value);
5670 /* Round up, since pc will be rounded down. */
5671 newval |= (value + 2) >> 2;
5674 case 9: /* SP load/store */
5676 as_bad_where (fixP->fx_file, fixP->fx_line,
5677 _("Invalid offset, value too big (0x%08X)"), value);
5678 newval |= value >> 2;
5681 case 6: /* Word load/store */
5683 as_bad_where (fixP->fx_file, fixP->fx_line,
5684 _("Invalid offset, value too big (0x%08X)"), value);
5685 newval |= value << 4; /* 6 - 2 */
5688 case 7: /* Byte load/store */
5690 as_bad_where (fixP->fx_file, fixP->fx_line,
5691 _("Invalid offset, value too big (0x%08X)"), value);
5692 newval |= value << 6;
5695 case 8: /* Halfword load/store */
5697 as_bad_where (fixP->fx_file, fixP->fx_line,
5698 _("Invalid offset, value too big (0x%08X)"), value);
5699 newval |= value << 5; /* 6 - 1 */
5703 as_bad_where (fixP->fx_file, fixP->fx_line,
5704 "Unable to process relocation for thumb opcode: %lx",
5705 (unsigned long) newval);
5708 md_number_to_chars (buf, newval, THUMB_SIZE);
5711 case BFD_RELOC_ARM_THUMB_ADD:
5712 /* This is a complicated relocation, since we use it for all of
5713 the following immediate relocations:
5716 9bit ADD/SUB SP word-aligned
5717 10bit ADD PC/SP word-aligned
5719 The type of instruction being processed is encoded in the
5725 newval = md_chars_to_number (buf, THUMB_SIZE);
5727 int rd = (newval >> 4) & 0xf;
5728 int rs = newval & 0xf;
5729 int subtract = newval & 0x8000;
5734 as_bad_where (fixP->fx_file, fixP->fx_line,
5735 _("Invalid immediate for stack address calculation"));
5736 newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
5737 newval |= value >> 2;
5739 else if (rs == REG_PC || rs == REG_SP)
5743 as_bad_where (fixP->fx_file, fixP->fx_line,
5744 _("Invalid immediate for address calculation (value = 0x%08lX)"),
5745 (unsigned long) value);
5746 newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
5748 newval |= value >> 2;
5753 as_bad_where (fixP->fx_file, fixP->fx_line,
5754 _("Invalid 8bit immediate"));
5755 newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
5756 newval |= (rd << 8) | value;
5761 as_bad_where (fixP->fx_file, fixP->fx_line,
5762 _("Invalid 3bit immediate"));
5763 newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
5764 newval |= rd | (rs << 3) | (value << 6);
5767 md_number_to_chars (buf, newval , THUMB_SIZE);
5770 case BFD_RELOC_ARM_THUMB_IMM:
5771 newval = md_chars_to_number (buf, THUMB_SIZE);
5772 switch (newval >> 11)
5774 case 0x04: /* 8bit immediate MOV */
5775 case 0x05: /* 8bit immediate CMP */
5776 if (value < 0 || value > 255)
5777 as_bad_where (fixP->fx_file, fixP->fx_line,
5778 _("Invalid immediate: %ld is too large"),
5786 md_number_to_chars (buf, newval , THUMB_SIZE);
5789 case BFD_RELOC_ARM_THUMB_SHIFT:
5790 /* 5bit shift value (0..31) */
5791 if (value < 0 || value > 31)
5792 as_bad_where (fixP->fx_file, fixP->fx_line,
5793 _("Illegal Thumb shift value: %ld"), (long) value);
5794 newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf03f;
5795 newval |= value << 6;
5796 md_number_to_chars (buf, newval , THUMB_SIZE);
5799 case BFD_RELOC_VTABLE_INHERIT:
5800 case BFD_RELOC_VTABLE_ENTRY:
5804 case BFD_RELOC_NONE:
5806 as_bad_where (fixP->fx_file, fixP->fx_line,
5807 _("Bad relocation fixup type (%d)"), fixP->fx_r_type);
5813 /* Translate internal representation of relocation info to BFD target
5816 tc_gen_reloc (section, fixp)
5821 bfd_reloc_code_real_type code;
5823 reloc = (arelent *) xmalloc (sizeof (arelent));
5825 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
5826 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
5827 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
5829 /* @@ Why fx_addnumber sometimes and fx_offset other times? */
5831 if (fixp->fx_pcrel == 0)
5832 reloc->addend = fixp->fx_offset;
5834 reloc->addend = fixp->fx_offset = reloc->address;
5836 reloc->addend = fixp->fx_offset;
5839 switch (fixp->fx_r_type)
5844 code = BFD_RELOC_8_PCREL;
5851 code = BFD_RELOC_16_PCREL;
5858 code = BFD_RELOC_32_PCREL;
5862 case BFD_RELOC_ARM_PCREL_BRANCH:
5864 case BFD_RELOC_THUMB_PCREL_BRANCH9:
5865 case BFD_RELOC_THUMB_PCREL_BRANCH12:
5866 case BFD_RELOC_THUMB_PCREL_BRANCH23:
5867 case BFD_RELOC_VTABLE_ENTRY:
5868 case BFD_RELOC_VTABLE_INHERIT:
5869 code = fixp->fx_r_type;
5872 case BFD_RELOC_ARM_LITERAL:
5873 case BFD_RELOC_ARM_HWLITERAL:
5874 /* If this is called then the a literal has been referenced across
5875 a section boundary - possibly due to an implicit dump */
5876 as_bad_where (fixp->fx_file, fixp->fx_line,
5877 _("Literal referenced across section boundary (Implicit dump?)"));
5881 case BFD_RELOC_ARM_GOT32:
5882 case BFD_RELOC_ARM_GOTOFF:
5883 case BFD_RELOC_ARM_PLT32:
5884 code = fixp->fx_r_type;
5888 case BFD_RELOC_ARM_IMMEDIATE:
5889 as_bad_where (fixp->fx_file, fixp->fx_line,
5890 _("Internal_relocation (type %d) not fixed up (IMMEDIATE)"),
5894 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
5895 as_bad_where (fixp->fx_file, fixp->fx_line,
5896 _("ADRL used for a symbol not defined in the same file"),
5900 case BFD_RELOC_ARM_OFFSET_IMM:
5901 as_bad_where (fixp->fx_file, fixp->fx_line,
5902 _("Internal_relocation (type %d) not fixed up (OFFSET_IMM)"),
5909 switch (fixp->fx_r_type)
5911 case BFD_RELOC_ARM_IMMEDIATE: type = "IMMEDIATE"; break;
5912 case BFD_RELOC_ARM_OFFSET_IMM: type = "OFFSET_IMM"; break;
5913 case BFD_RELOC_ARM_OFFSET_IMM8: type = "OFFSET_IMM8"; break;
5914 case BFD_RELOC_ARM_SHIFT_IMM: type = "SHIFT_IMM"; break;
5915 case BFD_RELOC_ARM_SWI: type = "SWI"; break;
5916 case BFD_RELOC_ARM_MULTI: type = "MULTI"; break;
5917 case BFD_RELOC_ARM_CP_OFF_IMM: type = "CP_OFF_IMM"; break;
5918 case BFD_RELOC_ARM_THUMB_ADD: type = "THUMB_ADD"; break;
5919 case BFD_RELOC_ARM_THUMB_SHIFT: type = "THUMB_SHIFT"; break;
5920 case BFD_RELOC_ARM_THUMB_IMM: type = "THUMB_IMM"; break;
5921 case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
5922 default: type = _("<unknown>"); break;
5924 as_bad_where (fixp->fx_file, fixp->fx_line,
5925 _("Can not represent %s relocation in this object file format (%d)"),
5926 type, fixp->fx_pcrel);
5932 if (code == BFD_RELOC_32_PCREL
5934 && fixp->fx_addsy == GOT_symbol)
5936 code = BFD_RELOC_ARM_GOTPC;
5937 reloc->addend = fixp->fx_offset = reloc->address;
5941 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
5943 if (reloc->howto == NULL)
5945 as_bad_where (fixp->fx_file, fixp->fx_line,
5946 _("Can not represent %s relocation in this object file format"),
5947 bfd_get_reloc_code_name (code));
5951 /* HACK: Since arm ELF uses Rel instead of Rela, encode the
5952 vtable entry to be used in the relocation's section offset. */
5953 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
5954 reloc->address = fixp->fx_offset;
5960 md_estimate_size_before_relax (fragP, segtype)
5964 as_fatal (_("md_estimate_size_before_relax\n"));
5969 output_inst PARAMS ((void))
5975 as_bad (inst.error);
5979 to = frag_more (inst.size);
5981 if (thumb_mode && (inst.size > THUMB_SIZE))
5983 assert (inst.size == (2 * THUMB_SIZE));
5984 md_number_to_chars (to, inst.instruction >> 16, THUMB_SIZE);
5985 md_number_to_chars (to + THUMB_SIZE, inst.instruction, THUMB_SIZE);
5987 else if (inst.size > INSN_SIZE)
5989 assert (inst.size == (2 * INSN_SIZE));
5990 md_number_to_chars (to, inst.instruction, INSN_SIZE);
5991 md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
5994 md_number_to_chars (to, inst.instruction, inst.size);
5996 if (inst.reloc.type != BFD_RELOC_NONE)
5997 fix_new_arm (frag_now, to - frag_now->fr_literal,
5998 inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
6013 /* Align the instruction.
6014 This may not be the right thing to do but ... */
6015 /* arm_align (2, 0); */
6016 listing_prev_line (); /* Defined in listing.h */
6018 /* Align the previous label if needed. */
6019 if (last_label_seen != NULL)
6021 symbol_set_frag (last_label_seen, frag_now);
6022 S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
6023 S_SET_SEGMENT (last_label_seen, now_seg);
6026 memset (&inst, '\0', sizeof (inst));
6027 inst.reloc.type = BFD_RELOC_NONE;
6029 skip_whitespace (str);
6031 /* Scan up to the end of the op-code, which must end in white space or
6033 for (start = p = str; *p != '\0'; p++)
6039 as_bad (_("No operator -- statement `%s'\n"), str);
6045 CONST struct thumb_opcode * opcode;
6049 opcode = (CONST struct thumb_opcode *) hash_find (arm_tops_hsh, str);
6054 inst.instruction = opcode->value;
6055 inst.size = opcode->size;
6056 (*opcode->parms)(p);
6063 CONST struct asm_opcode * opcode;
6065 inst.size = INSN_SIZE;
6066 /* p now points to the end of the opcode, probably white space, but we
6067 have to break the opcode up in case it contains condionals and flags;
6068 keep trying with progressively smaller basic instructions until one
6069 matches, or we run out of opcode. */
6070 q = (p - str > LONGEST_INST) ? str + LONGEST_INST : p;
6071 for (; q != str; q--)
6075 opcode = (CONST struct asm_opcode *) hash_find (arm_ops_hsh, str);
6078 if (opcode && opcode->template)
6080 unsigned long flag_bits = 0;
6083 /* Check that this instruction is supported for this CPU. */
6084 if ((opcode->variants & cpu_variant) == 0)
6087 inst.instruction = opcode->value;
6088 if (q == p) /* Just a simple opcode. */
6090 if (opcode->comp_suffix != 0)
6091 as_bad (_("Opcode `%s' must have suffix from <%s>\n"), str,
6092 opcode->comp_suffix);
6095 inst.instruction |= COND_ALWAYS;
6096 (*opcode->parms)(q, 0);
6102 /* Now check for a conditional. */
6106 CONST struct asm_cond *cond;
6110 cond = (CONST struct asm_cond *) hash_find (arm_cond_hsh, r);
6114 if (cond->value == 0xf0000000)
6116 _("Warning: Use of the 'nv' conditional is deprecated\n"));
6118 inst.instruction |= cond->value;
6122 inst.instruction |= COND_ALWAYS;
6125 inst.instruction |= COND_ALWAYS;
6127 /* If there is a compulsory suffix, it should come here, before
6128 any optional flags. */
6129 if (opcode->comp_suffix)
6131 CONST char *s = opcode->comp_suffix;
6143 as_bad (_("Opcode `%s' must have suffix from <%s>\n"), str,
6144 opcode->comp_suffix);
6151 /* The remainder, if any should now be flags for the instruction;
6152 Scan these checking each one found with the opcode. */
6156 CONST struct asm_flg *flag = opcode->flags;
6165 for (flagno = 0; flag[flagno].template; flagno++)
6167 if (streq (r, flag[flagno].template))
6169 flag_bits |= flag[flagno].set_bits;
6175 if (! flag[flagno].template)
6182 (*opcode->parms) (p, flag_bits);
6192 /* It wasn't an instruction, but it might be a register alias of the form
6195 skip_whitespace (q);
6200 if (*q && !strncmp (q, ".req ", 4))
6203 char * copy_of_str = str;
6207 skip_whitespace (q);
6209 for (r = q; *r != '\0'; r++)
6219 regnum = arm_reg_parse (& q);
6222 reg = arm_reg_parse (& str);
6227 insert_reg_alias (str, regnum);
6229 as_warn (_("register '%s' does not exist"), q);
6231 else if (regnum != FAIL)
6234 as_warn (_("ignoring redefinition of register alias '%s'"), copy_of_str );
6236 /* Do not warn about redefinitions to the same alias. */
6239 as_warn (_("ignoring redefinition of register alias '%s' to non-existant register '%s'"),
6243 as_warn (_("ignoring incomplete .req pseuso op"));
6250 as_bad (_("bad instruction `%s'"), start);
6255 * Invocation line includes a switch not recognized by the base assembler.
6256 * See if it's a processor-specific option. These are:
6257 * Cpu variants, the arm part is optional:
6258 * -m[arm]1 Currently not supported.
6259 * -m[arm]2, -m[arm]250 Arm 2 and Arm 250 processor
6260 * -m[arm]3 Arm 3 processor
6261 * -m[arm]6[xx], Arm 6 processors
6262 * -m[arm]7[xx][t][[d]m] Arm 7 processors
6263 * -m[arm]8[10] Arm 8 processors
6264 * -m[arm]9[20][tdmi] Arm 9 processors
6265 * -mstrongarm[110[0]] StrongARM processors
6266 * -m[arm]v[2345] Arm architecures
6267 * -mall All (except the ARM1)
6269 * -mfpa10, -mfpa11 FPA10 and 11 co-processor instructions
6270 * -mfpe-old (No float load/store multiples)
6271 * -mno-fpu Disable all floating point instructions
6272 * Run-time endian selection:
6273 * -EB big endian cpu
6274 * -EL little endian cpu
6275 * ARM Procedure Calling Standard:
6276 * -mapcs-32 32 bit APCS
6277 * -mapcs-26 26 bit APCS
6278 * -mapcs-float Pass floats in float regs
6279 * -mapcs-reentrant Position independent code
6280 * -mthumb-interwork Code supports Arm/Thumb interworking
6281 * -moabi Old ELF ABI
6284 CONST char * md_shortopts = "m:k";
6285 struct option md_longopts[] =
6287 #ifdef ARM_BI_ENDIAN
6288 #define OPTION_EB (OPTION_MD_BASE + 0)
6289 {"EB", no_argument, NULL, OPTION_EB},
6290 #define OPTION_EL (OPTION_MD_BASE + 1)
6291 {"EL", no_argument, NULL, OPTION_EL},
6293 #define OPTION_OABI (OPTION_MD_BASE +2)
6294 {"oabi", no_argument, NULL, OPTION_OABI},
6297 {NULL, no_argument, NULL, 0}
6299 size_t md_longopts_size = sizeof (md_longopts);
6302 md_parse_option (c, arg)
6310 #ifdef ARM_BI_ENDIAN
6312 target_big_endian = 1;
6315 target_big_endian = 0;
6323 if (streq (str, "fpa10"))
6324 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_FPA10;
6325 else if (streq (str, "fpa11"))
6326 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_FPA11;
6327 else if (streq (str, "fpe-old"))
6328 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_CORE;
6334 if (streq (str, "no-fpu"))
6335 cpu_variant &= ~FPU_ALL;
6340 if (streq (str, "oabi"))
6346 /* Limit assembler to generating only Thumb instructions: */
6347 if (streq (str, "thumb"))
6349 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_THUMB;
6350 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_NONE;
6353 else if (streq (str, "thumb-interwork"))
6355 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_THUMB | ARM_ARCH_V4;
6356 #if defined OBJ_COFF || defined OBJ_ELF
6357 support_interwork = true;
6365 if (streq (str, "all"))
6367 cpu_variant = ARM_ALL | FPU_ALL;
6370 #if defined OBJ_COFF || defined OBJ_ELF
6371 if (! strncmp (str, "apcs-", 5))
6373 /* GCC passes on all command line options starting "-mapcs-..."
6374 to us, so we must parse them here. */
6378 if (streq (str, "32"))
6380 uses_apcs_26 = false;
6383 else if (streq (str, "26"))
6385 uses_apcs_26 = true;
6388 else if (streq (str, "frame"))
6390 /* Stack frames are being generated - does not affect
6394 else if (streq (str, "stack-check"))
6396 /* Stack checking is being performed - does not affect
6397 linkage, but does require that the functions
6398 __rt_stkovf_split_small and __rt_stkovf_split_big be
6399 present in the final link. */
6403 else if (streq (str, "float"))
6405 /* Floating point arguments are being passed in the floating
6406 point registers. This does affect linking, since this
6407 version of the APCS is incompatible with the version that
6408 passes floating points in the integer registers. */
6410 uses_apcs_float = true;
6413 else if (streq (str, "reentrant"))
6415 /* Reentrant code has been generated. This does affect
6416 linking, since there is no point in linking reentrant/
6417 position independent code with absolute position code. */
6422 as_bad (_("Unrecognised APCS switch -m%s"), arg);
6426 /* Strip off optional "arm" */
6427 if (! strncmp (str, "arm", 3))
6433 if (streq (str, "1"))
6434 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_1;
6440 if (streq (str, "2"))
6441 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_2;
6442 else if (streq (str, "250"))
6443 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_250;
6449 if (streq (str, "3"))
6450 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_3;
6456 switch (strtol (str, NULL, 10))
6463 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_6;
6471 switch (strtol (str, & str, 10)) /* Eat the processor name */
6483 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_7;
6489 cpu_variant |= (ARM_THUMB | ARM_ARCH_V4);
6493 cpu_variant |= ARM_LONGMUL;
6496 case 'f': /* fe => fp enabled cpu. */
6502 case 'c': /* Left over from 710c processor name. */
6503 case 'd': /* Debug */
6504 case 'i': /* Embedded ICE */
6505 /* Included for completeness in ARM processor naming. */
6515 if (streq (str, "8") || streq (str, "810"))
6516 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_8 | ARM_ARCH_V4 | ARM_LONGMUL;
6522 if (streq (str, "9"))
6523 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB;
6524 else if (streq (str, "920"))
6525 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL;
6526 else if (streq (str, "920t"))
6527 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB;
6528 else if (streq (str, "9tdmi"))
6529 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB;
6535 if (streq (str, "strongarm")
6536 || streq (str, "strongarm110")
6537 || streq (str, "strongarm1100"))
6538 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_8 | ARM_ARCH_V4 | ARM_LONGMUL;
6544 /* Select variant based on architecture rather than processor */
6550 case 'a': cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_3; break;
6551 case 0: cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_2; break;
6552 default: as_bad (_("Invalid architecture variant -m%s"), arg); break;
6557 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_7;
6561 case 'm': cpu_variant |= ARM_LONGMUL; break;
6563 default: as_bad (_("Invalid architecture variant -m%s"), arg); break;
6568 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V4;
6572 case 't': cpu_variant |= ARM_THUMB; break;
6574 default: as_bad (_("Invalid architecture variant -m%s"), arg); break;
6579 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V5;
6583 case 't': cpu_variant |= ARM_THUMB; break;
6585 default: as_bad (_("Invalid architecture variant -m%s"), arg); break;
6590 as_bad (_("Invalid architecture variant -m%s"), arg);
6597 as_bad (_("Invalid processor variant -m%s"), arg);
6603 #if defined OBJ_ELF || defined OBJ_COFF
6622 ARM Specific Assembler Options:\n\
6623 -m[arm][<processor name>] select processor variant\n\
6624 -m[arm]v[2|2a|3|3m|4|4t|5]select architecture variant\n\
6625 -mthumb only allow Thumb instructions\n\
6626 -mthumb-interwork mark the assembled code as supporting interworking\n\
6627 -mall allow any instruction\n\
6628 -mfpa10, -mfpa11 select floating point architecture\n\
6629 -mfpe-old don't allow floating-point multiple instructions\n\
6630 -mno-fpu don't allow any floating-point instructions.\n"));
6633 -k generate PIC code.\n"));
6634 #if defined OBJ_COFF || defined OBJ_ELF
6637 -mapcs-32, -mapcs-26 specify which ARM Procedure Calling Standard to use\n"));
6640 -mapcs-float floating point args are passed in FP regs\n"));
6643 -mapcs-reentrant the code is position independent/reentrant\n"));
6648 -moabi support the old ELF ABI\n"));
6650 #ifdef ARM_BI_ENDIAN
6653 -EB assemble code for a big endian cpu\n\
6654 -EL assemble code for a little endian cpu\n"));
6658 /* We need to be able to fix up arbitrary expressions in some statements.
6659 This is so that we can handle symbols that are an arbitrary distance from
6660 the pc. The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
6661 which returns part of an address in a form which will be valid for
6662 a data instruction. We do this by pushing the expression into a symbol
6663 in the expr_section, and creating a fix for that. */
6666 fix_new_arm (frag, where, size, exp, pc_rel, reloc)
6675 arm_fix_data * arm_data;
6683 new_fix = fix_new_exp (frag, where, size, exp, pc_rel, reloc);
6687 new_fix = fix_new (frag, where, size, make_expr_symbol (exp), 0,
6692 /* Mark whether the fix is to a THUMB instruction, or an ARM instruction */
6693 arm_data = (arm_fix_data *) obstack_alloc (& notes, sizeof (arm_fix_data));
6694 new_fix->tc_fix_data = (PTR) arm_data;
6695 arm_data->thumb_mode = thumb_mode;
6701 /* This fix_new is called by cons via TC_CONS_FIX_NEW. */
6703 cons_fix_new_arm (frag, where, size, exp)
6709 bfd_reloc_code_real_type type;
6714 * @@ Should look at CPU word size.
6719 type = BFD_RELOC_16;
6723 type = BFD_RELOC_32;
6726 type = BFD_RELOC_64;
6730 fix_new_exp (frag, where, (int) size, exp, pcrel, type);
6733 /* A good place to do this, although this was probably not intended
6734 for this kind of use. We need to dump the literal pool before
6735 references are made to a null symbol pointer. */
6739 if (current_poolP == NULL)
6742 subseg_set (text_section, 0); /* Put it at the end of text section. */
6744 listing_prev_line ();
6748 arm_start_line_hook ()
6750 last_label_seen = NULL;
6754 arm_frob_label (sym)
6757 last_label_seen = sym;
6759 ARM_SET_THUMB (sym, thumb_mode);
6761 #if defined OBJ_COFF || defined OBJ_ELF
6762 ARM_SET_INTERWORK (sym, support_interwork);
6765 if (label_is_thumb_function_name)
6767 /* When the address of a Thumb function is taken the bottom
6768 bit of that address should be set. This will allow
6769 interworking between Arm and Thumb functions to work
6772 THUMB_SET_FUNC (sym, 1);
6774 label_is_thumb_function_name = false;
6778 /* Adjust the symbol table. This marks Thumb symbols as distinct from
6782 arm_adjust_symtab ()
6787 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
6789 if (ARM_IS_THUMB (sym))
6791 if (THUMB_IS_FUNC (sym))
6793 /* Mark the symbol as a Thumb function. */
6794 if ( S_GET_STORAGE_CLASS (sym) == C_STAT
6795 || S_GET_STORAGE_CLASS (sym) == C_LABEL) /* This can happen! */
6796 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
6798 else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
6799 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
6801 as_bad (_("%s: unexpected function type: %d"),
6802 S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
6804 else switch (S_GET_STORAGE_CLASS (sym))
6807 S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
6810 S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
6813 S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
6815 default: /* do nothing */
6820 if (ARM_IS_INTERWORK (sym))
6821 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
6826 elf_symbol_type * elf_sym;
6829 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
6831 if (ARM_IS_THUMB (sym))
6833 if (THUMB_IS_FUNC (sym))
6835 elf_sym = elf_symbol (symbol_get_bfdsym (sym));
6836 bind = ELF_ST_BIND (elf_sym);
6837 elf_sym->internal_elf_sym.st_info = ELF_ST_INFO (bind, STT_ARM_TFUNC);
6847 if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
6849 *input_line_pointer = '/';
6850 input_line_pointer += 5;
6851 *input_line_pointer = 0;
6859 arm_canonicalize_symbol_name (name)
6864 if (thumb_mode && (len = strlen (name)) > 5
6865 && streq (name + len - 5, "/data"))
6866 *(name + len - 5) = 0;
6872 arm_validate_fix (fixP)
6875 /* If the destination of the branch is a defined symbol which does not have
6876 the THUMB_FUNC attribute, then we must be calling a function which has
6877 the (interfacearm) attribute. We look for the Thumb entry point to that
6878 function and change the branch to refer to that function instead. */
6879 if ( fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
6880 && fixP->fx_addsy != NULL
6881 && S_IS_DEFINED (fixP->fx_addsy)
6882 && ! THUMB_IS_FUNC (fixP->fx_addsy))
6884 fixP->fx_addsy = find_real_start (fixP->fx_addsy);
6892 /* Relocations against Thumb function names must be left unadjusted,
6893 so that the linker can use this information to correctly set the
6894 bottom bit of their addresses. The MIPS version of this function
6895 also prevents relocations that are mips-16 specific, but I do not
6896 know why it does this.
6899 There is one other problem that ought to be addressed here, but
6900 which currently is not: Taking the address of a label (rather
6901 than a function) and then later jumping to that address. Such
6902 addresses also ought to have their bottom bit set (assuming that
6903 they reside in Thumb code), but at the moment they will not. */
6906 arm_fix_adjustable (fixP)
6909 if (fixP->fx_addsy == NULL)
6912 /* Prevent all adjustments to global symbols. */
6913 if (S_IS_EXTERN (fixP->fx_addsy))
6916 if (S_IS_WEAK (fixP->fx_addsy))
6919 if (THUMB_IS_FUNC (fixP->fx_addsy)
6920 && fixP->fx_subsy == NULL)
6923 /* We need the symbol name for the VTABLE entries */
6924 if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
6925 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
6932 elf32_arm_target_format ()
6934 if (target_big_endian)
6936 return "elf32-bigarm-oabi";
6938 return "elf32-bigarm";
6941 return "elf32-littlearm-oabi";
6943 return "elf32-littlearm";
6947 armelf_frob_symbol (symp, puntp)
6951 elf_frob_symbol (symp, puntp);
6955 arm_force_relocation (fixp)
6958 if ( fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
6959 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
6960 || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH
6961 || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23)
6967 static bfd_reloc_code_real_type
6977 bfd_reloc_code_real_type reloc;
6981 #define MAP(str,reloc) { str, sizeof (str)-1, reloc }
6982 MAP ("(got)", BFD_RELOC_ARM_GOT32),
6983 MAP ("(gotoff)", BFD_RELOC_ARM_GOTOFF),
6984 /* ScottB: Jan 30, 1998 */
6985 /* Added support for parsing "var(PLT)" branch instructions */
6986 /* generated by GCC for PLT relocs */
6987 MAP ("(plt)", BFD_RELOC_ARM_PLT32),
6988 { NULL, 0, BFD_RELOC_UNUSED }
6992 for (i = 0, ip = input_line_pointer;
6993 i < sizeof (id) && (isalnum (*ip) || ispunct (*ip));
6995 id[i] = tolower (*ip);
6997 for (i = 0; reloc_map[i].str; i++)
6998 if (strncmp (id, reloc_map[i].str, reloc_map[i].len) == 0)
7001 input_line_pointer += reloc_map[i].len;
7003 return reloc_map[i].reloc;
7007 s_arm_elf_cons (nbytes)
7012 #ifdef md_flush_pending_output
7013 md_flush_pending_output ();
7016 if (is_it_end_of_statement ())
7018 demand_empty_rest_of_line ();
7022 #ifdef md_cons_align
7023 md_cons_align (nbytes);
7028 bfd_reloc_code_real_type reloc;
7032 if (exp.X_op == O_symbol
7033 && * input_line_pointer == '('
7034 && (reloc = arm_parse_reloc()) != BFD_RELOC_UNUSED)
7036 reloc_howto_type * howto = bfd_reloc_type_lookup (stdoutput, reloc);
7037 int size = bfd_get_reloc_size (howto);
7040 as_bad ("%s relocations do not fit in %d bytes", howto->name, nbytes);
7043 register char * p = frag_more ((int) nbytes);
7044 int offset = nbytes - size;
7046 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size,
7051 emit_expr (& exp, (unsigned int) nbytes);
7053 while (*input_line_pointer++ == ',');
7055 input_line_pointer--; /* Put terminator back into stream. */
7056 demand_empty_rest_of_line ();
7059 #endif /* OBJ_ELF */