Home | History | Annotate | Download | only in config
      1 /* tc-hppa.c -- Assemble for the PA
      2    Copyright (C) 1989-2016 Free Software Foundation, Inc.
      3 
      4    This file is part of GAS, the GNU Assembler.
      5 
      6    GAS is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3, or (at your option)
      9    any later version.
     10 
     11    GAS is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with GAS; see the file COPYING.  If not, write to the Free
     18    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     19    02110-1301, USA.  */
     20 
     21 /* HP PA-RISC support was contributed by the Center for Software Science
     22    at the University of Utah.  */
     23 
     24 #include "as.h"
     25 #include "safe-ctype.h"
     26 #include "subsegs.h"
     27 #include "dw2gencfi.h"
     28 
     29 #include "bfd/libhppa.h"
     30 
     31 /* Be careful, this file includes data *declarations*.  */
     32 #include "opcode/hppa.h"
     33 
     34 #if defined (OBJ_ELF) && defined (OBJ_SOM)
     35 error only one of OBJ_ELF and OBJ_SOM can be defined
     36 #endif
     37 
     38 /* If we are using ELF, then we probably can support dwarf2 debug
     39    records.  Furthermore, if we are supporting dwarf2 debug records,
     40    then we want to use the assembler support for compact line numbers.  */
     41 #ifdef OBJ_ELF
     42 #include "dwarf2dbg.h"
     43 
     44 /* A "convenient" place to put object file dependencies which do
     45    not need to be seen outside of tc-hppa.c.  */
     46 
     47 /* Object file formats specify relocation types.  */
     48 typedef enum elf_hppa_reloc_type reloc_type;
     49 
     50 /* Object file formats specify BFD symbol types.  */
     51 typedef elf_symbol_type obj_symbol_type;
     52 #define symbol_arg_reloc_info(sym)\
     53   (((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.hppa_arg_reloc)
     54 
     55 #if TARGET_ARCH_SIZE == 64
     56 /* How to generate a relocation.  */
     57 #define hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
     58 #define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
     59 #else
     60 #define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
     61 #define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
     62 #endif
     63 
     64 /* ELF objects can have versions, but apparently do not have anywhere
     65    to store a copyright string.  */
     66 #define obj_version obj_elf_version
     67 #define obj_copyright obj_elf_version
     68 
     69 #define UNWIND_SECTION_NAME ".PARISC.unwind"
     70 #endif /* OBJ_ELF */
     71 
     72 #ifdef OBJ_SOM
     73 /* Names of various debugging spaces/subspaces.  */
     74 #define GDB_DEBUG_SPACE_NAME "$GDB_DEBUG$"
     75 #define GDB_STRINGS_SUBSPACE_NAME "$GDB_STRINGS$"
     76 #define GDB_SYMBOLS_SUBSPACE_NAME "$GDB_SYMBOLS$"
     77 #define UNWIND_SECTION_NAME "$UNWIND$"
     78 
     79 /* Object file formats specify relocation types.  */
     80 typedef int reloc_type;
     81 
     82 /* SOM objects can have both a version string and a copyright string.  */
     83 #define obj_version obj_som_version
     84 #define obj_copyright obj_som_copyright
     85 
     86 /* How to generate a relocation.  */
     87 #define hppa_gen_reloc_type hppa_som_gen_reloc_type
     88 
     89 /* Object file formats specify BFD symbol types.  */
     90 typedef som_symbol_type obj_symbol_type;
     91 #define symbol_arg_reloc_info(sym)\
     92   (((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.ap.hppa_arg_reloc)
     93 
     94 /* This apparently isn't in older versions of hpux reloc.h.  */
     95 #ifndef R_DLT_REL
     96 #define R_DLT_REL 0x78
     97 #endif
     98 
     99 #ifndef R_N0SEL
    100 #define R_N0SEL 0xd8
    101 #endif
    102 
    103 #ifndef R_N1SEL
    104 #define R_N1SEL 0xd9
    105 #endif
    106 #endif /* OBJ_SOM */
    107 
    108 #if TARGET_ARCH_SIZE == 64
    109 #define DEFAULT_LEVEL 25
    110 #else
    111 #define DEFAULT_LEVEL 10
    112 #endif
    113 
    114 /* Various structures and types used internally in tc-hppa.c.  */
    115 
    116 /* Unwind table and descriptor.  FIXME: Sync this with GDB version.  */
    117 
    118 struct unwind_desc
    119   {
    120     unsigned int cannot_unwind:1;
    121     unsigned int millicode:1;
    122     unsigned int millicode_save_rest:1;
    123     unsigned int region_desc:2;
    124     unsigned int save_sr:2;
    125     unsigned int entry_fr:4;
    126     unsigned int entry_gr:5;
    127     unsigned int args_stored:1;
    128     unsigned int call_fr:5;
    129     unsigned int call_gr:5;
    130     unsigned int save_sp:1;
    131     unsigned int save_rp:1;
    132     unsigned int save_rp_in_frame:1;
    133     unsigned int extn_ptr_defined:1;
    134     unsigned int cleanup_defined:1;
    135 
    136     unsigned int hpe_interrupt_marker:1;
    137     unsigned int hpux_interrupt_marker:1;
    138     unsigned int reserved:3;
    139     unsigned int frame_size:27;
    140   };
    141 
    142 /* We can't rely on compilers placing bitfields in any particular
    143    place, so use these macros when dumping unwind descriptors to
    144    object files.  */
    145 #define UNWIND_LOW32(U) \
    146   (((U)->cannot_unwind << 31)		\
    147    | ((U)->millicode << 30)		\
    148    | ((U)->millicode_save_rest << 29)	\
    149    | ((U)->region_desc << 27)		\
    150    | ((U)->save_sr << 25)		\
    151    | ((U)->entry_fr << 21)		\
    152    | ((U)->entry_gr << 16)		\
    153    | ((U)->args_stored << 15)		\
    154    | ((U)->call_fr << 10)		\
    155    | ((U)->call_gr << 5)		\
    156    | ((U)->save_sp << 4)		\
    157    | ((U)->save_rp << 3)		\
    158    | ((U)->save_rp_in_frame << 2)	\
    159    | ((U)->extn_ptr_defined << 1)	\
    160    | ((U)->cleanup_defined << 0))
    161 
    162 #define UNWIND_HIGH32(U) \
    163   (((U)->hpe_interrupt_marker << 31)	\
    164    | ((U)->hpux_interrupt_marker << 30)	\
    165    | ((U)->frame_size << 0))
    166 
    167 struct unwind_table
    168   {
    169     /* Starting and ending offsets of the region described by
    170        descriptor.  */
    171     unsigned int start_offset;
    172     unsigned int end_offset;
    173     struct unwind_desc descriptor;
    174   };
    175 
    176 /* This structure is used by the .callinfo, .enter, .leave pseudo-ops to
    177    control the entry and exit code they generate. It is also used in
    178    creation of the correct stack unwind descriptors.
    179 
    180    NOTE:  GAS does not support .enter and .leave for the generation of
    181    prologues and epilogues.  FIXME.
    182 
    183    The fields in structure roughly correspond to the arguments available on the
    184    .callinfo pseudo-op.  */
    185 
    186 struct call_info
    187   {
    188     /* The unwind descriptor being built.  */
    189     struct unwind_table ci_unwind;
    190 
    191     /* Name of this function.  */
    192     symbolS *start_symbol;
    193 
    194     /* (temporary) symbol used to mark the end of this function.  */
    195     symbolS *end_symbol;
    196 
    197     /* Next entry in the chain.  */
    198     struct call_info *ci_next;
    199   };
    200 
    201 /* Operand formats for FP instructions.   Note not all FP instructions
    202    allow all four formats to be used (for example fmpysub only allows
    203    SGL and DBL).  */
    204 typedef enum
    205   {
    206     SGL, DBL, ILLEGAL_FMT, QUAD, W, UW, DW, UDW, QW, UQW
    207   }
    208 fp_operand_format;
    209 
    210 /* This fully describes the symbol types which may be attached to
    211    an EXPORT or IMPORT directive.  Only SOM uses this formation
    212    (ELF has no need for it).  */
    213 typedef enum
    214   {
    215     SYMBOL_TYPE_UNKNOWN,
    216     SYMBOL_TYPE_ABSOLUTE,
    217     SYMBOL_TYPE_CODE,
    218     SYMBOL_TYPE_DATA,
    219     SYMBOL_TYPE_ENTRY,
    220     SYMBOL_TYPE_MILLICODE,
    221     SYMBOL_TYPE_PLABEL,
    222     SYMBOL_TYPE_PRI_PROG,
    223     SYMBOL_TYPE_SEC_PROG,
    224   }
    225 pa_symbol_type;
    226 
    227 /* This structure contains information needed to assemble
    228    individual instructions.  */
    229 struct pa_it
    230   {
    231     /* Holds the opcode after parsing by pa_ip.  */
    232     unsigned long opcode;
    233 
    234     /* Holds an expression associated with the current instruction.  */
    235     expressionS exp;
    236 
    237     /* Does this instruction use PC-relative addressing.  */
    238     int pcrel;
    239 
    240     /* Floating point formats for operand1 and operand2.  */
    241     fp_operand_format fpof1;
    242     fp_operand_format fpof2;
    243 
    244     /* Whether or not we saw a truncation request on an fcnv insn.  */
    245     int trunc;
    246 
    247     /* Holds the field selector for this instruction
    248        (for example L%, LR%, etc).  */
    249     long field_selector;
    250 
    251     /* Holds any argument relocation bits associated with this
    252        instruction.  (instruction should be some sort of call).  */
    253     unsigned int arg_reloc;
    254 
    255     /* The format specification for this instruction.  */
    256     int format;
    257 
    258     /* The relocation (if any) associated with this instruction.  */
    259     reloc_type reloc;
    260   };
    261 
    262 /* PA-89 floating point registers are arranged like this:
    263 
    264    +--------------+--------------+
    265    |   0 or 16L   |  16 or 16R   |
    266    +--------------+--------------+
    267    |   1 or 17L   |  17 or 17R   |
    268    +--------------+--------------+
    269    |              |              |
    270 
    271    .              .              .
    272    .              .              .
    273    .              .              .
    274 
    275    |              |              |
    276    +--------------+--------------+
    277    |  14 or 30L   |  30 or 30R   |
    278    +--------------+--------------+
    279    |  15 or 31L   |  31 or 31R   |
    280    +--------------+--------------+  */
    281 
    282 /* Additional information needed to build argument relocation stubs.  */
    283 struct call_desc
    284   {
    285     /* The argument relocation specification.  */
    286     unsigned int arg_reloc;
    287 
    288     /* Number of arguments.  */
    289     unsigned int arg_count;
    290   };
    291 
    292 #ifdef OBJ_SOM
    293 /* This structure defines an entry in the subspace dictionary
    294    chain.  */
    295 
    296 struct subspace_dictionary_chain
    297   {
    298     /* Nonzero if this space has been defined by the user code.  */
    299     unsigned int ssd_defined;
    300 
    301     /* Name of this subspace.  */
    302     char *ssd_name;
    303 
    304     /* GAS segment and subsegment associated with this subspace.  */
    305     asection *ssd_seg;
    306     int ssd_subseg;
    307 
    308     /* Next space in the subspace dictionary chain.  */
    309     struct subspace_dictionary_chain *ssd_next;
    310   };
    311 
    312 typedef struct subspace_dictionary_chain ssd_chain_struct;
    313 
    314 /* This structure defines an entry in the subspace dictionary
    315    chain.  */
    316 
    317 struct space_dictionary_chain
    318   {
    319     /* Nonzero if this space has been defined by the user code or
    320        as a default space.  */
    321     unsigned int sd_defined;
    322 
    323     /* Nonzero if this spaces has been defined by the user code.  */
    324     unsigned int sd_user_defined;
    325 
    326     /* The space number (or index).  */
    327     unsigned int sd_spnum;
    328 
    329     /* The name of this subspace.  */
    330     char *sd_name;
    331 
    332     /* GAS segment to which this subspace corresponds.  */
    333     asection *sd_seg;
    334 
    335     /* Current subsegment number being used.  */
    336     int sd_last_subseg;
    337 
    338     /* The chain of subspaces contained within this space.  */
    339     ssd_chain_struct *sd_subspaces;
    340 
    341     /* The next entry in the space dictionary chain.  */
    342     struct space_dictionary_chain *sd_next;
    343   };
    344 
    345 typedef struct space_dictionary_chain sd_chain_struct;
    346 
    347 /* This structure defines attributes of the default subspace
    348    dictionary entries.  */
    349 
    350 struct default_subspace_dict
    351   {
    352     /* Name of the subspace.  */
    353     const char *name;
    354 
    355     /* FIXME.  Is this still needed?  */
    356     char defined;
    357 
    358     /* Nonzero if this subspace is loadable.  */
    359     char loadable;
    360 
    361     /* Nonzero if this subspace contains only code.  */
    362     char code_only;
    363 
    364     /* Nonzero if this is a comdat subspace.  */
    365     char comdat;
    366 
    367     /* Nonzero if this is a common subspace.  */
    368     char common;
    369 
    370     /* Nonzero if this is a common subspace which allows symbols
    371        to be multiply defined.  */
    372     char dup_common;
    373 
    374     /* Nonzero if this subspace should be zero filled.  */
    375     char zero;
    376 
    377     /* Sort key for this subspace.  */
    378     unsigned char sort;
    379 
    380     /* Access control bits for this subspace.  Can represent RWX access
    381        as well as privilege level changes for gateways.  */
    382     int access;
    383 
    384     /* Index of containing space.  */
    385     int space_index;
    386 
    387     /* Alignment (in bytes) of this subspace.  */
    388     int alignment;
    389 
    390     /* Quadrant within space where this subspace should be loaded.  */
    391     int quadrant;
    392 
    393     /* An index into the default spaces array.  */
    394     int def_space_index;
    395 
    396     /* Subsegment associated with this subspace.  */
    397     subsegT subsegment;
    398   };
    399 
    400 /* This structure defines attributes of the default space
    401    dictionary entries.  */
    402 
    403 struct default_space_dict
    404   {
    405     /* Name of the space.  */
    406     const char *name;
    407 
    408     /* Space number.  It is possible to identify spaces within
    409        assembly code numerically!  */
    410     int spnum;
    411 
    412     /* Nonzero if this space is loadable.  */
    413     char loadable;
    414 
    415     /* Nonzero if this space is "defined".  FIXME is still needed */
    416     char defined;
    417 
    418     /* Nonzero if this space can not be shared.  */
    419     char private;
    420 
    421     /* Sort key for this space.  */
    422     unsigned char sort;
    423 
    424     /* Segment associated with this space.  */
    425     asection *segment;
    426   };
    427 #endif
    428 
    429 /* Structure for previous label tracking.  Needed so that alignments,
    430    callinfo declarations, etc can be easily attached to a particular
    431    label.  */
    432 typedef struct label_symbol_struct
    433   {
    434     struct symbol *lss_label;
    435 #ifdef OBJ_SOM
    436     sd_chain_struct *lss_space;
    437 #endif
    438 #ifdef OBJ_ELF
    439     segT lss_segment;
    440 #endif
    441     struct label_symbol_struct *lss_next;
    442   }
    443 label_symbol_struct;
    444 
    445 /* Extra information needed to perform fixups (relocations) on the PA.  */
    446 struct hppa_fix_struct
    447   {
    448     /* The field selector.  */
    449     enum hppa_reloc_field_selector_type_alt fx_r_field;
    450 
    451     /* Type of fixup.  */
    452     int fx_r_type;
    453 
    454     /* Format of fixup.  */
    455     int fx_r_format;
    456 
    457     /* Argument relocation bits.  */
    458     unsigned int fx_arg_reloc;
    459 
    460     /* The segment this fixup appears in.  */
    461     segT segment;
    462   };
    463 
    464 /* Structure to hold information about predefined registers.  */
    465 
    466 struct pd_reg
    467   {
    468     const char *name;
    469     int value;
    470   };
    471 
    472 /* This structure defines the mapping from a FP condition string
    473    to a condition number which can be recorded in an instruction.  */
    474 struct fp_cond_map
    475   {
    476     const char *string;
    477     int cond;
    478   };
    479 
    480 /* This structure defines a mapping from a field selector
    481    string to a field selector type.  */
    482 struct selector_entry
    483   {
    484     const char *prefix;
    485     int field_selector;
    486   };
    487 
    488 /* Prototypes for functions local to tc-hppa.c.  */
    489 
    490 #ifdef OBJ_SOM
    491 static void pa_check_current_space_and_subspace (void);
    492 #endif
    493 
    494 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
    495 static void pa_text (int);
    496 static void pa_data (int);
    497 static void pa_comm (int);
    498 #endif
    499 #ifdef OBJ_SOM
    500 static int exact_log2 (int);
    501 static void pa_compiler (int);
    502 static void pa_align (int);
    503 static void pa_space (int);
    504 static void pa_spnum (int);
    505 static void pa_subspace (int);
    506 static sd_chain_struct *create_new_space (const char *, int, int,
    507 					  int, int, int,
    508 					  asection *, int);
    509 static ssd_chain_struct *create_new_subspace (sd_chain_struct *,
    510 					      const char *, int, int,
    511 					      int, int, int, int,
    512 					      int, int, int, int,
    513 					      int, asection *);
    514 static ssd_chain_struct *update_subspace (sd_chain_struct *,
    515 					  char *, int, int, int,
    516 					  int, int, int, int,
    517 					  int, int, int, int,
    518 					  asection *);
    519 static sd_chain_struct *is_defined_space (const char *);
    520 static ssd_chain_struct *is_defined_subspace (const char *);
    521 static sd_chain_struct *pa_segment_to_space (asection *);
    522 static ssd_chain_struct *pa_subsegment_to_subspace (asection *,
    523 							    subsegT);
    524 static sd_chain_struct *pa_find_space_by_number (int);
    525 static unsigned int pa_subspace_start (sd_chain_struct *, int);
    526 static sd_chain_struct *pa_parse_space_stmt (const char *, int);
    527 #endif
    528 
    529 /* File and globally scoped variable declarations.  */
    530 
    531 #ifdef OBJ_SOM
    532 /* Root and final entry in the space chain.  */
    533 static sd_chain_struct *space_dict_root;
    534 static sd_chain_struct *space_dict_last;
    535 
    536 /* The current space and subspace.  */
    537 static sd_chain_struct *current_space;
    538 static ssd_chain_struct *current_subspace;
    539 #endif
    540 
    541 /* Root of the call_info chain.  */
    542 static struct call_info *call_info_root;
    543 
    544 /* The last call_info (for functions) structure
    545    seen so it can be associated with fixups and
    546    function labels.  */
    547 static struct call_info *last_call_info;
    548 
    549 /* The last call description (for actual calls).  */
    550 static struct call_desc last_call_desc;
    551 
    552 /* handle of the OPCODE hash table */
    553 static struct hash_control *op_hash = NULL;
    554 
    555 /* These characters can be suffixes of opcode names and they may be
    556    followed by meaningful whitespace.  We don't include `,' and `!'
    557    as they never appear followed by meaningful whitespace.  */
    558 const char hppa_symbol_chars[] = "*?=<>";
    559 
    560 /* This array holds the chars that only start a comment at the beginning of
    561    a line.  If the line seems to have the form '# 123 filename'
    562    .line and .file directives will appear in the pre-processed output.
    563 
    564    Note that input_file.c hand checks for '#' at the beginning of the
    565    first line of the input file.  This is because the compiler outputs
    566    #NO_APP at the beginning of its output.
    567 
    568    Also note that C style comments will always work.  */
    569 const char line_comment_chars[] = "#";
    570 
    571 /* This array holds the chars that always start a comment.  If the
    572    pre-processor is disabled, these aren't very useful.  */
    573 const char comment_chars[] = ";";
    574 
    575 /* This array holds the characters which act as line separators.  */
    576 const char line_separator_chars[] = "!";
    577 
    578 /* Chars that can be used to separate mant from exp in floating point nums.  */
    579 const char EXP_CHARS[] = "eE";
    580 
    581 /* Chars that mean this number is a floating point constant.
    582    As in 0f12.456 or 0d1.2345e12.
    583 
    584    Be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
    585    changed in read.c.  Ideally it shouldn't have to know about it
    586    at all, but nothing is ideal around here.  */
    587 const char FLT_CHARS[] = "rRsSfFdDxXpP";
    588 
    589 static struct pa_it the_insn;
    590 
    591 /* Points to the end of an expression just parsed by get_expression
    592    and friends.  FIXME.  This shouldn't be handled with a file-global
    593    variable.  */
    594 static char *expr_end;
    595 
    596 /* Nonzero if a .callinfo appeared within the current procedure.  */
    597 static int callinfo_found;
    598 
    599 /* Nonzero if the assembler is currently within a .entry/.exit pair.  */
    600 static int within_entry_exit;
    601 
    602 /* Nonzero if the assembler is currently within a procedure definition.  */
    603 static int within_procedure;
    604 
    605 /* Handle on structure which keep track of the last symbol
    606    seen in each subspace.  */
    607 static label_symbol_struct *label_symbols_rootp = NULL;
    608 
    609 /* Last label symbol */
    610 static label_symbol_struct last_label_symbol;
    611 
    612 /* Nonzero when strict matching is enabled.  Zero otherwise.
    613 
    614    Each opcode in the table has a flag which indicates whether or
    615    not strict matching should be enabled for that instruction.
    616 
    617    Mainly, strict causes errors to be ignored when a match failure
    618    occurs.  However, it also affects the parsing of register fields
    619    by pa_parse_number.  */
    620 static int strict;
    621 
    622 /* pa_parse_number returns values in `pa_number'.  Mostly
    623    pa_parse_number is used to return a register number, with floating
    624    point registers being numbered from FP_REG_BASE upwards.
    625    The bit specified with FP_REG_RSEL is set if the floating point
    626    register has a `r' suffix.  */
    627 #define FP_REG_BASE 64
    628 #define FP_REG_RSEL 128
    629 static int pa_number;
    630 
    631 #ifdef OBJ_SOM
    632 /* A dummy bfd symbol so that all relocations have symbols of some kind.  */
    633 static symbolS *dummy_symbol;
    634 #endif
    635 
    636 /* Nonzero if errors are to be printed.  */
    637 static int print_errors = 1;
    638 
    639 /* List of registers that are pre-defined:
    640 
    641    Each general register has one predefined name of the form
    642    %r<REGNUM> which has the value <REGNUM>.
    643 
    644    Space and control registers are handled in a similar manner,
    645    but use %sr<REGNUM> and %cr<REGNUM> as their predefined names.
    646 
    647    Likewise for the floating point registers, but of the form
    648    %fr<REGNUM>.  Floating point registers have additional predefined
    649    names with 'L' and 'R' suffixes (e.g. %fr19L, %fr19R) which
    650    again have the value <REGNUM>.
    651 
    652    Many registers also have synonyms:
    653 
    654    %r26 - %r23 have %arg0 - %arg3 as synonyms
    655    %r28 - %r29 have %ret0 - %ret1 as synonyms
    656    %fr4 - %fr7 have %farg0 - %farg3 as synonyms
    657    %r30 has %sp as a synonym
    658    %r27 has %dp as a synonym
    659    %r2  has %rp as a synonym
    660 
    661    Almost every control register has a synonym; they are not listed
    662    here for brevity.
    663 
    664    The table is sorted. Suitable for searching by a binary search.  */
    665 
    666 static const struct pd_reg pre_defined_registers[] =
    667 {
    668   {"%arg0",  26},
    669   {"%arg1",  25},
    670   {"%arg2",  24},
    671   {"%arg3",  23},
    672   {"%cr0",    0},
    673   {"%cr10",  10},
    674   {"%cr11",  11},
    675   {"%cr12",  12},
    676   {"%cr13",  13},
    677   {"%cr14",  14},
    678   {"%cr15",  15},
    679   {"%cr16",  16},
    680   {"%cr17",  17},
    681   {"%cr18",  18},
    682   {"%cr19",  19},
    683   {"%cr20",  20},
    684   {"%cr21",  21},
    685   {"%cr22",  22},
    686   {"%cr23",  23},
    687   {"%cr24",  24},
    688   {"%cr25",  25},
    689   {"%cr26",  26},
    690   {"%cr27",  27},
    691   {"%cr28",  28},
    692   {"%cr29",  29},
    693   {"%cr30",  30},
    694   {"%cr31",  31},
    695   {"%cr8",    8},
    696   {"%cr9",    9},
    697   {"%dp",    27},
    698   {"%eiem",  15},
    699   {"%eirr",  23},
    700   {"%farg0",  4 + FP_REG_BASE},
    701   {"%farg1",  5 + FP_REG_BASE},
    702   {"%farg2",  6 + FP_REG_BASE},
    703   {"%farg3",  7 + FP_REG_BASE},
    704   {"%fr0",    0 + FP_REG_BASE},
    705   {"%fr0l",   0 + FP_REG_BASE},
    706   {"%fr0r",   0 + FP_REG_BASE + FP_REG_RSEL},
    707   {"%fr1",    1 + FP_REG_BASE},
    708   {"%fr10",  10 + FP_REG_BASE},
    709   {"%fr10l", 10 + FP_REG_BASE},
    710   {"%fr10r", 10 + FP_REG_BASE + FP_REG_RSEL},
    711   {"%fr11",  11 + FP_REG_BASE},
    712   {"%fr11l", 11 + FP_REG_BASE},
    713   {"%fr11r", 11 + FP_REG_BASE + FP_REG_RSEL},
    714   {"%fr12",  12 + FP_REG_BASE},
    715   {"%fr12l", 12 + FP_REG_BASE},
    716   {"%fr12r", 12 + FP_REG_BASE + FP_REG_RSEL},
    717   {"%fr13",  13 + FP_REG_BASE},
    718   {"%fr13l", 13 + FP_REG_BASE},
    719   {"%fr13r", 13 + FP_REG_BASE + FP_REG_RSEL},
    720   {"%fr14",  14 + FP_REG_BASE},
    721   {"%fr14l", 14 + FP_REG_BASE},
    722   {"%fr14r", 14 + FP_REG_BASE + FP_REG_RSEL},
    723   {"%fr15",  15 + FP_REG_BASE},
    724   {"%fr15l", 15 + FP_REG_BASE},
    725   {"%fr15r", 15 + FP_REG_BASE + FP_REG_RSEL},
    726   {"%fr16",  16 + FP_REG_BASE},
    727   {"%fr16l", 16 + FP_REG_BASE},
    728   {"%fr16r", 16 + FP_REG_BASE + FP_REG_RSEL},
    729   {"%fr17",  17 + FP_REG_BASE},
    730   {"%fr17l", 17 + FP_REG_BASE},
    731   {"%fr17r", 17 + FP_REG_BASE + FP_REG_RSEL},
    732   {"%fr18",  18 + FP_REG_BASE},
    733   {"%fr18l", 18 + FP_REG_BASE},
    734   {"%fr18r", 18 + FP_REG_BASE + FP_REG_RSEL},
    735   {"%fr19",  19 + FP_REG_BASE},
    736   {"%fr19l", 19 + FP_REG_BASE},
    737   {"%fr19r", 19 + FP_REG_BASE + FP_REG_RSEL},
    738   {"%fr1l",   1 + FP_REG_BASE},
    739   {"%fr1r",   1 + FP_REG_BASE + FP_REG_RSEL},
    740   {"%fr2",    2 + FP_REG_BASE},
    741   {"%fr20",  20 + FP_REG_BASE},
    742   {"%fr20l", 20 + FP_REG_BASE},
    743   {"%fr20r", 20 + FP_REG_BASE + FP_REG_RSEL},
    744   {"%fr21",  21 + FP_REG_BASE},
    745   {"%fr21l", 21 + FP_REG_BASE},
    746   {"%fr21r", 21 + FP_REG_BASE + FP_REG_RSEL},
    747   {"%fr22",  22 + FP_REG_BASE},
    748   {"%fr22l", 22 + FP_REG_BASE},
    749   {"%fr22r", 22 + FP_REG_BASE + FP_REG_RSEL},
    750   {"%fr23",  23 + FP_REG_BASE},
    751   {"%fr23l", 23 + FP_REG_BASE},
    752   {"%fr23r", 23 + FP_REG_BASE + FP_REG_RSEL},
    753   {"%fr24",  24 + FP_REG_BASE},
    754   {"%fr24l", 24 + FP_REG_BASE},
    755   {"%fr24r", 24 + FP_REG_BASE + FP_REG_RSEL},
    756   {"%fr25",  25 + FP_REG_BASE},
    757   {"%fr25l", 25 + FP_REG_BASE},
    758   {"%fr25r", 25 + FP_REG_BASE + FP_REG_RSEL},
    759   {"%fr26",  26 + FP_REG_BASE},
    760   {"%fr26l", 26 + FP_REG_BASE},
    761   {"%fr26r", 26 + FP_REG_BASE + FP_REG_RSEL},
    762   {"%fr27",  27 + FP_REG_BASE},
    763   {"%fr27l", 27 + FP_REG_BASE},
    764   {"%fr27r", 27 + FP_REG_BASE + FP_REG_RSEL},
    765   {"%fr28",  28 + FP_REG_BASE},
    766   {"%fr28l", 28 + FP_REG_BASE},
    767   {"%fr28r", 28 + FP_REG_BASE + FP_REG_RSEL},
    768   {"%fr29",  29 + FP_REG_BASE},
    769   {"%fr29l", 29 + FP_REG_BASE},
    770   {"%fr29r", 29 + FP_REG_BASE + FP_REG_RSEL},
    771   {"%fr2l",   2 + FP_REG_BASE},
    772   {"%fr2r",   2 + FP_REG_BASE + FP_REG_RSEL},
    773   {"%fr3",    3 + FP_REG_BASE},
    774   {"%fr30",  30 + FP_REG_BASE},
    775   {"%fr30l", 30 + FP_REG_BASE},
    776   {"%fr30r", 30 + FP_REG_BASE + FP_REG_RSEL},
    777   {"%fr31",  31 + FP_REG_BASE},
    778   {"%fr31l", 31 + FP_REG_BASE},
    779   {"%fr31r", 31 + FP_REG_BASE + FP_REG_RSEL},
    780   {"%fr3l",   3 + FP_REG_BASE},
    781   {"%fr3r",   3 + FP_REG_BASE + FP_REG_RSEL},
    782   {"%fr4",    4 + FP_REG_BASE},
    783   {"%fr4l",   4 + FP_REG_BASE},
    784   {"%fr4r",   4 + FP_REG_BASE + FP_REG_RSEL},
    785   {"%fr5",    5 + FP_REG_BASE},
    786   {"%fr5l",   5 + FP_REG_BASE},
    787   {"%fr5r",   5 + FP_REG_BASE + FP_REG_RSEL},
    788   {"%fr6",    6 + FP_REG_BASE},
    789   {"%fr6l",   6 + FP_REG_BASE},
    790   {"%fr6r",   6 + FP_REG_BASE + FP_REG_RSEL},
    791   {"%fr7",    7 + FP_REG_BASE},
    792   {"%fr7l",   7 + FP_REG_BASE},
    793   {"%fr7r",   7 + FP_REG_BASE + FP_REG_RSEL},
    794   {"%fr8",    8 + FP_REG_BASE},
    795   {"%fr8l",   8 + FP_REG_BASE},
    796   {"%fr8r",   8 + FP_REG_BASE + FP_REG_RSEL},
    797   {"%fr9",    9 + FP_REG_BASE},
    798   {"%fr9l",   9 + FP_REG_BASE},
    799   {"%fr9r",   9 + FP_REG_BASE + FP_REG_RSEL},
    800   {"%fret",   4},
    801   {"%hta",   25},
    802   {"%iir",   19},
    803   {"%ior",   21},
    804   {"%ipsw",  22},
    805   {"%isr",   20},
    806   {"%itmr",  16},
    807   {"%iva",   14},
    808 #if TARGET_ARCH_SIZE == 64
    809   {"%mrp",    2},
    810 #else
    811   {"%mrp",   31},
    812 #endif
    813   {"%pcoq",  18},
    814   {"%pcsq",  17},
    815   {"%pidr1",  8},
    816   {"%pidr2",  9},
    817   {"%pidr3", 12},
    818   {"%pidr4", 13},
    819   {"%ppda",  24},
    820   {"%r0",     0},
    821   {"%r1",     1},
    822   {"%r10",   10},
    823   {"%r11",   11},
    824   {"%r12",   12},
    825   {"%r13",   13},
    826   {"%r14",   14},
    827   {"%r15",   15},
    828   {"%r16",   16},
    829   {"%r17",   17},
    830   {"%r18",   18},
    831   {"%r19",   19},
    832   {"%r2",     2},
    833   {"%r20",   20},
    834   {"%r21",   21},
    835   {"%r22",   22},
    836   {"%r23",   23},
    837   {"%r24",   24},
    838   {"%r25",   25},
    839   {"%r26",   26},
    840   {"%r27",   27},
    841   {"%r28",   28},
    842   {"%r29",   29},
    843   {"%r3",     3},
    844   {"%r30",   30},
    845   {"%r31",   31},
    846   {"%r4",     4},
    847   {"%r5",     5},
    848   {"%r6",     6},
    849   {"%r7",     7},
    850   {"%r8",     8},
    851   {"%r9",     9},
    852   {"%rctr",   0},
    853   {"%ret0",  28},
    854   {"%ret1",  29},
    855   {"%rp",     2},
    856   {"%sar",   11},
    857   {"%sp",    30},
    858   {"%sr0",    0},
    859   {"%sr1",    1},
    860   {"%sr2",    2},
    861   {"%sr3",    3},
    862   {"%sr4",    4},
    863   {"%sr5",    5},
    864   {"%sr6",    6},
    865   {"%sr7",    7},
    866   {"%t1",    22},
    867   {"%t2",    21},
    868   {"%t3",    20},
    869   {"%t4",    19},
    870   {"%tf1",   11},
    871   {"%tf2",   10},
    872   {"%tf3",    9},
    873   {"%tf4",    8},
    874   {"%tr0",   24},
    875   {"%tr1",   25},
    876   {"%tr2",   26},
    877   {"%tr3",   27},
    878   {"%tr4",   28},
    879   {"%tr5",   29},
    880   {"%tr6",   30},
    881   {"%tr7",   31}
    882 };
    883 
    884 /* This table is sorted by order of the length of the string. This is
    885    so we check for <> before we check for <. If we had a <> and checked
    886    for < first, we would get a false match.  */
    887 static const struct fp_cond_map fp_cond_map[] =
    888 {
    889   {"false?", 0},
    890   {"false", 1},
    891   {"true?", 30},
    892   {"true", 31},
    893   {"!<=>", 3},
    894   {"!?>=", 8},
    895   {"!?<=", 16},
    896   {"!<>", 7},
    897   {"!>=", 11},
    898   {"!?>", 12},
    899   {"?<=", 14},
    900   {"!<=", 19},
    901   {"!?<", 20},
    902   {"?>=", 22},
    903   {"!?=", 24},
    904   {"!=t", 27},
    905   {"<=>", 29},
    906   {"=t", 5},
    907   {"?=", 6},
    908   {"?<", 10},
    909   {"<=", 13},
    910   {"!>", 15},
    911   {"?>", 18},
    912   {">=", 21},
    913   {"!<", 23},
    914   {"<>", 25},
    915   {"!=", 26},
    916   {"!?", 28},
    917   {"?", 2},
    918   {"=", 4},
    919   {"<", 9},
    920   {">", 17}
    921 };
    922 
    923 static const struct selector_entry selector_table[] =
    924 {
    925   {"f", e_fsel},
    926   {"l", e_lsel},
    927   {"ld", e_ldsel},
    928   {"lp", e_lpsel},
    929   {"lr", e_lrsel},
    930   {"ls", e_lssel},
    931   {"lt", e_ltsel},
    932   {"ltp", e_ltpsel},
    933   {"n", e_nsel},
    934   {"nl", e_nlsel},
    935   {"nlr", e_nlrsel},
    936   {"p", e_psel},
    937   {"r", e_rsel},
    938   {"rd", e_rdsel},
    939   {"rp", e_rpsel},
    940   {"rr", e_rrsel},
    941   {"rs", e_rssel},
    942   {"rt", e_rtsel},
    943   {"rtp", e_rtpsel},
    944   {"t", e_tsel},
    945 };
    946 
    947 #ifdef OBJ_SOM
    948 /* default space and subspace dictionaries */
    949 
    950 #define GDB_SYMBOLS	GDB_SYMBOLS_SUBSPACE_NAME
    951 #define GDB_STRINGS	GDB_STRINGS_SUBSPACE_NAME
    952 
    953 /* pre-defined subsegments (subspaces) for the HPPA.  */
    954 #define SUBSEG_CODE   0
    955 #define SUBSEG_LIT    1
    956 #define SUBSEG_MILLI  2
    957 #define SUBSEG_DATA   0
    958 #define SUBSEG_BSS    2
    959 #define SUBSEG_UNWIND 3
    960 #define SUBSEG_GDB_STRINGS 0
    961 #define SUBSEG_GDB_SYMBOLS 1
    962 
    963 static struct default_subspace_dict pa_def_subspaces[] =
    964 {
    965   {"$CODE$", 1, 1, 1, 0, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, SUBSEG_CODE},
    966   {"$DATA$", 1, 1, 0, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, SUBSEG_DATA},
    967   {"$LIT$", 1, 1, 0, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, SUBSEG_LIT},
    968   {"$MILLICODE$", 1, 1, 0, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, SUBSEG_MILLI},
    969   {"$BSS$", 1, 1, 0, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, SUBSEG_BSS},
    970   {NULL, 0, 1, 0, 0, 0, 0, 0, 255, 0x1f, 0, 4, 0, 0, 0}
    971 };
    972 
    973 static struct default_space_dict pa_def_spaces[] =
    974 {
    975   {"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL},
    976   {"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL},
    977   {NULL, 0, 0, 0, 0, 0, ASEC_NULL}
    978 };
    979 
    980 /* Misc local definitions used by the assembler.  */
    981 
    982 /* These macros are used to maintain spaces/subspaces.  */
    983 #define SPACE_DEFINED(space_chain)	(space_chain)->sd_defined
    984 #define SPACE_USER_DEFINED(space_chain) (space_chain)->sd_user_defined
    985 #define SPACE_SPNUM(space_chain)	(space_chain)->sd_spnum
    986 #define SPACE_NAME(space_chain)		(space_chain)->sd_name
    987 
    988 #define SUBSPACE_DEFINED(ss_chain)	(ss_chain)->ssd_defined
    989 #define SUBSPACE_NAME(ss_chain)		(ss_chain)->ssd_name
    990 #endif
    991 
    992 /* Return nonzero if the string pointed to by S potentially represents
    993    a right or left half of a FP register  */
    994 #define IS_R_SELECT(S)   (*(S) == 'R' || *(S) == 'r')
    995 #define IS_L_SELECT(S)   (*(S) == 'L' || *(S) == 'l')
    996 
    997 /* Store immediate values of shift/deposit/extract functions.  */
    998 
    999 #define SAVE_IMMEDIATE(VALUE) \
   1000   { \
   1001     if (immediate_check) \
   1002       { \
   1003 	if (pos == -1) \
   1004 	  pos = (VALUE); \
   1005 	else if (len == -1) \
   1006 	  len = (VALUE); \
   1007       } \
   1008   }
   1009 
   1010 /* Insert FIELD into OPCODE starting at bit START.  Continue pa_ip
   1011    main loop after insertion.  */
   1012 
   1013 #define INSERT_FIELD_AND_CONTINUE(OPCODE, FIELD, START) \
   1014   { \
   1015     ((OPCODE) |= (FIELD) << (START)); \
   1016     continue; \
   1017   }
   1018 
   1019 /* Simple range checking for FIELD against HIGH and LOW bounds.
   1020    IGNORE is used to suppress the error message.  */
   1021 
   1022 #define CHECK_FIELD(FIELD, HIGH, LOW, IGNORE) \
   1023   { \
   1024     if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
   1025       { \
   1026 	if (! IGNORE) \
   1027 	  as_bad (_("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
   1028 		  (int) (FIELD));\
   1029 	break; \
   1030       } \
   1031   }
   1032 
   1033 /* Variant of CHECK_FIELD for use in md_apply_fix and other places where
   1034    the current file and line number are not valid.  */
   1035 
   1036 #define CHECK_FIELD_WHERE(FIELD, HIGH, LOW, FILENAME, LINE) \
   1037   { \
   1038     if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
   1039       { \
   1040 	as_bad_where ((FILENAME), (LINE), \
   1041 		      _("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
   1042 		      (int) (FIELD));\
   1043 	break; \
   1044       } \
   1045   }
   1046 
   1047 /* Simple alignment checking for FIELD against ALIGN (a power of two).
   1048    IGNORE is used to suppress the error message.  */
   1049 
   1050 #define CHECK_ALIGN(FIELD, ALIGN, IGNORE) \
   1051   { \
   1052     if ((FIELD) & ((ALIGN) - 1)) \
   1053       { \
   1054 	if (! IGNORE) \
   1055 	  as_bad (_("Field not properly aligned [%d] (%d)."), (ALIGN), \
   1056 		  (int) (FIELD));\
   1057 	break; \
   1058       } \
   1059   }
   1060 
   1061 #define is_DP_relative(exp)			\
   1062   ((exp).X_op == O_subtract			\
   1063    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$global$") == 0)
   1064 
   1065 #define is_SB_relative(exp)			\
   1066   ((exp).X_op == O_subtract			\
   1067    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$segrel$") == 0)
   1068 
   1069 #define is_PC_relative(exp)			\
   1070   ((exp).X_op == O_subtract			\
   1071    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$PIC_pcrel$0") == 0)
   1072 
   1073 #define is_tls_gdidx(exp)			\
   1074   ((exp).X_op == O_subtract			\
   1075    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_gdidx$") == 0)
   1076 
   1077 #define is_tls_ldidx(exp)			\
   1078   ((exp).X_op == O_subtract			\
   1079    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ldidx$") == 0)
   1080 
   1081 #define is_tls_dtpoff(exp)			\
   1082   ((exp).X_op == O_subtract			\
   1083    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_dtpoff$") == 0)
   1084 
   1085 #define is_tls_ieoff(exp)			\
   1086   ((exp).X_op == O_subtract			\
   1087    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ieoff$") == 0)
   1088 
   1089 #define is_tls_leoff(exp)			\
   1090   ((exp).X_op == O_subtract			\
   1091    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_leoff$") == 0)
   1092 
   1093 /* We need some complex handling for stabs (sym1 - sym2).  Luckily, we'll
   1094    always be able to reduce the expression to a constant, so we don't
   1095    need real complex handling yet.  */
   1096 #define is_complex(exp)				\
   1097   ((exp).X_op != O_constant && (exp).X_op != O_symbol)
   1098 
   1099 /* Actual functions to implement the PA specific code for the assembler.  */
   1100 
   1101 /* Called before writing the object file.  Make sure entry/exit and
   1102    proc/procend pairs match.  */
   1103 
   1104 void
   1105 pa_check_eof (void)
   1106 {
   1107   if (within_entry_exit)
   1108     as_fatal (_("Missing .exit\n"));
   1109 
   1110   if (within_procedure)
   1111     as_fatal (_("Missing .procend\n"));
   1112 }
   1113 
   1114 /* Returns a pointer to the label_symbol_struct for the current space.
   1115    or NULL if no label_symbol_struct exists for the current space.  */
   1116 
   1117 static label_symbol_struct *
   1118 pa_get_label (void)
   1119 {
   1120   label_symbol_struct *label_chain = label_symbols_rootp;
   1121 
   1122   if (label_chain)
   1123     {
   1124 #ifdef OBJ_SOM
   1125       if (current_space == label_chain->lss_space && label_chain->lss_label)
   1126 	return label_chain;
   1127 #endif
   1128 #ifdef OBJ_ELF
   1129       if (now_seg == label_chain->lss_segment && label_chain->lss_label)
   1130 	return label_chain;
   1131 #endif
   1132     }
   1133 
   1134   return NULL;
   1135 }
   1136 
   1137 /* Defines a label for the current space.  If one is already defined,
   1138    this function will replace it with the new label.  */
   1139 
   1140 void
   1141 pa_define_label (symbolS *symbol)
   1142 {
   1143   label_symbol_struct *label_chain = label_symbols_rootp;
   1144 
   1145   if (!label_chain)
   1146     label_chain = &last_label_symbol;
   1147 
   1148   label_chain->lss_label = symbol;
   1149 #ifdef OBJ_SOM
   1150   label_chain->lss_space = current_space;
   1151 #endif
   1152 #ifdef OBJ_ELF
   1153   label_chain->lss_segment = now_seg;
   1154 #endif
   1155 
   1156   /* Not used.  */
   1157   label_chain->lss_next = NULL;
   1158 
   1159   label_symbols_rootp = label_chain;
   1160 
   1161 #ifdef OBJ_ELF
   1162   dwarf2_emit_label (symbol);
   1163 #endif
   1164 }
   1165 
   1166 /* Removes a label definition for the current space.
   1167    If there is no label_symbol_struct entry, then no action is taken.  */
   1168 
   1169 static void
   1170 pa_undefine_label (void)
   1171 {
   1172   label_symbols_rootp = NULL;
   1173 }
   1174 
   1175 /* An HPPA-specific version of fix_new.  This is required because the HPPA
   1176    code needs to keep track of some extra stuff.  Each call to fix_new_hppa
   1177    results in the creation of an instance of an hppa_fix_struct.  An
   1178    hppa_fix_struct stores the extra information along with a pointer to the
   1179    original fixS.  This is attached to the original fixup via the
   1180    tc_fix_data field.  */
   1181 
   1182 static void
   1183 fix_new_hppa (fragS *frag,
   1184 	      int where,
   1185 	      int size,
   1186 	      symbolS *add_symbol,
   1187 	      offsetT offset,
   1188 	      expressionS *exp,
   1189 	      int pcrel,
   1190 	      bfd_reloc_code_real_type r_type,
   1191 	      enum hppa_reloc_field_selector_type_alt r_field,
   1192 	      int r_format,
   1193 	      unsigned int arg_reloc,
   1194 	      int unwind_bits ATTRIBUTE_UNUSED)
   1195 {
   1196   fixS *new_fix;
   1197   struct hppa_fix_struct *hppa_fix = XOBNEW (&notes, struct hppa_fix_struct);
   1198 
   1199   if (exp != NULL)
   1200     new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
   1201   else
   1202     new_fix = fix_new (frag, where, size, add_symbol, offset, pcrel, r_type);
   1203   new_fix->tc_fix_data = (void *) hppa_fix;
   1204   hppa_fix->fx_r_type = r_type;
   1205   hppa_fix->fx_r_field = r_field;
   1206   hppa_fix->fx_r_format = r_format;
   1207   hppa_fix->fx_arg_reloc = arg_reloc;
   1208   hppa_fix->segment = now_seg;
   1209 #ifdef OBJ_SOM
   1210   if (r_type == R_ENTRY || r_type == R_EXIT)
   1211     new_fix->fx_offset = unwind_bits;
   1212 #endif
   1213 
   1214   /* foo-$global$ is used to access non-automatic storage.  $global$
   1215      is really just a marker and has served its purpose, so eliminate
   1216      it now so as not to confuse write.c.  Ditto for $PIC_pcrel$0.  */
   1217   if (new_fix->fx_subsy
   1218       && (strcmp (S_GET_NAME (new_fix->fx_subsy), "$global$") == 0
   1219 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$segrel$") == 0
   1220 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$PIC_pcrel$0") == 0
   1221 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_gdidx$") == 0
   1222 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_ldidx$") == 0
   1223 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_dtpoff$") == 0
   1224 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_ieoff$") == 0
   1225 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_leoff$") == 0))
   1226     new_fix->fx_subsy = NULL;
   1227 }
   1228 
   1229 /* This fix_new is called by cons via TC_CONS_FIX_NEW.
   1230    hppa_field_selector is set by the parse_cons_expression_hppa.  */
   1231 
   1232 void
   1233 cons_fix_new_hppa (fragS *frag, int where, int size, expressionS *exp,
   1234 		   int hppa_field_selector)
   1235 {
   1236   unsigned int rel_type;
   1237 
   1238   /* Get a base relocation type.  */
   1239   if (is_DP_relative (*exp))
   1240     rel_type = R_HPPA_GOTOFF;
   1241   else if (is_PC_relative (*exp))
   1242     rel_type = R_HPPA_PCREL_CALL;
   1243 #ifdef OBJ_ELF
   1244   else if (is_SB_relative (*exp))
   1245     rel_type = R_PARISC_SEGREL32;
   1246   else if (is_tls_gdidx (*exp))
   1247     rel_type = R_PARISC_TLS_GD21L;
   1248   else if (is_tls_ldidx (*exp))
   1249     rel_type = R_PARISC_TLS_LDM21L;
   1250   else if (is_tls_dtpoff (*exp))
   1251     rel_type = R_PARISC_TLS_LDO21L;
   1252   else if (is_tls_ieoff (*exp))
   1253     rel_type = R_PARISC_TLS_IE21L;
   1254   else if (is_tls_leoff (*exp))
   1255     rel_type = R_PARISC_TLS_LE21L;
   1256 #endif
   1257   else if (is_complex (*exp))
   1258     rel_type = R_HPPA_COMPLEX;
   1259   else
   1260     rel_type = R_HPPA;
   1261 
   1262   if (hppa_field_selector != e_psel && hppa_field_selector != e_fsel)
   1263     {
   1264       as_warn (_("Invalid field selector.  Assuming F%%."));
   1265       hppa_field_selector = e_fsel;
   1266     }
   1267 
   1268   fix_new_hppa (frag, where, size,
   1269 		(symbolS *) NULL, (offsetT) 0, exp, 0, rel_type,
   1270 		hppa_field_selector, size * 8, 0, 0);
   1271 }
   1272 
   1273 /* Mark (via expr_end) the end of an expression (I think).  FIXME.  */
   1274 
   1275 static void
   1276 get_expression (char *str)
   1277 {
   1278   char *save_in;
   1279   asection *seg;
   1280 
   1281   save_in = input_line_pointer;
   1282   input_line_pointer = str;
   1283   seg = expression (&the_insn.exp);
   1284   if (!(seg == absolute_section
   1285 	|| seg == undefined_section
   1286 	|| SEG_NORMAL (seg)))
   1287     {
   1288       as_warn (_("Bad segment in expression."));
   1289       expr_end = input_line_pointer;
   1290       input_line_pointer = save_in;
   1291       return;
   1292     }
   1293   expr_end = input_line_pointer;
   1294   input_line_pointer = save_in;
   1295 }
   1296 
   1297 /* Parse a PA nullification completer (,n).  Return nonzero if the
   1298    completer was found; return zero if no completer was found.  */
   1299 
   1300 static int
   1301 pa_parse_nullif (char **s)
   1302 {
   1303   int nullif;
   1304 
   1305   nullif = 0;
   1306   if (**s == ',')
   1307     {
   1308       *s = *s + 1;
   1309       if (strncasecmp (*s, "n", 1) == 0)
   1310 	nullif = 1;
   1311       else
   1312 	{
   1313 	  as_bad (_("Invalid Nullification: (%c)"), **s);
   1314 	  nullif = 0;
   1315 	}
   1316       *s = *s + 1;
   1317     }
   1318 
   1319   return nullif;
   1320 }
   1321 
   1322 const char *
   1323 md_atof (int type, char *litP, int *sizeP)
   1324 {
   1325   return ieee_md_atof (type, litP, sizeP, TRUE);
   1326 }
   1327 
   1328 /* Write out big-endian.  */
   1329 
   1330 void
   1331 md_number_to_chars (char *buf, valueT val, int n)
   1332 {
   1333   number_to_chars_bigendian (buf, val, n);
   1334 }
   1335 
   1336 /* Translate internal representation of relocation info to BFD target
   1337    format.  */
   1338 
   1339 arelent **
   1340 tc_gen_reloc (asection *section, fixS *fixp)
   1341 {
   1342   arelent *reloc;
   1343   struct hppa_fix_struct *hppa_fixp;
   1344   static arelent *no_relocs = NULL;
   1345   arelent **relocs;
   1346   reloc_type **codes;
   1347   reloc_type code;
   1348   int n_relocs;
   1349   int i;
   1350 
   1351   hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data;
   1352   if (fixp->fx_addsy == 0)
   1353     return &no_relocs;
   1354 
   1355   gas_assert (hppa_fixp != 0);
   1356   gas_assert (section != 0);
   1357 
   1358   reloc = XNEW (arelent);
   1359 
   1360   reloc->sym_ptr_ptr = XNEW (asymbol *);
   1361   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1362 
   1363   /* Allow fixup_segment to recognize hand-written pc-relative relocations.
   1364      When we went through cons_fix_new_hppa, we classified them as complex.  */
   1365   /* ??? It might be better to hide this +8 stuff in tc_cfi_emit_pcrel_expr,
   1366      undefine DIFF_EXPR_OK, and let these sorts of complex expressions fail
   1367      when R_HPPA_COMPLEX == R_PARISC_UNIMPLEMENTED.  */
   1368   if (fixp->fx_r_type == (bfd_reloc_code_real_type) R_HPPA_COMPLEX
   1369       && fixp->fx_pcrel)
   1370     {
   1371       fixp->fx_r_type = R_HPPA_PCREL_CALL;
   1372       fixp->fx_offset += 8;
   1373     }
   1374 
   1375   codes = hppa_gen_reloc_type (stdoutput,
   1376 			       fixp->fx_r_type,
   1377 			       hppa_fixp->fx_r_format,
   1378 			       hppa_fixp->fx_r_field,
   1379 			       fixp->fx_subsy != NULL,
   1380 			       symbol_get_bfdsym (fixp->fx_addsy));
   1381 
   1382   if (codes == NULL)
   1383     {
   1384       as_bad_where (fixp->fx_file, fixp->fx_line, _("Cannot handle fixup"));
   1385       abort ();
   1386     }
   1387 
   1388   for (n_relocs = 0; codes[n_relocs]; n_relocs++)
   1389     ;
   1390 
   1391   relocs = XNEWVEC (arelent *, n_relocs + 1);
   1392   reloc = XNEWVEC (arelent, n_relocs);
   1393   for (i = 0; i < n_relocs; i++)
   1394     relocs[i] = &reloc[i];
   1395 
   1396   relocs[n_relocs] = NULL;
   1397 
   1398 #ifdef OBJ_ELF
   1399   switch (fixp->fx_r_type)
   1400     {
   1401     default:
   1402       gas_assert (n_relocs == 1);
   1403 
   1404       code = *codes[0];
   1405 
   1406       /* Now, do any processing that is dependent on the relocation type.  */
   1407       switch (code)
   1408 	{
   1409 	case R_PARISC_DLTREL21L:
   1410 	case R_PARISC_DLTREL14R:
   1411 	case R_PARISC_DLTREL14F:
   1412 	case R_PARISC_PLABEL32:
   1413 	case R_PARISC_PLABEL21L:
   1414 	case R_PARISC_PLABEL14R:
   1415 	  /* For plabel relocations, the addend of the
   1416 	     relocation should be either 0 (no static link) or 2
   1417 	     (static link required).  This adjustment is done in
   1418 	     bfd/elf32-hppa.c:elf32_hppa_relocate_section.
   1419 
   1420 	     We also slam a zero addend into the DLT relative relocs;
   1421 	     it doesn't make a lot of sense to use any addend since
   1422 	     it gets you a different (eg unknown) DLT entry.  */
   1423 	  reloc->addend = 0;
   1424 	  break;
   1425 
   1426 #ifdef ELF_ARG_RELOC
   1427 	case R_PARISC_PCREL17R:
   1428 	case R_PARISC_PCREL17F:
   1429 	case R_PARISC_PCREL17C:
   1430 	case R_PARISC_DIR17R:
   1431 	case R_PARISC_DIR17F:
   1432 	case R_PARISC_PCREL21L:
   1433 	case R_PARISC_DIR21L:
   1434 	  reloc->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc,
   1435 					 fixp->fx_offset);
   1436 	  break;
   1437 #endif
   1438 
   1439 	case R_PARISC_DIR32:
   1440 	  /* Facilitate hand-crafted unwind info.  */
   1441 	  if (strcmp (section->name, UNWIND_SECTION_NAME) == 0)
   1442 	    code = R_PARISC_SEGREL32;
   1443 	  /* Fall thru */
   1444 
   1445 	default:
   1446 	  reloc->addend = fixp->fx_offset;
   1447 	  break;
   1448 	}
   1449 
   1450       reloc->sym_ptr_ptr = XNEW (asymbol *);
   1451       *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1452       reloc->howto = bfd_reloc_type_lookup (stdoutput,
   1453 					    (bfd_reloc_code_real_type) code);
   1454       reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1455 
   1456       gas_assert (reloc->howto && (unsigned int) code == reloc->howto->type);
   1457       break;
   1458     }
   1459 #else /* OBJ_SOM */
   1460 
   1461   /* Walk over reach relocation returned by the BFD backend.  */
   1462   for (i = 0; i < n_relocs; i++)
   1463     {
   1464       code = *codes[i];
   1465 
   1466       relocs[i]->sym_ptr_ptr = XNEW (asymbol *);
   1467       *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1468       relocs[i]->howto =
   1469 	bfd_reloc_type_lookup (stdoutput,
   1470 			       (bfd_reloc_code_real_type) code);
   1471       relocs[i]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1472 
   1473       switch (code)
   1474 	{
   1475 	case R_COMP2:
   1476 	  /* The only time we ever use a R_COMP2 fixup is for the difference
   1477 	     of two symbols.  With that in mind we fill in all four
   1478 	     relocs now and break out of the loop.  */
   1479 	  gas_assert (i == 1);
   1480 	  relocs[0]->sym_ptr_ptr
   1481 	    = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
   1482 	  relocs[0]->howto
   1483 	    = bfd_reloc_type_lookup (stdoutput,
   1484 				     (bfd_reloc_code_real_type) *codes[0]);
   1485 	  relocs[0]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1486 	  relocs[0]->addend = 0;
   1487 	  relocs[1]->sym_ptr_ptr = XNEW (asymbol *);
   1488 	  *relocs[1]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1489 	  relocs[1]->howto
   1490 	    = bfd_reloc_type_lookup (stdoutput,
   1491 				     (bfd_reloc_code_real_type) *codes[1]);
   1492 	  relocs[1]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1493 	  relocs[1]->addend = 0;
   1494 	  relocs[2]->sym_ptr_ptr = XNEW (asymbol *);
   1495 	  *relocs[2]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy);
   1496 	  relocs[2]->howto
   1497 	    = bfd_reloc_type_lookup (stdoutput,
   1498 				     (bfd_reloc_code_real_type) *codes[2]);
   1499 	  relocs[2]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1500 	  relocs[2]->addend = 0;
   1501 	  relocs[3]->sym_ptr_ptr
   1502 	    = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
   1503 	  relocs[3]->howto
   1504 	    = bfd_reloc_type_lookup (stdoutput,
   1505 				     (bfd_reloc_code_real_type) *codes[3]);
   1506 	  relocs[3]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1507 	  relocs[3]->addend = 0;
   1508 	  relocs[4]->sym_ptr_ptr
   1509 	    = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
   1510 	  relocs[4]->howto
   1511 	    = bfd_reloc_type_lookup (stdoutput,
   1512 				     (bfd_reloc_code_real_type) *codes[4]);
   1513 	  relocs[4]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1514 	  relocs[4]->addend = 0;
   1515 	  goto done;
   1516 	case R_PCREL_CALL:
   1517 	case R_ABS_CALL:
   1518 	  relocs[i]->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc, 0);
   1519 	  break;
   1520 
   1521 	case R_DLT_REL:
   1522 	case R_DATA_PLABEL:
   1523 	case R_CODE_PLABEL:
   1524 	  /* For plabel relocations, the addend of the
   1525 	     relocation should be either 0 (no static link) or 2
   1526 	     (static link required).
   1527 
   1528 	     FIXME: We always assume no static link!
   1529 
   1530 	     We also slam a zero addend into the DLT relative relocs;
   1531 	     it doesn't make a lot of sense to use any addend since
   1532 	     it gets you a different (eg unknown) DLT entry.  */
   1533 	  relocs[i]->addend = 0;
   1534 	  break;
   1535 
   1536 	case R_N_MODE:
   1537 	case R_S_MODE:
   1538 	case R_D_MODE:
   1539 	case R_R_MODE:
   1540 	case R_FSEL:
   1541 	case R_LSEL:
   1542 	case R_RSEL:
   1543 	case R_BEGIN_BRTAB:
   1544 	case R_END_BRTAB:
   1545 	case R_BEGIN_TRY:
   1546 	case R_N0SEL:
   1547 	case R_N1SEL:
   1548 	  /* There is no symbol or addend associated with these fixups.  */
   1549 	  relocs[i]->sym_ptr_ptr = XNEW (asymbol *);
   1550 	  *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
   1551 	  relocs[i]->addend = 0;
   1552 	  break;
   1553 
   1554 	case R_END_TRY:
   1555 	case R_ENTRY:
   1556 	case R_EXIT:
   1557 	  /* There is no symbol associated with these fixups.  */
   1558 	  relocs[i]->sym_ptr_ptr = XNEW (asymbol *);
   1559 	  *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
   1560 	  relocs[i]->addend = fixp->fx_offset;
   1561 	  break;
   1562 
   1563 	default:
   1564 	  relocs[i]->addend = fixp->fx_offset;
   1565 	}
   1566     }
   1567 
   1568  done:
   1569 #endif
   1570 
   1571   return relocs;
   1572 }
   1573 
   1574 /* Process any machine dependent frag types.  */
   1575 
   1576 void
   1577 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
   1578 		 asection *sec ATTRIBUTE_UNUSED,
   1579 		 fragS *fragP)
   1580 {
   1581   unsigned int address;
   1582 
   1583   if (fragP->fr_type == rs_machine_dependent)
   1584     {
   1585       switch ((int) fragP->fr_subtype)
   1586 	{
   1587 	case 0:
   1588 	  fragP->fr_type = rs_fill;
   1589 	  know (fragP->fr_var == 1);
   1590 	  know (fragP->fr_next);
   1591 	  address = fragP->fr_address + fragP->fr_fix;
   1592 	  if (address % fragP->fr_offset)
   1593 	    {
   1594 	      fragP->fr_offset =
   1595 		fragP->fr_next->fr_address
   1596 		- fragP->fr_address
   1597 		- fragP->fr_fix;
   1598 	    }
   1599 	  else
   1600 	    fragP->fr_offset = 0;
   1601 	  break;
   1602 	}
   1603     }
   1604 }
   1605 
   1606 /* Round up a section size to the appropriate boundary.  */
   1607 
   1608 valueT
   1609 md_section_align (asection *segment, valueT size)
   1610 {
   1611   int align = bfd_get_section_alignment (stdoutput, segment);
   1612   int align2 = (1 << align) - 1;
   1613 
   1614   return (size + align2) & ~align2;
   1615 }
   1616 
   1617 /* Return the approximate size of a frag before relaxation has occurred.  */
   1618 
   1619 int
   1620 md_estimate_size_before_relax (fragS *fragP, asection *segment ATTRIBUTE_UNUSED)
   1621 {
   1622   int size;
   1623 
   1624   size = 0;
   1625 
   1626   while ((fragP->fr_fix + size) % fragP->fr_offset)
   1627     size++;
   1628 
   1629   return size;
   1630 }
   1631 
   1632 #ifdef OBJ_ELF
   1634 # ifdef WARN_COMMENTS
   1635 const char *md_shortopts = "Vc";
   1636 # else
   1637 const char *md_shortopts = "V";
   1638 # endif
   1639 #else
   1640 # ifdef WARN_COMMENTS
   1641 const char *md_shortopts = "c";
   1642 # else
   1643 const char *md_shortopts = "";
   1644 # endif
   1645 #endif
   1646 
   1647 struct option md_longopts[] =
   1648 {
   1649 #ifdef WARN_COMMENTS
   1650   {"warn-comment", no_argument, NULL, 'c'},
   1651 #endif
   1652   {NULL, no_argument, NULL, 0}
   1653 };
   1654 size_t md_longopts_size = sizeof (md_longopts);
   1655 
   1656 int
   1657 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
   1658 {
   1659   switch (c)
   1660     {
   1661     default:
   1662       return 0;
   1663 
   1664 #ifdef OBJ_ELF
   1665     case 'V':
   1666       print_version_id ();
   1667       break;
   1668 #endif
   1669 #ifdef WARN_COMMENTS
   1670     case 'c':
   1671       warn_comment = 1;
   1672       break;
   1673 #endif
   1674     }
   1675 
   1676   return 1;
   1677 }
   1678 
   1679 void
   1680 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
   1681 {
   1682 #ifdef OBJ_ELF
   1683   fprintf (stream, _("\
   1684   -Q                      ignored\n"));
   1685 #endif
   1686 #ifdef WARN_COMMENTS
   1687   fprintf (stream, _("\
   1688   -c                      print a warning if a comment is found\n"));
   1689 #endif
   1690 }
   1691 
   1692 /* We have no need to default values of symbols.  */
   1694 
   1695 symbolS *
   1696 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
   1697 {
   1698   return NULL;
   1699 }
   1700 
   1701 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
   1702 #define nonzero_dibits(x) \
   1703   ((x) | (((x) & 0x55555555) << 1) | (((x) & 0xAAAAAAAA) >> 1))
   1704 #define arg_reloc_stub_needed(CALLER, CALLEE) \
   1705   (((CALLER) ^ (CALLEE)) & nonzero_dibits (CALLER) & nonzero_dibits (CALLEE))
   1706 #else
   1707 #define arg_reloc_stub_needed(CALLER, CALLEE) 0
   1708 #endif
   1709 
   1710 /* Apply a fixup to an instruction.  */
   1711 
   1712 void
   1713 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
   1714 {
   1715   char *fixpos;
   1716   struct hppa_fix_struct *hppa_fixP;
   1717   offsetT new_val;
   1718   int insn, val, fmt;
   1719 
   1720   /* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can
   1721      never be "applied" (they are just markers).  Likewise for
   1722      R_HPPA_BEGIN_BRTAB and R_HPPA_END_BRTAB.  */
   1723 #ifdef OBJ_SOM
   1724   if (fixP->fx_r_type == R_HPPA_ENTRY
   1725       || fixP->fx_r_type == R_HPPA_EXIT
   1726       || fixP->fx_r_type == R_HPPA_BEGIN_BRTAB
   1727       || fixP->fx_r_type == R_HPPA_END_BRTAB
   1728       || fixP->fx_r_type == R_HPPA_BEGIN_TRY)
   1729     return;
   1730 
   1731   /* Disgusting.  We must set fx_offset ourselves -- R_HPPA_END_TRY
   1732      fixups are considered not adjustable, which in turn causes
   1733      adjust_reloc_syms to not set fx_offset.  Ugh.  */
   1734   if (fixP->fx_r_type == R_HPPA_END_TRY)
   1735     {
   1736       fixP->fx_offset = * valP;
   1737       return;
   1738     }
   1739 #endif
   1740 #ifdef OBJ_ELF
   1741   if (fixP->fx_r_type == (int) R_PARISC_GNU_VTENTRY
   1742       || fixP->fx_r_type == (int) R_PARISC_GNU_VTINHERIT)
   1743     return;
   1744 #endif
   1745 
   1746   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
   1747     fixP->fx_done = 1;
   1748 
   1749   /* There should be a HPPA specific fixup associated with the GAS fixup.  */
   1750   hppa_fixP = (struct hppa_fix_struct *) fixP->tc_fix_data;
   1751   if (hppa_fixP == NULL)
   1752     {
   1753       as_bad_where (fixP->fx_file, fixP->fx_line,
   1754 		    _("no hppa_fixup entry for fixup type 0x%x"),
   1755 		    fixP->fx_r_type);
   1756       return;
   1757     }
   1758 
   1759   fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
   1760 
   1761   if (fixP->fx_size != 4 || hppa_fixP->fx_r_format == 32)
   1762     {
   1763       /* Handle constant output. */
   1764       number_to_chars_bigendian (fixpos, *valP, fixP->fx_size);
   1765       return;
   1766     }
   1767 
   1768   insn = bfd_get_32 (stdoutput, fixpos);
   1769   fmt = bfd_hppa_insn2fmt (stdoutput, insn);
   1770 
   1771   /* If there is a symbol associated with this fixup, then it's something
   1772      which will need a SOM relocation (except for some PC-relative relocs).
   1773      In such cases we should treat the "val" or "addend" as zero since it
   1774      will be added in as needed from fx_offset in tc_gen_reloc.  */
   1775   if ((fixP->fx_addsy != NULL
   1776        || fixP->fx_r_type == (int) R_HPPA_NONE)
   1777 #ifdef OBJ_SOM
   1778       && fmt != 32
   1779 #endif
   1780       )
   1781     new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0);
   1782 #ifdef OBJ_SOM
   1783   /* These field selectors imply that we do not want an addend.  */
   1784   else if (hppa_fixP->fx_r_field == e_psel
   1785 	   || hppa_fixP->fx_r_field == e_rpsel
   1786 	   || hppa_fixP->fx_r_field == e_lpsel
   1787 	   || hppa_fixP->fx_r_field == e_tsel
   1788 	   || hppa_fixP->fx_r_field == e_rtsel
   1789 	   || hppa_fixP->fx_r_field == e_ltsel)
   1790     new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0);
   1791 #endif
   1792   else
   1793     new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field);
   1794 
   1795   /* Handle pc-relative exceptions from above.  */
   1796   if ((fmt == 12 || fmt == 17 || fmt == 22)
   1797       && fixP->fx_addsy
   1798       && fixP->fx_pcrel
   1799       && !arg_reloc_stub_needed (symbol_arg_reloc_info (fixP->fx_addsy),
   1800 				 hppa_fixP->fx_arg_reloc)
   1801 #ifdef OBJ_ELF
   1802       && (* valP - 8 + 8192 < 16384
   1803 	  || (fmt == 17 && * valP - 8 + 262144 < 524288)
   1804 	  || (fmt == 22 && * valP - 8 + 8388608 < 16777216))
   1805 #endif
   1806 #ifdef OBJ_SOM
   1807       && (* valP - 8 + 262144 < 524288
   1808 	  || (fmt == 22 && * valP - 8 + 8388608 < 16777216))
   1809 #endif
   1810       && !S_IS_EXTERNAL (fixP->fx_addsy)
   1811       && !S_IS_WEAK (fixP->fx_addsy)
   1812       && S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment
   1813       && !(fixP->fx_subsy
   1814 	   && S_GET_SEGMENT (fixP->fx_subsy) != hppa_fixP->segment))
   1815     {
   1816       new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field);
   1817     }
   1818 
   1819   switch (fmt)
   1820     {
   1821     case 10:
   1822       CHECK_FIELD_WHERE (new_val, 8191, -8192,
   1823 			 fixP->fx_file, fixP->fx_line);
   1824       val = new_val;
   1825 
   1826       insn = (insn & ~ 0x3ff1) | (((val & 0x1ff8) << 1)
   1827 				  | ((val & 0x2000) >> 13));
   1828       break;
   1829     case -11:
   1830       CHECK_FIELD_WHERE (new_val, 8191, -8192,
   1831 			 fixP->fx_file, fixP->fx_line);
   1832       val = new_val;
   1833 
   1834       insn = (insn & ~ 0x3ff9) | (((val & 0x1ffc) << 1)
   1835 				  | ((val & 0x2000) >> 13));
   1836       break;
   1837       /* Handle all opcodes with the 'j' operand type.  */
   1838     case 14:
   1839       CHECK_FIELD_WHERE (new_val, 8191, -8192,
   1840 			 fixP->fx_file, fixP->fx_line);
   1841       val = new_val;
   1842 
   1843       insn = ((insn & ~ 0x3fff) | low_sign_unext (val, 14));
   1844       break;
   1845 
   1846       /* Handle all opcodes with the 'k' operand type.  */
   1847     case 21:
   1848       CHECK_FIELD_WHERE (new_val, 1048575, -1048576,
   1849 			 fixP->fx_file, fixP->fx_line);
   1850       val = new_val;
   1851 
   1852       insn = (insn & ~ 0x1fffff) | re_assemble_21 (val);
   1853       break;
   1854 
   1855       /* Handle all the opcodes with the 'i' operand type.  */
   1856     case 11:
   1857       CHECK_FIELD_WHERE (new_val, 1023, -1024,
   1858 			 fixP->fx_file, fixP->fx_line);
   1859       val = new_val;
   1860 
   1861       insn = (insn & ~ 0x7ff) | low_sign_unext (val, 11);
   1862       break;
   1863 
   1864       /* Handle all the opcodes with the 'w' operand type.  */
   1865     case 12:
   1866       CHECK_FIELD_WHERE (new_val - 8, 8191, -8192,
   1867 			 fixP->fx_file, fixP->fx_line);
   1868       val = new_val - 8;
   1869 
   1870       insn = (insn & ~ 0x1ffd) | re_assemble_12 (val >> 2);
   1871       break;
   1872 
   1873       /* Handle some of the opcodes with the 'W' operand type.  */
   1874     case 17:
   1875       {
   1876 	offsetT distance = * valP;
   1877 
   1878 	/* If this is an absolute branch (ie no link) with an out of
   1879 	   range target, then we want to complain.  */
   1880 	if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL
   1881 	    && (insn & 0xffe00000) == 0xe8000000)
   1882 	  CHECK_FIELD_WHERE (distance - 8, 262143, -262144,
   1883 			     fixP->fx_file, fixP->fx_line);
   1884 
   1885 	CHECK_FIELD_WHERE (new_val - 8, 262143, -262144,
   1886 			   fixP->fx_file, fixP->fx_line);
   1887 	val = new_val - 8;
   1888 
   1889 	insn = (insn & ~ 0x1f1ffd) | re_assemble_17 (val >> 2);
   1890 	break;
   1891       }
   1892 
   1893     case 22:
   1894       {
   1895 	offsetT distance = * valP;
   1896 
   1897 	/* If this is an absolute branch (ie no link) with an out of
   1898 	   range target, then we want to complain.  */
   1899 	if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL
   1900 	    && (insn & 0xffe00000) == 0xe8000000)
   1901 	  CHECK_FIELD_WHERE (distance - 8, 8388607, -8388608,
   1902 			     fixP->fx_file, fixP->fx_line);
   1903 
   1904 	CHECK_FIELD_WHERE (new_val - 8, 8388607, -8388608,
   1905 			   fixP->fx_file, fixP->fx_line);
   1906 	val = new_val - 8;
   1907 
   1908 	insn = (insn & ~ 0x3ff1ffd) | re_assemble_22 (val >> 2);
   1909 	break;
   1910       }
   1911 
   1912     case -10:
   1913       val = new_val;
   1914       insn = (insn & ~ 0xfff1) | re_assemble_16 (val & -8);
   1915       break;
   1916 
   1917     case -16:
   1918       val = new_val;
   1919       insn = (insn & ~ 0xfff9) | re_assemble_16 (val & -4);
   1920       break;
   1921 
   1922     case 16:
   1923       val = new_val;
   1924       insn = (insn & ~ 0xffff) | re_assemble_16 (val);
   1925       break;
   1926 
   1927     case 32:
   1928       insn = new_val;
   1929       break;
   1930 
   1931     default:
   1932       as_bad_where (fixP->fx_file, fixP->fx_line,
   1933 		    _("Unknown relocation encountered in md_apply_fix."));
   1934       return;
   1935     }
   1936 
   1937 #ifdef OBJ_ELF
   1938   switch (fixP->fx_r_type)
   1939     {
   1940       case R_PARISC_TLS_GD21L:
   1941       case R_PARISC_TLS_GD14R:
   1942       case R_PARISC_TLS_LDM21L:
   1943       case R_PARISC_TLS_LDM14R:
   1944       case R_PARISC_TLS_LE21L:
   1945       case R_PARISC_TLS_LE14R:
   1946       case R_PARISC_TLS_IE21L:
   1947       case R_PARISC_TLS_IE14R:
   1948 	if (fixP->fx_addsy)
   1949 	  S_SET_THREAD_LOCAL (fixP->fx_addsy);
   1950 	break;
   1951       default:
   1952 	break;
   1953     }
   1954 #endif
   1955 
   1956   /* Insert the relocation.  */
   1957   bfd_put_32 (stdoutput, insn, fixpos);
   1958 }
   1959 
   1960 /* Exactly what point is a PC-relative offset relative TO?
   1961    On the PA, they're relative to the address of the offset.  */
   1962 
   1963 long
   1964 md_pcrel_from (fixS *fixP)
   1965 {
   1966   return fixP->fx_where + fixP->fx_frag->fr_address;
   1967 }
   1968 
   1969 /* Return nonzero if the input line pointer is at the end of
   1970    a statement.  */
   1971 
   1972 static int
   1973 is_end_of_statement (void)
   1974 {
   1975   return ((*input_line_pointer == '\n')
   1976 	  || (*input_line_pointer == ';')
   1977 	  || (*input_line_pointer == '!'));
   1978 }
   1979 
   1980 #define REG_NAME_CNT	(sizeof (pre_defined_registers) / sizeof (struct pd_reg))
   1981 
   1982 /* Given NAME, find the register number associated with that name, return
   1983    the integer value associated with the given name or -1 on failure.  */
   1984 
   1985 static int
   1986 reg_name_search (char *name)
   1987 {
   1988   int middle, low, high;
   1989   int cmp;
   1990 
   1991   low = 0;
   1992   high = REG_NAME_CNT - 1;
   1993 
   1994   do
   1995     {
   1996       middle = (low + high) / 2;
   1997       cmp = strcasecmp (name, pre_defined_registers[middle].name);
   1998       if (cmp < 0)
   1999 	high = middle - 1;
   2000       else if (cmp > 0)
   2001 	low = middle + 1;
   2002       else
   2003 	return pre_defined_registers[middle].value;
   2004     }
   2005   while (low <= high);
   2006 
   2007   return -1;
   2008 }
   2009 
   2010 /* Read a number from S.  The number might come in one of many forms,
   2011    the most common will be a hex or decimal constant, but it could be
   2012    a pre-defined register (Yuk!), or an absolute symbol.
   2013 
   2014    Return 1 on success or 0 on failure.  If STRICT, then a missing
   2015    register prefix will cause a failure.  The number itself is
   2016    returned in `pa_number'.
   2017 
   2018    IS_FLOAT indicates that a PA-89 FP register number should be
   2019    parsed;  A `l' or `r' suffix is checked for if but 2 of IS_FLOAT is
   2020    not set.
   2021 
   2022    pa_parse_number can not handle negative constants and will fail
   2023    horribly if it is passed such a constant.  */
   2024 
   2025 static int
   2026 pa_parse_number (char **s, int is_float)
   2027 {
   2028   int num;
   2029   char *name;
   2030   char c;
   2031   symbolS *sym;
   2032   int status;
   2033   char *p = *s;
   2034   bfd_boolean have_prefix;
   2035 
   2036   /* Skip whitespace before the number.  */
   2037   while (*p == ' ' || *p == '\t')
   2038     p = p + 1;
   2039 
   2040   pa_number = -1;
   2041   have_prefix = 0;
   2042   num = 0;
   2043   if (!strict && ISDIGIT (*p))
   2044     {
   2045       /* Looks like a number.  */
   2046 
   2047       if (*p == '0' && (*(p + 1) == 'x' || *(p + 1) == 'X'))
   2048 	{
   2049 	  /* The number is specified in hex.  */
   2050 	  p += 2;
   2051 	  while (ISDIGIT (*p) || ((*p >= 'a') && (*p <= 'f'))
   2052 		 || ((*p >= 'A') && (*p <= 'F')))
   2053 	    {
   2054 	      if (ISDIGIT (*p))
   2055 		num = num * 16 + *p - '0';
   2056 	      else if (*p >= 'a' && *p <= 'f')
   2057 		num = num * 16 + *p - 'a' + 10;
   2058 	      else
   2059 		num = num * 16 + *p - 'A' + 10;
   2060 	      ++p;
   2061 	    }
   2062 	}
   2063       else
   2064 	{
   2065 	  /* The number is specified in decimal.  */
   2066 	  while (ISDIGIT (*p))
   2067 	    {
   2068 	      num = num * 10 + *p - '0';
   2069 	      ++p;
   2070 	    }
   2071 	}
   2072 
   2073       pa_number = num;
   2074 
   2075       /* Check for a `l' or `r' suffix.  */
   2076       if (is_float)
   2077 	{
   2078 	  pa_number += FP_REG_BASE;
   2079 	  if (! (is_float & 2))
   2080 	    {
   2081 	      if (IS_R_SELECT (p))
   2082 		{
   2083 		  pa_number += FP_REG_RSEL;
   2084 		  ++p;
   2085 		}
   2086 	      else if (IS_L_SELECT (p))
   2087 		{
   2088 		  ++p;
   2089 		}
   2090 	    }
   2091 	}
   2092     }
   2093   else if (*p == '%')
   2094     {
   2095       /* The number might be a predefined register.  */
   2096       have_prefix = 1;
   2097       name = p;
   2098       p++;
   2099       c = *p;
   2100       /* Tege hack: Special case for general registers as the general
   2101 	 code makes a binary search with case translation, and is VERY
   2102 	 slow.  */
   2103       if (c == 'r')
   2104 	{
   2105 	  p++;
   2106 	  if (*p == 'e' && *(p + 1) == 't'
   2107 	      && (*(p + 2) == '0' || *(p + 2) == '1'))
   2108 	    {
   2109 	      p += 2;
   2110 	      num = *p - '0' + 28;
   2111 	      p++;
   2112 	    }
   2113 	  else if (*p == 'p')
   2114 	    {
   2115 	      num = 2;
   2116 	      p++;
   2117 	    }
   2118 	  else if (!ISDIGIT (*p))
   2119 	    {
   2120 	      if (print_errors)
   2121 		as_bad (_("Undefined register: '%s'."), name);
   2122 	      num = -1;
   2123 	    }
   2124 	  else
   2125 	    {
   2126 	      do
   2127 		num = num * 10 + *p++ - '0';
   2128 	      while (ISDIGIT (*p));
   2129 	    }
   2130 	}
   2131       else
   2132 	{
   2133 	  /* Do a normal register search.  */
   2134 	  while (is_part_of_name (c))
   2135 	    {
   2136 	      p = p + 1;
   2137 	      c = *p;
   2138 	    }
   2139 	  *p = 0;
   2140 	  status = reg_name_search (name);
   2141 	  if (status >= 0)
   2142 	    num = status;
   2143 	  else
   2144 	    {
   2145 	      if (print_errors)
   2146 		as_bad (_("Undefined register: '%s'."), name);
   2147 	      num = -1;
   2148 	    }
   2149 	  *p = c;
   2150 	}
   2151 
   2152       pa_number = num;
   2153     }
   2154   else
   2155     {
   2156       /* And finally, it could be a symbol in the absolute section which
   2157 	 is effectively a constant, or a register alias symbol.  */
   2158       name = p;
   2159       c = *p;
   2160       while (is_part_of_name (c))
   2161 	{
   2162 	  p = p + 1;
   2163 	  c = *p;
   2164 	}
   2165       *p = 0;
   2166       if ((sym = symbol_find (name)) != NULL)
   2167 	{
   2168 	  if (S_GET_SEGMENT (sym) == reg_section)
   2169 	    {
   2170 	      num = S_GET_VALUE (sym);
   2171 	      /* Well, we don't really have one, but we do have a
   2172 		 register, so...  */
   2173 	      have_prefix = TRUE;
   2174 	    }
   2175 	  else if (S_GET_SEGMENT (sym) == bfd_abs_section_ptr)
   2176 	    num = S_GET_VALUE (sym);
   2177 	  else if (!strict)
   2178 	    {
   2179 	      if (print_errors)
   2180 		as_bad (_("Non-absolute symbol: '%s'."), name);
   2181 	      num = -1;
   2182 	    }
   2183 	}
   2184       else if (!strict)
   2185 	{
   2186 	  /* There is where we'd come for an undefined symbol
   2187 	     or for an empty string.  For an empty string we
   2188 	     will return zero.  That's a concession made for
   2189 	     compatibility with the braindamaged HP assemblers.  */
   2190 	  if (*name == 0)
   2191 	    num = 0;
   2192 	  else
   2193 	    {
   2194 	      if (print_errors)
   2195 		as_bad (_("Undefined absolute constant: '%s'."), name);
   2196 	      num = -1;
   2197 	    }
   2198 	}
   2199       *p = c;
   2200 
   2201       pa_number = num;
   2202     }
   2203 
   2204   if (!strict || have_prefix)
   2205     {
   2206       *s = p;
   2207       return 1;
   2208     }
   2209   return 0;
   2210 }
   2211 
   2212 /* Return nonzero if the given INSN and L/R information will require
   2213    a new PA-1.1 opcode.  */
   2214 
   2215 static int
   2216 need_pa11_opcode (void)
   2217 {
   2218   if ((pa_number & FP_REG_RSEL) != 0
   2219       && !(the_insn.fpof1 == DBL && the_insn.fpof2 == DBL))
   2220     {
   2221       /* If this instruction is specific to a particular architecture,
   2222 	 then set a new architecture.  */
   2223       if (bfd_get_mach (stdoutput) < pa11)
   2224 	{
   2225 	  if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, pa11))
   2226 	    as_warn (_("could not update architecture and machine"));
   2227 	}
   2228       return TRUE;
   2229     }
   2230   else
   2231     return FALSE;
   2232 }
   2233 
   2234 /* Parse a condition for a fcmp instruction.  Return the numerical
   2235    code associated with the condition.  */
   2236 
   2237 static int
   2238 pa_parse_fp_cmp_cond (char **s)
   2239 {
   2240   int cond, i;
   2241 
   2242   cond = 0;
   2243 
   2244   for (i = 0; i < 32; i++)
   2245     {
   2246       if (strncasecmp (*s, fp_cond_map[i].string,
   2247 		       strlen (fp_cond_map[i].string)) == 0)
   2248 	{
   2249 	  cond = fp_cond_map[i].cond;
   2250 	  *s += strlen (fp_cond_map[i].string);
   2251 	  /* If not a complete match, back up the input string and
   2252 	     report an error.  */
   2253 	  if (**s != ' ' && **s != '\t')
   2254 	    {
   2255 	      *s -= strlen (fp_cond_map[i].string);
   2256 	      break;
   2257 	    }
   2258 	  while (**s == ' ' || **s == '\t')
   2259 	    *s = *s + 1;
   2260 	  return cond;
   2261 	}
   2262     }
   2263 
   2264   as_bad (_("Invalid FP Compare Condition: %s"), *s);
   2265 
   2266   /* Advance over the bogus completer.  */
   2267   while (**s != ',' && **s != ' ' && **s != '\t')
   2268     *s += 1;
   2269 
   2270   return 0;
   2271 }
   2272 
   2273 /* Parse a graphics test complete for ftest.  */
   2274 
   2275 static int
   2276 pa_parse_ftest_gfx_completer (char **s)
   2277 {
   2278   int value;
   2279 
   2280   value = 0;
   2281   if (strncasecmp (*s, "acc8", 4) == 0)
   2282     {
   2283       value = 5;
   2284       *s += 4;
   2285     }
   2286   else if (strncasecmp (*s, "acc6", 4) == 0)
   2287     {
   2288       value = 9;
   2289       *s += 4;
   2290     }
   2291   else if (strncasecmp (*s, "acc4", 4) == 0)
   2292     {
   2293       value = 13;
   2294       *s += 4;
   2295     }
   2296   else if (strncasecmp (*s, "acc2", 4) == 0)
   2297     {
   2298       value = 17;
   2299       *s += 4;
   2300     }
   2301   else if (strncasecmp (*s, "acc", 3) == 0)
   2302     {
   2303       value = 1;
   2304       *s += 3;
   2305     }
   2306   else if (strncasecmp (*s, "rej8", 4) == 0)
   2307     {
   2308       value = 6;
   2309       *s += 4;
   2310     }
   2311   else if (strncasecmp (*s, "rej", 3) == 0)
   2312     {
   2313       value = 2;
   2314       *s += 3;
   2315     }
   2316   else
   2317     {
   2318       value = 0;
   2319       as_bad (_("Invalid FTEST completer: %s"), *s);
   2320     }
   2321 
   2322   return value;
   2323 }
   2324 
   2325 /* Parse an FP operand format completer returning the completer
   2326    type.  */
   2327 
   2328 static fp_operand_format
   2329 pa_parse_fp_cnv_format (char **s)
   2330 {
   2331   int format;
   2332 
   2333   format = SGL;
   2334   if (**s == ',')
   2335     {
   2336       *s += 1;
   2337       if (strncasecmp (*s, "sgl", 3) == 0)
   2338 	{
   2339 	  format = SGL;
   2340 	  *s += 4;
   2341 	}
   2342       else if (strncasecmp (*s, "dbl", 3) == 0)
   2343 	{
   2344 	  format = DBL;
   2345 	  *s += 4;
   2346 	}
   2347       else if (strncasecmp (*s, "quad", 4) == 0)
   2348 	{
   2349 	  format = QUAD;
   2350 	  *s += 5;
   2351 	}
   2352       else if (strncasecmp (*s, "w", 1) == 0)
   2353 	{
   2354 	  format = W;
   2355 	  *s += 2;
   2356 	}
   2357       else if (strncasecmp (*s, "uw", 2) == 0)
   2358 	{
   2359 	  format = UW;
   2360 	  *s += 3;
   2361 	}
   2362       else if (strncasecmp (*s, "dw", 2) == 0)
   2363 	{
   2364 	  format = DW;
   2365 	  *s += 3;
   2366 	}
   2367       else if (strncasecmp (*s, "udw", 3) == 0)
   2368 	{
   2369 	  format = UDW;
   2370 	  *s += 4;
   2371 	}
   2372       else if (strncasecmp (*s, "qw", 2) == 0)
   2373 	{
   2374 	  format = QW;
   2375 	  *s += 3;
   2376 	}
   2377       else if (strncasecmp (*s, "uqw", 3) == 0)
   2378 	{
   2379 	  format = UQW;
   2380 	  *s += 4;
   2381 	}
   2382       else
   2383 	{
   2384 	  format = ILLEGAL_FMT;
   2385 	  as_bad (_("Invalid FP Operand Format: %3s"), *s);
   2386 	}
   2387     }
   2388 
   2389   return format;
   2390 }
   2391 
   2392 /* Parse an FP operand format completer returning the completer
   2393    type.  */
   2394 
   2395 static fp_operand_format
   2396 pa_parse_fp_format (char **s)
   2397 {
   2398   int format;
   2399 
   2400   format = SGL;
   2401   if (**s == ',')
   2402     {
   2403       *s += 1;
   2404       if (strncasecmp (*s, "sgl", 3) == 0)
   2405 	{
   2406 	  format = SGL;
   2407 	  *s += 4;
   2408 	}
   2409       else if (strncasecmp (*s, "dbl", 3) == 0)
   2410 	{
   2411 	  format = DBL;
   2412 	  *s += 4;
   2413 	}
   2414       else if (strncasecmp (*s, "quad", 4) == 0)
   2415 	{
   2416 	  format = QUAD;
   2417 	  *s += 5;
   2418 	}
   2419       else
   2420 	{
   2421 	  format = ILLEGAL_FMT;
   2422 	  as_bad (_("Invalid FP Operand Format: %3s"), *s);
   2423 	}
   2424     }
   2425 
   2426   return format;
   2427 }
   2428 
   2429 /* Convert from a selector string into a selector type.  */
   2430 
   2431 static int
   2432 pa_chk_field_selector (char **str)
   2433 {
   2434   int middle, low, high;
   2435   int cmp;
   2436   char name[4];
   2437 
   2438   /* Read past any whitespace.  */
   2439   /* FIXME: should we read past newlines and formfeeds??? */
   2440   while (**str == ' ' || **str == '\t' || **str == '\n' || **str == '\f')
   2441     *str = *str + 1;
   2442 
   2443   if ((*str)[1] == '\'' || (*str)[1] == '%')
   2444     name[0] = TOLOWER ((*str)[0]),
   2445     name[1] = 0;
   2446   else if ((*str)[2] == '\'' || (*str)[2] == '%')
   2447     name[0] = TOLOWER ((*str)[0]),
   2448     name[1] = TOLOWER ((*str)[1]),
   2449     name[2] = 0;
   2450   else if ((*str)[3] == '\'' || (*str)[3] == '%')
   2451     name[0] = TOLOWER ((*str)[0]),
   2452     name[1] = TOLOWER ((*str)[1]),
   2453     name[2] = TOLOWER ((*str)[2]),
   2454     name[3] = 0;
   2455   else
   2456     return e_fsel;
   2457 
   2458   low = 0;
   2459   high = sizeof (selector_table) / sizeof (struct selector_entry) - 1;
   2460 
   2461   do
   2462     {
   2463       middle = (low + high) / 2;
   2464       cmp = strcmp (name, selector_table[middle].prefix);
   2465       if (cmp < 0)
   2466 	high = middle - 1;
   2467       else if (cmp > 0)
   2468 	low = middle + 1;
   2469       else
   2470 	{
   2471 	  *str += strlen (name) + 1;
   2472 #ifndef OBJ_SOM
   2473 	  if (selector_table[middle].field_selector == e_nsel)
   2474 	    return e_fsel;
   2475 #endif
   2476 	  return selector_table[middle].field_selector;
   2477 	}
   2478     }
   2479   while (low <= high);
   2480 
   2481   return e_fsel;
   2482 }
   2483 
   2484 /* Parse a .byte, .word, .long expression for the HPPA.  Called by
   2485    cons via the TC_PARSE_CONS_EXPRESSION macro.  */
   2486 
   2487 int
   2488 parse_cons_expression_hppa (expressionS *exp)
   2489 {
   2490   int hppa_field_selector = pa_chk_field_selector (&input_line_pointer);
   2491   expression (exp);
   2492   return hppa_field_selector;
   2493 }
   2494 
   2495 /* Evaluate an absolute expression EXP which may be modified by
   2496    the selector FIELD_SELECTOR.  Return the value of the expression.  */
   2497 static int
   2498 evaluate_absolute (struct pa_it *insn)
   2499 {
   2500   offsetT value;
   2501   expressionS exp;
   2502   int field_selector = insn->field_selector;
   2503 
   2504   exp = insn->exp;
   2505   value = exp.X_add_number;
   2506 
   2507   return hppa_field_adjust (0, value, field_selector);
   2508 }
   2509 
   2510 /* Mark (via expr_end) the end of an absolute expression.  FIXME.  */
   2511 
   2512 static int
   2513 pa_get_absolute_expression (struct pa_it *insn, char **strp)
   2514 {
   2515   char *save_in;
   2516 
   2517   insn->field_selector = pa_chk_field_selector (strp);
   2518   save_in = input_line_pointer;
   2519   input_line_pointer = *strp;
   2520   expression (&insn->exp);
   2521   expr_end = input_line_pointer;
   2522   input_line_pointer = save_in;
   2523   if (insn->exp.X_op != O_constant)
   2524     {
   2525       /* We have a non-match in strict mode.  */
   2526       if (!strict)
   2527 	as_bad (_("Bad segment (should be absolute)."));
   2528       return 0;
   2529     }
   2530   return evaluate_absolute (insn);
   2531 }
   2532 
   2533 /* Get an absolute number.  The input string is terminated at the
   2534    first whitespace character.  */
   2535 
   2536 static int
   2537 pa_get_number (struct pa_it *insn, char **strp)
   2538 {
   2539   char *save_in;
   2540   char *s, c;
   2541   int result;
   2542 
   2543   save_in = input_line_pointer;
   2544   input_line_pointer = *strp;
   2545 
   2546   /* The PA assembly syntax is ambiguous in a variety of ways.  Consider
   2547      this string "4 %r5"  Is that the number 4 followed by the register
   2548      r5, or is that 4 MOD r5?  This situation occurs for example in the
   2549      coprocessor load and store instructions.  Previously, calling
   2550      pa_get_absolute_expression directly results in r5 being entered
   2551      in the symbol table.
   2552 
   2553      So, when looking for an absolute number, we cut off the input string
   2554      at the first whitespace character.  Thus, expressions should generally
   2555      contain no whitespace.  */
   2556 
   2557   s = *strp;
   2558   while (*s != ',' && *s != ' ' && *s != '\t')
   2559     s++;
   2560 
   2561   c = *s;
   2562   *s = 0;
   2563 
   2564   result = pa_get_absolute_expression (insn, strp);
   2565 
   2566   input_line_pointer = save_in;
   2567   *s = c;
   2568   return result;
   2569 }
   2570 
   2571 /* Given an argument location specification return the associated
   2572    argument location number.  */
   2573 
   2574 static unsigned int
   2575 pa_build_arg_reloc (char *type_name)
   2576 {
   2577 
   2578   if (strncasecmp (type_name, "no", 2) == 0)
   2579     return 0;
   2580   if (strncasecmp (type_name, "gr", 2) == 0)
   2581     return 1;
   2582   else if (strncasecmp (type_name, "fr", 2) == 0)
   2583     return 2;
   2584   else if (strncasecmp (type_name, "fu", 2) == 0)
   2585     return 3;
   2586   else
   2587     as_bad (_("Invalid argument location: %s\n"), type_name);
   2588 
   2589   return 0;
   2590 }
   2591 
   2592 /* Encode and return an argument relocation specification for
   2593    the given register in the location specified by arg_reloc.  */
   2594 
   2595 static unsigned int
   2596 pa_align_arg_reloc (unsigned int reg, unsigned int arg_reloc)
   2597 {
   2598   unsigned int new_reloc;
   2599 
   2600   new_reloc = arg_reloc;
   2601   switch (reg)
   2602     {
   2603     case 0:
   2604       new_reloc <<= 8;
   2605       break;
   2606     case 1:
   2607       new_reloc <<= 6;
   2608       break;
   2609     case 2:
   2610       new_reloc <<= 4;
   2611       break;
   2612     case 3:
   2613       new_reloc <<= 2;
   2614       break;
   2615     default:
   2616       as_bad (_("Invalid argument description: %d"), reg);
   2617     }
   2618 
   2619   return new_reloc;
   2620 }
   2621 
   2622 /* Parse a non-negated compare/subtract completer returning the
   2623    number (for encoding in instructions) of the given completer.  */
   2624 
   2625 static int
   2626 pa_parse_nonneg_cmpsub_cmpltr (char **s)
   2627 {
   2628   int cmpltr;
   2629   char *name = *s + 1;
   2630   char c;
   2631   char *save_s = *s;
   2632   int nullify = 0;
   2633 
   2634   cmpltr = 0;
   2635   if (**s == ',')
   2636     {
   2637       *s += 1;
   2638       while (**s != ',' && **s != ' ' && **s != '\t')
   2639 	*s += 1;
   2640       c = **s;
   2641       **s = 0x00;
   2642 
   2643       if (strcmp (name, "=") == 0)
   2644 	{
   2645 	  cmpltr = 1;
   2646 	}
   2647       else if (strcmp (name, "<") == 0)
   2648 	{
   2649 	  cmpltr = 2;
   2650 	}
   2651       else if (strcmp (name, "<=") == 0)
   2652 	{
   2653 	  cmpltr = 3;
   2654 	}
   2655       else if (strcmp (name, "<<") == 0)
   2656 	{
   2657 	  cmpltr = 4;
   2658 	}
   2659       else if (strcmp (name, "<<=") == 0)
   2660 	{
   2661 	  cmpltr = 5;
   2662 	}
   2663       else if (strcasecmp (name, "sv") == 0)
   2664 	{
   2665 	  cmpltr = 6;
   2666 	}
   2667       else if (strcasecmp (name, "od") == 0)
   2668 	{
   2669 	  cmpltr = 7;
   2670 	}
   2671       /* If we have something like addb,n then there is no condition
   2672 	 completer.  */
   2673       else if (strcasecmp (name, "n") == 0)
   2674 	{
   2675 	  cmpltr = 0;
   2676 	  nullify = 1;
   2677 	}
   2678       else
   2679 	{
   2680 	  cmpltr = -1;
   2681 	}
   2682       **s = c;
   2683     }
   2684 
   2685   /* Reset pointers if this was really a ,n for a branch instruction.  */
   2686   if (nullify)
   2687     *s = save_s;
   2688 
   2689   return cmpltr;
   2690 }
   2691 
   2692 /* Parse a negated compare/subtract completer returning the
   2693    number (for encoding in instructions) of the given completer.  */
   2694 
   2695 static int
   2696 pa_parse_neg_cmpsub_cmpltr (char **s)
   2697 {
   2698   int cmpltr;
   2699   char *name = *s + 1;
   2700   char c;
   2701   char *save_s = *s;
   2702   int nullify = 0;
   2703 
   2704   cmpltr = 0;
   2705   if (**s == ',')
   2706     {
   2707       *s += 1;
   2708       while (**s != ',' && **s != ' ' && **s != '\t')
   2709 	*s += 1;
   2710       c = **s;
   2711       **s = 0x00;
   2712 
   2713       if (strcasecmp (name, "tr") == 0)
   2714 	{
   2715 	  cmpltr = 0;
   2716 	}
   2717       else if (strcmp (name, "<>") == 0)
   2718 	{
   2719 	  cmpltr = 1;
   2720 	}
   2721       else if (strcmp (name, ">=") == 0)
   2722 	{
   2723 	  cmpltr = 2;
   2724 	}
   2725       else if (strcmp (name, ">") == 0)
   2726 	{
   2727 	  cmpltr = 3;
   2728 	}
   2729       else if (strcmp (name, ">>=") == 0)
   2730 	{
   2731 	  cmpltr = 4;
   2732 	}
   2733       else if (strcmp (name, ">>") == 0)
   2734 	{
   2735 	  cmpltr = 5;
   2736 	}
   2737       else if (strcasecmp (name, "nsv") == 0)
   2738 	{
   2739 	  cmpltr = 6;
   2740 	}
   2741       else if (strcasecmp (name, "ev") == 0)
   2742 	{
   2743 	  cmpltr = 7;
   2744 	}
   2745       /* If we have something like addb,n then there is no condition
   2746 	 completer.  */
   2747       else if (strcasecmp (name, "n") == 0)
   2748 	{
   2749 	  cmpltr = 0;
   2750 	  nullify = 1;
   2751 	}
   2752       else
   2753 	{
   2754 	  cmpltr = -1;
   2755 	}
   2756       **s = c;
   2757     }
   2758 
   2759   /* Reset pointers if this was really a ,n for a branch instruction.  */
   2760   if (nullify)
   2761     *s = save_s;
   2762 
   2763   return cmpltr;
   2764 }
   2765 
   2766 /* Parse a 64 bit compare and branch completer returning the number (for
   2767    encoding in instructions) of the given completer.
   2768 
   2769    Nonnegated comparisons are returned as 0-7, negated comparisons are
   2770    returned as 8-15.  */
   2771 
   2772 static int
   2773 pa_parse_cmpb_64_cmpltr (char **s)
   2774 {
   2775   int cmpltr;
   2776   char *name = *s + 1;
   2777   char c;
   2778 
   2779   cmpltr = -1;
   2780   if (**s == ',')
   2781     {
   2782       *s += 1;
   2783       while (**s != ',' && **s != ' ' && **s != '\t')
   2784 	*s += 1;
   2785       c = **s;
   2786       **s = 0x00;
   2787 
   2788       if (strcmp (name, "*") == 0)
   2789 	{
   2790 	  cmpltr = 0;
   2791 	}
   2792       else if (strcmp (name, "*=") == 0)
   2793 	{
   2794 	  cmpltr = 1;
   2795 	}
   2796       else if (strcmp (name, "*<") == 0)
   2797 	{
   2798 	  cmpltr = 2;
   2799 	}
   2800       else if (strcmp (name, "*<=") == 0)
   2801 	{
   2802 	  cmpltr = 3;
   2803 	}
   2804       else if (strcmp (name, "*<<") == 0)
   2805 	{
   2806 	  cmpltr = 4;
   2807 	}
   2808       else if (strcmp (name, "*<<=") == 0)
   2809 	{
   2810 	  cmpltr = 5;
   2811 	}
   2812       else if (strcasecmp (name, "*sv") == 0)
   2813 	{
   2814 	  cmpltr = 6;
   2815 	}
   2816       else if (strcasecmp (name, "*od") == 0)
   2817 	{
   2818 	  cmpltr = 7;
   2819 	}
   2820       else if (strcasecmp (name, "*tr") == 0)
   2821 	{
   2822 	  cmpltr = 8;
   2823 	}
   2824       else if (strcmp (name, "*<>") == 0)
   2825 	{
   2826 	  cmpltr = 9;
   2827 	}
   2828       else if (strcmp (name, "*>=") == 0)
   2829 	{
   2830 	  cmpltr = 10;
   2831 	}
   2832       else if (strcmp (name, "*>") == 0)
   2833 	{
   2834 	  cmpltr = 11;
   2835 	}
   2836       else if (strcmp (name, "*>>=") == 0)
   2837 	{
   2838 	  cmpltr = 12;
   2839 	}
   2840       else if (strcmp (name, "*>>") == 0)
   2841 	{
   2842 	  cmpltr = 13;
   2843 	}
   2844       else if (strcasecmp (name, "*nsv") == 0)
   2845 	{
   2846 	  cmpltr = 14;
   2847 	}
   2848       else if (strcasecmp (name, "*ev") == 0)
   2849 	{
   2850 	  cmpltr = 15;
   2851 	}
   2852       else
   2853 	{
   2854 	  cmpltr = -1;
   2855 	}
   2856       **s = c;
   2857     }
   2858 
   2859   return cmpltr;
   2860 }
   2861 
   2862 /* Parse a 64 bit compare immediate and branch completer returning the number
   2863    (for encoding in instructions) of the given completer.  */
   2864 
   2865 static int
   2866 pa_parse_cmpib_64_cmpltr (char **s)
   2867 {
   2868   int cmpltr;
   2869   char *name = *s + 1;
   2870   char c;
   2871 
   2872   cmpltr = -1;
   2873   if (**s == ',')
   2874     {
   2875       *s += 1;
   2876       while (**s != ',' && **s != ' ' && **s != '\t')
   2877 	*s += 1;
   2878       c = **s;
   2879       **s = 0x00;
   2880 
   2881       if (strcmp (name, "*<<") == 0)
   2882 	{
   2883 	  cmpltr = 0;
   2884 	}
   2885       else if (strcmp (name, "*=") == 0)
   2886 	{
   2887 	  cmpltr = 1;
   2888 	}
   2889       else if (strcmp (name, "*<") == 0)
   2890 	{
   2891 	  cmpltr = 2;
   2892 	}
   2893       else if (strcmp (name, "*<=") == 0)
   2894 	{
   2895 	  cmpltr = 3;
   2896 	}
   2897       else if (strcmp (name, "*>>=") == 0)
   2898 	{
   2899 	  cmpltr = 4;
   2900 	}
   2901       else if (strcmp (name, "*<>") == 0)
   2902 	{
   2903 	  cmpltr = 5;
   2904 	}
   2905       else if (strcasecmp (name, "*>=") == 0)
   2906 	{
   2907 	  cmpltr = 6;
   2908 	}
   2909       else if (strcasecmp (name, "*>") == 0)
   2910 	{
   2911 	  cmpltr = 7;
   2912 	}
   2913       else
   2914 	{
   2915 	  cmpltr = -1;
   2916 	}
   2917       **s = c;
   2918     }
   2919 
   2920   return cmpltr;
   2921 }
   2922 
   2923 /* Parse a non-negated addition completer returning the number
   2924    (for encoding in instructions) of the given completer.  */
   2925 
   2926 static int
   2927 pa_parse_nonneg_add_cmpltr (char **s)
   2928 {
   2929   int cmpltr;
   2930   char *name = *s + 1;
   2931   char c;
   2932   char *save_s = *s;
   2933   int nullify = 0;
   2934 
   2935   cmpltr = 0;
   2936   if (**s == ',')
   2937     {
   2938       *s += 1;
   2939       while (**s != ',' && **s != ' ' && **s != '\t')
   2940 	*s += 1;
   2941       c = **s;
   2942       **s = 0x00;
   2943       if (strcmp (name, "=") == 0)
   2944 	{
   2945 	  cmpltr = 1;
   2946 	}
   2947       else if (strcmp (name, "<") == 0)
   2948 	{
   2949 	  cmpltr = 2;
   2950 	}
   2951       else if (strcmp (name, "<=") == 0)
   2952 	{
   2953 	  cmpltr = 3;
   2954 	}
   2955       else if (strcasecmp (name, "nuv") == 0)
   2956 	{
   2957 	  cmpltr = 4;
   2958 	}
   2959       else if (strcasecmp (name, "znv") == 0)
   2960 	{
   2961 	  cmpltr = 5;
   2962 	}
   2963       else if (strcasecmp (name, "sv") == 0)
   2964 	{
   2965 	  cmpltr = 6;
   2966 	}
   2967       else if (strcasecmp (name, "od") == 0)
   2968 	{
   2969 	  cmpltr = 7;
   2970 	}
   2971       /* If we have something like addb,n then there is no condition
   2972 	 completer.  */
   2973       else if (strcasecmp (name, "n") == 0)
   2974 	{
   2975 	  cmpltr = 0;
   2976 	  nullify = 1;
   2977 	}
   2978       else
   2979 	{
   2980 	  cmpltr = -1;
   2981 	}
   2982       **s = c;
   2983     }
   2984 
   2985   /* Reset pointers if this was really a ,n for a branch instruction.  */
   2986   if (nullify)
   2987     *s = save_s;
   2988 
   2989   return cmpltr;
   2990 }
   2991 
   2992 /* Parse a negated addition completer returning the number
   2993    (for encoding in instructions) of the given completer.  */
   2994 
   2995 static int
   2996 pa_parse_neg_add_cmpltr (char **s)
   2997 {
   2998   int cmpltr;
   2999   char *name = *s + 1;
   3000   char c;
   3001   char *save_s = *s;
   3002   int nullify = 0;
   3003 
   3004   cmpltr = 0;
   3005   if (**s == ',')
   3006     {
   3007       *s += 1;
   3008       while (**s != ',' && **s != ' ' && **s != '\t')
   3009 	*s += 1;
   3010       c = **s;
   3011       **s = 0x00;
   3012       if (strcasecmp (name, "tr") == 0)
   3013 	{
   3014 	  cmpltr = 0;
   3015 	}
   3016       else if (strcmp (name, "<>") == 0)
   3017 	{
   3018 	  cmpltr = 1;
   3019 	}
   3020       else if (strcmp (name, ">=") == 0)
   3021 	{
   3022 	  cmpltr = 2;
   3023 	}
   3024       else if (strcmp (name, ">") == 0)
   3025 	{
   3026 	  cmpltr = 3;
   3027 	}
   3028       else if (strcasecmp (name, "uv") == 0)
   3029 	{
   3030 	  cmpltr = 4;
   3031 	}
   3032       else if (strcasecmp (name, "vnz") == 0)
   3033 	{
   3034 	  cmpltr = 5;
   3035 	}
   3036       else if (strcasecmp (name, "nsv") == 0)
   3037 	{
   3038 	  cmpltr = 6;
   3039 	}
   3040       else if (strcasecmp (name, "ev") == 0)
   3041 	{
   3042 	  cmpltr = 7;
   3043 	}
   3044       /* If we have something like addb,n then there is no condition
   3045 	 completer.  */
   3046       else if (strcasecmp (name, "n") == 0)
   3047 	{
   3048 	  cmpltr = 0;
   3049 	  nullify = 1;
   3050 	}
   3051       else
   3052 	{
   3053 	  cmpltr = -1;
   3054 	}
   3055       **s = c;
   3056     }
   3057 
   3058   /* Reset pointers if this was really a ,n for a branch instruction.  */
   3059   if (nullify)
   3060     *s = save_s;
   3061 
   3062   return cmpltr;
   3063 }
   3064 
   3065 /* Parse a 64 bit wide mode add and branch completer returning the number (for
   3066    encoding in instructions) of the given completer.  */
   3067 
   3068 static int
   3069 pa_parse_addb_64_cmpltr (char **s)
   3070 {
   3071   int cmpltr;
   3072   char *name = *s + 1;
   3073   char c;
   3074   char *save_s = *s;
   3075   int nullify = 0;
   3076 
   3077   cmpltr = 0;
   3078   if (**s == ',')
   3079     {
   3080       *s += 1;
   3081       while (**s != ',' && **s != ' ' && **s != '\t')
   3082 	*s += 1;
   3083       c = **s;
   3084       **s = 0x00;
   3085       if (strcmp (name, "=") == 0)
   3086 	{
   3087 	  cmpltr = 1;
   3088 	}
   3089       else if (strcmp (name, "<") == 0)
   3090 	{
   3091 	  cmpltr = 2;
   3092 	}
   3093       else if (strcmp (name, "<=") == 0)
   3094 	{
   3095 	  cmpltr = 3;
   3096 	}
   3097       else if (strcasecmp (name, "nuv") == 0)
   3098 	{
   3099 	  cmpltr = 4;
   3100 	}
   3101       else if (strcasecmp (name, "*=") == 0)
   3102 	{
   3103 	  cmpltr = 5;
   3104 	}
   3105       else if (strcasecmp (name, "*<") == 0)
   3106 	{
   3107 	  cmpltr = 6;
   3108 	}
   3109       else if (strcasecmp (name, "*<=") == 0)
   3110 	{
   3111 	  cmpltr = 7;
   3112 	}
   3113       else if (strcmp (name, "tr") == 0)
   3114 	{
   3115 	  cmpltr = 8;
   3116 	}
   3117       else if (strcmp (name, "<>") == 0)
   3118 	{
   3119 	  cmpltr = 9;
   3120 	}
   3121       else if (strcmp (name, ">=") == 0)
   3122 	{
   3123 	  cmpltr = 10;
   3124 	}
   3125       else if (strcmp (name, ">") == 0)
   3126 	{
   3127 	  cmpltr = 11;
   3128 	}
   3129       else if (strcasecmp (name, "uv") == 0)
   3130 	{
   3131 	  cmpltr = 12;
   3132 	}
   3133       else if (strcasecmp (name, "*<>") == 0)
   3134 	{
   3135 	  cmpltr = 13;
   3136 	}
   3137       else if (strcasecmp (name, "*>=") == 0)
   3138 	{
   3139 	  cmpltr = 14;
   3140 	}
   3141       else if (strcasecmp (name, "*>") == 0)
   3142 	{
   3143 	  cmpltr = 15;
   3144 	}
   3145       /* If we have something like addb,n then there is no condition
   3146 	 completer.  */
   3147       else if (strcasecmp (name, "n") == 0)
   3148 	{
   3149 	  cmpltr = 0;
   3150 	  nullify = 1;
   3151 	}
   3152       else
   3153 	{
   3154 	  cmpltr = -1;
   3155 	}
   3156       **s = c;
   3157     }
   3158 
   3159   /* Reset pointers if this was really a ,n for a branch instruction.  */
   3160   if (nullify)
   3161     *s = save_s;
   3162 
   3163   return cmpltr;
   3164 }
   3165 
   3166 /* Do the real work for assembling a single instruction.  Store results
   3167    into the global "the_insn" variable.  */
   3168 
   3169 static void
   3170 pa_ip (char *str)
   3171 {
   3172   const char *error_message = "";
   3173   char *s, c, *argstart, *name, *save_s;
   3174   const char *args;
   3175   int match = FALSE;
   3176   int comma = 0;
   3177   int cmpltr, nullif, flag, cond, need_cond, num;
   3178   int immediate_check = 0, pos = -1, len = -1;
   3179   unsigned long opcode;
   3180   struct pa_opcode *insn;
   3181 
   3182 #ifdef OBJ_SOM
   3183   /* We must have a valid space and subspace.  */
   3184   pa_check_current_space_and_subspace ();
   3185 #endif
   3186 
   3187   /* Convert everything up to the first whitespace character into lower
   3188      case.  */
   3189   for (s = str; *s != ' ' && *s != '\t' && *s != '\n' && *s != '\0'; s++)
   3190     *s = TOLOWER (*s);
   3191 
   3192   /* Skip to something interesting.  */
   3193   for (s = str;
   3194        ISUPPER (*s) || ISLOWER (*s) || (*s >= '0' && *s <= '3');
   3195        ++s)
   3196     ;
   3197 
   3198   switch (*s)
   3199     {
   3200 
   3201     case '\0':
   3202       break;
   3203 
   3204     case ',':
   3205       comma = 1;
   3206 
   3207       /*FALLTHROUGH */
   3208 
   3209     case ' ':
   3210       *s++ = '\0';
   3211       break;
   3212 
   3213     default:
   3214       as_bad (_("Unknown opcode: `%s'"), str);
   3215       return;
   3216     }
   3217 
   3218   /* Look up the opcode in the hash table.  */
   3219   if ((insn = (struct pa_opcode *) hash_find (op_hash, str)) == NULL)
   3220     {
   3221       as_bad (_("Unknown opcode: `%s'"), str);
   3222       return;
   3223     }
   3224 
   3225   if (comma)
   3226     *--s = ',';
   3227 
   3228   /* Mark the location where arguments for the instruction start, then
   3229      start processing them.  */
   3230   argstart = s;
   3231   for (;;)
   3232     {
   3233       /* Do some initialization.  */
   3234       opcode = insn->match;
   3235       strict = (insn->flags & FLAG_STRICT);
   3236       memset (&the_insn, 0, sizeof (the_insn));
   3237       need_cond = 1;
   3238 
   3239       the_insn.reloc = R_HPPA_NONE;
   3240 
   3241       if (insn->arch >= pa20
   3242 	  && bfd_get_mach (stdoutput) < insn->arch)
   3243 	goto failed;
   3244 
   3245       /* Build the opcode, checking as we go to make
   3246 	 sure that the operands match.  */
   3247       for (args = insn->args;; ++args)
   3248 	{
   3249 	  /* Absorb white space in instruction.  */
   3250 	  while (*s == ' ' || *s == '\t')
   3251 	    s++;
   3252 
   3253 	  switch (*args)
   3254 	    {
   3255 	    /* End of arguments.  */
   3256 	    case '\0':
   3257 	      if (*s == '\0')
   3258 		match = TRUE;
   3259 	      break;
   3260 
   3261 	    case '+':
   3262 	      if (*s == '+')
   3263 		{
   3264 		  ++s;
   3265 		  continue;
   3266 		}
   3267 	      if (*s == '-')
   3268 		continue;
   3269 	      break;
   3270 
   3271 	    /* These must match exactly.  */
   3272 	    case '(':
   3273 	    case ')':
   3274 	    case ',':
   3275 	    case ' ':
   3276 	      if (*s++ == *args)
   3277 		continue;
   3278 	      break;
   3279 
   3280 	    /* Handle a 5 bit register or control register field at 10.  */
   3281 	    case 'b':
   3282 	    case '^':
   3283 	      if (!pa_parse_number (&s, 0))
   3284 		break;
   3285 	      num = pa_number;
   3286 	      CHECK_FIELD (num, 31, 0, 0);
   3287 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   3288 
   3289 	    /* Handle %sar or %cr11.  No bits get set, we just verify that it
   3290 	       is there.  */
   3291 	    case '!':
   3292 	      /* Skip whitespace before register.  */
   3293 	      while (*s == ' ' || *s == '\t')
   3294 		s = s + 1;
   3295 
   3296 	      if (!strncasecmp (s, "%sar", 4))
   3297 		{
   3298 		  s += 4;
   3299 		  continue;
   3300 		}
   3301 	      else if (!strncasecmp (s, "%cr11", 5))
   3302 		{
   3303 		  s += 5;
   3304 		  continue;
   3305 		}
   3306 	      break;
   3307 
   3308 	    /* Handle a 5 bit register field at 15.  */
   3309 	    case 'x':
   3310 	      if (!pa_parse_number (&s, 0))
   3311 		break;
   3312 	      num = pa_number;
   3313 	      CHECK_FIELD (num, 31, 0, 0);
   3314 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3315 
   3316 	    /* Handle a 5 bit register field at 31.  */
   3317 	    case 't':
   3318 	      if (!pa_parse_number (&s, 0))
   3319 		break;
   3320 	      num = pa_number;
   3321 	      CHECK_FIELD (num, 31, 0, 0);
   3322 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   3323 
   3324 	    /* Handle a 5 bit register field at 10 and 15.  */
   3325 	    case 'a':
   3326 	      if (!pa_parse_number (&s, 0))
   3327 		break;
   3328 	      num = pa_number;
   3329 	      CHECK_FIELD (num, 31, 0, 0);
   3330 	      opcode |= num << 16;
   3331 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   3332 
   3333 	    /* Handle a 5 bit field length at 31.  */
   3334 	    case 'T':
   3335 	      num = pa_get_absolute_expression (&the_insn, &s);
   3336 	      if (strict && the_insn.exp.X_op != O_constant)
   3337 		break;
   3338 	      s = expr_end;
   3339 	      CHECK_FIELD (num, 32, 1, 0);
   3340 	      SAVE_IMMEDIATE(num);
   3341 	      INSERT_FIELD_AND_CONTINUE (opcode, 32 - num, 0);
   3342 
   3343 	    /* Handle a 5 bit immediate at 15.  */
   3344 	    case '5':
   3345 	      num = pa_get_absolute_expression (&the_insn, &s);
   3346 	      if (strict && the_insn.exp.X_op != O_constant)
   3347 		break;
   3348 	      s = expr_end;
   3349 	      /* When in strict mode, we want to just reject this
   3350 		 match instead of giving an out of range error.  */
   3351 	      CHECK_FIELD (num, 15, -16, strict);
   3352 	      num = low_sign_unext (num, 5);
   3353 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3354 
   3355 	    /* Handle a 5 bit immediate at 31.  */
   3356 	    case 'V':
   3357 	      num = pa_get_absolute_expression (&the_insn, &s);
   3358 	      if (strict && the_insn.exp.X_op != O_constant)
   3359 		break;
   3360 	      s = expr_end;
   3361 	      /* When in strict mode, we want to just reject this
   3362 		 match instead of giving an out of range error.  */
   3363 	      CHECK_FIELD (num, 15, -16, strict);
   3364 	      num = low_sign_unext (num, 5);
   3365 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   3366 
   3367 	    /* Handle an unsigned 5 bit immediate at 31.  */
   3368 	    case 'r':
   3369 	      num = pa_get_absolute_expression (&the_insn, &s);
   3370 	      if (strict && the_insn.exp.X_op != O_constant)
   3371 		break;
   3372 	      s = expr_end;
   3373 	      CHECK_FIELD (num, 31, 0, strict);
   3374 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   3375 
   3376 	    /* Handle an unsigned 5 bit immediate at 15.  */
   3377 	    case 'R':
   3378 	      num = pa_get_absolute_expression (&the_insn, &s);
   3379 	      if (strict && the_insn.exp.X_op != O_constant)
   3380 		break;
   3381 	      s = expr_end;
   3382 	      CHECK_FIELD (num, 31, 0, strict);
   3383 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3384 
   3385 	    /* Handle an unsigned 10 bit immediate at 15.  */
   3386 	    case 'U':
   3387 	      num = pa_get_absolute_expression (&the_insn, &s);
   3388 	      if (strict && the_insn.exp.X_op != O_constant)
   3389 		break;
   3390 	      s = expr_end;
   3391 	      CHECK_FIELD (num, 1023, 0, strict);
   3392 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3393 
   3394 	    /* Handle a 2 bit space identifier at 17.  */
   3395 	    case 's':
   3396 	      if (!pa_parse_number (&s, 0))
   3397 		break;
   3398 	      num = pa_number;
   3399 	      CHECK_FIELD (num, 3, 0, 1);
   3400 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 14);
   3401 
   3402 	    /* Handle a 3 bit space identifier at 18.  */
   3403 	    case 'S':
   3404 	      if (!pa_parse_number (&s, 0))
   3405 		break;
   3406 	      num = pa_number;
   3407 	      CHECK_FIELD (num, 7, 0, 1);
   3408 	      opcode |= re_assemble_3 (num);
   3409 	      continue;
   3410 
   3411 	    /* Handle all completers.  */
   3412 	    case 'c':
   3413 	      switch (*++args)
   3414 		{
   3415 
   3416 		/* Handle a completer for an indexing load or store.  */
   3417 		case 'X':
   3418 		case 'x':
   3419 		  {
   3420 		    int uu = 0;
   3421 		    int m = 0;
   3422 		    int i = 0;
   3423 		    while (*s == ',' && i < 2)
   3424 		      {
   3425 			s++;
   3426 			if (strncasecmp (s, "sm", 2) == 0)
   3427 			  {
   3428 			    uu = 1;
   3429 			    m = 1;
   3430 			    s++;
   3431 			    i++;
   3432 			  }
   3433 			else if (strncasecmp (s, "m", 1) == 0)
   3434 			  m = 1;
   3435 			else if ((strncasecmp (s, "s ", 2) == 0)
   3436 				 || (strncasecmp (s, "s,", 2) == 0))
   3437 			  uu = 1;
   3438 			else if (strict)
   3439 			  {
   3440 			    /* This is a match failure.  */
   3441 			    s--;
   3442 			    break;
   3443 			  }
   3444 			else
   3445 			  as_bad (_("Invalid Indexed Load Completer."));
   3446 			s++;
   3447 			i++;
   3448 		      }
   3449 		    if (i > 2)
   3450 		      as_bad (_("Invalid Indexed Load Completer Syntax."));
   3451 		    opcode |= m << 5;
   3452 		    INSERT_FIELD_AND_CONTINUE (opcode, uu, 13);
   3453 		  }
   3454 
   3455 		/* Handle a short load/store completer.  */
   3456 		case 'M':
   3457 		case 'm':
   3458 		case 'q':
   3459 		case 'J':
   3460 		case 'e':
   3461 		  {
   3462 		    int a = 0;
   3463 		    int m = 0;
   3464 		    if (*s == ',')
   3465 		      {
   3466 			s++;
   3467 			if (strncasecmp (s, "ma", 2) == 0)
   3468 			  {
   3469 			    a = 0;
   3470 			    m = 1;
   3471 			    s += 2;
   3472 			  }
   3473 			else if (strncasecmp (s, "mb", 2) == 0)
   3474 			  {
   3475 			    a = 1;
   3476 			    m = 1;
   3477 			    s += 2;
   3478 			  }
   3479 			else if (strict)
   3480 			  /* This is a match failure.  */
   3481 			  s--;
   3482 			else
   3483 			  {
   3484 			    as_bad (_("Invalid Short Load/Store Completer."));
   3485 			    s += 2;
   3486 			  }
   3487 		      }
   3488 		    /* If we did not get a ma/mb completer, then we do not
   3489 		       consider this a positive match for 'ce'.  */
   3490 		    else if (*args == 'e')
   3491 		      break;
   3492 
   3493 		   /* 'J', 'm', 'M' and 'q' are the same, except for where they
   3494 		       encode the before/after field.  */
   3495 		   if (*args == 'm' || *args == 'M')
   3496 		      {
   3497 			opcode |= m << 5;
   3498 			INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
   3499 		      }
   3500 		    else if (*args == 'q')
   3501 		      {
   3502 			opcode |= m << 3;
   3503 			INSERT_FIELD_AND_CONTINUE (opcode, a, 2);
   3504 		      }
   3505 		    else if (*args == 'J')
   3506 		      {
   3507 			/* M bit is explicit in the major opcode.  */
   3508 			INSERT_FIELD_AND_CONTINUE (opcode, a, 2);
   3509 		      }
   3510 		    else if (*args == 'e')
   3511 		      {
   3512 			/* Stash the ma/mb flag temporarily in the
   3513 			   instruction.  We will use (and remove it)
   3514 			   later when handling 'J', 'K', '<' & '>'.  */
   3515 			opcode |= a;
   3516 			continue;
   3517 		      }
   3518 		  }
   3519 
   3520 		/* Handle a stbys completer.  */
   3521 		case 'A':
   3522 		case 's':
   3523 		  {
   3524 		    int a = 0;
   3525 		    int m = 0;
   3526 		    int i = 0;
   3527 		    while (*s == ',' && i < 2)
   3528 		      {
   3529 			s++;
   3530 			if (strncasecmp (s, "m", 1) == 0)
   3531 			  m = 1;
   3532 			else if ((strncasecmp (s, "b ", 2) == 0)
   3533 				 || (strncasecmp (s, "b,", 2) == 0))
   3534 			  a = 0;
   3535 			else if (strncasecmp (s, "e", 1) == 0)
   3536 			  a = 1;
   3537 			/* In strict mode, this is a match failure.  */
   3538 			else if (strict)
   3539 			  {
   3540 			    s--;
   3541 			    break;
   3542 			  }
   3543 			else
   3544 			  as_bad (_("Invalid Store Bytes Short Completer"));
   3545 			s++;
   3546 			i++;
   3547 		      }
   3548 		    if (i > 2)
   3549 		      as_bad (_("Invalid Store Bytes Short Completer"));
   3550 		    opcode |= m << 5;
   3551 		    INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
   3552 		  }
   3553 
   3554 		/* Handle load cache hint completer.  */
   3555 		case 'c':
   3556 		  cmpltr = 0;
   3557 		  if (!strncmp (s, ",sl", 3))
   3558 		    {
   3559 		      s += 3;
   3560 		      cmpltr = 2;
   3561 		    }
   3562 		  INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
   3563 
   3564 		/* Handle store cache hint completer.  */
   3565 		case 'C':
   3566 		  cmpltr = 0;
   3567 		  if (!strncmp (s, ",sl", 3))
   3568 		    {
   3569 		      s += 3;
   3570 		      cmpltr = 2;
   3571 		    }
   3572 		  else if (!strncmp (s, ",bc", 3))
   3573 		    {
   3574 		      s += 3;
   3575 		      cmpltr = 1;
   3576 		    }
   3577 		  INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
   3578 
   3579 		/* Handle load and clear cache hint completer.  */
   3580 		case 'd':
   3581 		  cmpltr = 0;
   3582 		  if (!strncmp (s, ",co", 3))
   3583 		    {
   3584 		      s += 3;
   3585 		      cmpltr = 1;
   3586 		    }
   3587 		  INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
   3588 
   3589 		/* Handle load ordering completer.  */
   3590 		case 'o':
   3591 		  if (strncmp (s, ",o", 2) != 0)
   3592 		    break;
   3593 		  s += 2;
   3594 		  continue;
   3595 
   3596 		/* Handle a branch gate completer.  */
   3597 		case 'g':
   3598 		  if (strncasecmp (s, ",gate", 5) != 0)
   3599 		    break;
   3600 		  s += 5;
   3601 		  continue;
   3602 
   3603 		/* Handle a branch link and push completer.  */
   3604 		case 'p':
   3605 		  if (strncasecmp (s, ",l,push", 7) != 0)
   3606 		    break;
   3607 		  s += 7;
   3608 		  continue;
   3609 
   3610 		/* Handle a branch link completer.  */
   3611 		case 'l':
   3612 		  if (strncasecmp (s, ",l", 2) != 0)
   3613 		    break;
   3614 		  s += 2;
   3615 		  continue;
   3616 
   3617 		/* Handle a branch pop completer.  */
   3618 		case 'P':
   3619 		  if (strncasecmp (s, ",pop", 4) != 0)
   3620 		    break;
   3621 		  s += 4;
   3622 		  continue;
   3623 
   3624 		/* Handle a local processor completer.  */
   3625 		case 'L':
   3626 		  if (strncasecmp (s, ",l", 2) != 0)
   3627 		    break;
   3628 		  s += 2;
   3629 		  continue;
   3630 
   3631 		/* Handle a PROBE read/write completer.  */
   3632 		case 'w':
   3633 		  flag = 0;
   3634 		  if (!strncasecmp (s, ",w", 2))
   3635 		    {
   3636 		      flag = 1;
   3637 		      s += 2;
   3638 		    }
   3639 		  else if (!strncasecmp (s, ",r", 2))
   3640 		    {
   3641 		      flag = 0;
   3642 		      s += 2;
   3643 		    }
   3644 
   3645 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
   3646 
   3647 		/* Handle MFCTL wide completer.  */
   3648 		case 'W':
   3649 		  if (strncasecmp (s, ",w", 2) != 0)
   3650 		    break;
   3651 		  s += 2;
   3652 		  continue;
   3653 
   3654 		/* Handle an RFI restore completer.  */
   3655 		case 'r':
   3656 		  flag = 0;
   3657 		  if (!strncasecmp (s, ",r", 2))
   3658 		    {
   3659 		      flag = 5;
   3660 		      s += 2;
   3661 		    }
   3662 
   3663 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 5);
   3664 
   3665 		/* Handle a system control completer.  */
   3666 		case 'Z':
   3667 		  if (*s == ',' && (*(s + 1) == 'm' || *(s + 1) == 'M'))
   3668 		    {
   3669 		      flag = 1;
   3670 		      s += 2;
   3671 		    }
   3672 		  else
   3673 		    flag = 0;
   3674 
   3675 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 5);
   3676 
   3677 		/* Handle intermediate/final completer for DCOR.  */
   3678 		case 'i':
   3679 		  flag = 0;
   3680 		  if (!strncasecmp (s, ",i", 2))
   3681 		    {
   3682 		      flag = 1;
   3683 		      s += 2;
   3684 		    }
   3685 
   3686 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
   3687 
   3688 		/* Handle zero/sign extension completer.  */
   3689 		case 'z':
   3690 		  flag = 1;
   3691 		  if (!strncasecmp (s, ",z", 2))
   3692 		    {
   3693 		      flag = 0;
   3694 		      s += 2;
   3695 		    }
   3696 
   3697 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 10);
   3698 
   3699 		/* Handle add completer.  */
   3700 		case 'a':
   3701 		  flag = 1;
   3702 		  if (!strncasecmp (s, ",l", 2))
   3703 		    {
   3704 		      flag = 2;
   3705 		      s += 2;
   3706 		    }
   3707 		  else if (!strncasecmp (s, ",tsv", 4))
   3708 		    {
   3709 		      flag = 3;
   3710 		      s += 4;
   3711 		    }
   3712 
   3713 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 10);
   3714 
   3715 		/* Handle 64 bit carry for ADD.  */
   3716 		case 'Y':
   3717 		  flag = 0;
   3718 		  if (!strncasecmp (s, ",dc,tsv", 7) ||
   3719 		      !strncasecmp (s, ",tsv,dc", 7))
   3720 		    {
   3721 		      flag = 1;
   3722 		      s += 7;
   3723 		    }
   3724 		  else if (!strncasecmp (s, ",dc", 3))
   3725 		    {
   3726 		      flag = 0;
   3727 		      s += 3;
   3728 		    }
   3729 		  else
   3730 		    break;
   3731 
   3732 		  /* Condition is not required with "dc".  */
   3733 		  need_cond = 0;
   3734 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3735 
   3736 		/* Handle 32 bit carry for ADD.  */
   3737 		case 'y':
   3738 		  flag = 0;
   3739 		  if (!strncasecmp (s, ",c,tsv", 6) ||
   3740 		      !strncasecmp (s, ",tsv,c", 6))
   3741 		    {
   3742 		      flag = 1;
   3743 		      s += 6;
   3744 		    }
   3745 		  else if (!strncasecmp (s, ",c", 2))
   3746 		    {
   3747 		      flag = 0;
   3748 		      s += 2;
   3749 		    }
   3750 		  else
   3751 		    break;
   3752 
   3753 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3754 
   3755 		/* Handle trap on signed overflow.  */
   3756 		case 'v':
   3757 		  flag = 0;
   3758 		  if (!strncasecmp (s, ",tsv", 4))
   3759 		    {
   3760 		      flag = 1;
   3761 		      s += 4;
   3762 		    }
   3763 
   3764 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3765 
   3766 		/* Handle trap on condition and overflow.  */
   3767 		case 't':
   3768 		  flag = 0;
   3769 		  if (!strncasecmp (s, ",tc,tsv", 7) ||
   3770 		      !strncasecmp (s, ",tsv,tc", 7))
   3771 		    {
   3772 		      flag = 1;
   3773 		      s += 7;
   3774 		    }
   3775 		  else if (!strncasecmp (s, ",tc", 3))
   3776 		    {
   3777 		      flag = 0;
   3778 		      s += 3;
   3779 		    }
   3780 		  else
   3781 		    break;
   3782 
   3783 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3784 
   3785 		/* Handle 64 bit borrow for SUB.  */
   3786 		case 'B':
   3787 		  flag = 0;
   3788 		  if (!strncasecmp (s, ",db,tsv", 7) ||
   3789 		      !strncasecmp (s, ",tsv,db", 7))
   3790 		    {
   3791 		      flag = 1;
   3792 		      s += 7;
   3793 		    }
   3794 		  else if (!strncasecmp (s, ",db", 3))
   3795 		    {
   3796 		      flag = 0;
   3797 		      s += 3;
   3798 		    }
   3799 		  else
   3800 		    break;
   3801 
   3802 		  /* Condition is not required with "db".  */
   3803 		  need_cond = 0;
   3804 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3805 
   3806 		/* Handle 32 bit borrow for SUB.  */
   3807 		case 'b':
   3808 		  flag = 0;
   3809 		  if (!strncasecmp (s, ",b,tsv", 6) ||
   3810 		      !strncasecmp (s, ",tsv,b", 6))
   3811 		    {
   3812 		      flag = 1;
   3813 		      s += 6;
   3814 		    }
   3815 		  else if (!strncasecmp (s, ",b", 2))
   3816 		    {
   3817 		      flag = 0;
   3818 		      s += 2;
   3819 		    }
   3820 		  else
   3821 		    break;
   3822 
   3823 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3824 
   3825 		/* Handle trap condition completer for UADDCM.  */
   3826 		case 'T':
   3827 		  flag = 0;
   3828 		  if (!strncasecmp (s, ",tc", 3))
   3829 		    {
   3830 		      flag = 1;
   3831 		      s += 3;
   3832 		    }
   3833 
   3834 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
   3835 
   3836 		/* Handle signed/unsigned at 21.  */
   3837 		case 'S':
   3838 		  {
   3839 		    int sign = 1;
   3840 		    if (strncasecmp (s, ",s", 2) == 0)
   3841 		      {
   3842 			sign = 1;
   3843 			s += 2;
   3844 		      }
   3845 		    else if (strncasecmp (s, ",u", 2) == 0)
   3846 		      {
   3847 			sign = 0;
   3848 			s += 2;
   3849 		      }
   3850 
   3851 		    INSERT_FIELD_AND_CONTINUE (opcode, sign, 10);
   3852 		  }
   3853 
   3854 		/* Handle left/right combination at 17:18.  */
   3855 		case 'h':
   3856 		  if (*s++ == ',')
   3857 		    {
   3858 		      int lr = 0;
   3859 		      if (*s == 'r')
   3860 			lr = 2;
   3861 		      else if (*s == 'l')
   3862 			lr = 0;
   3863 		      else
   3864 			as_bad (_("Invalid left/right combination completer"));
   3865 
   3866 		      s++;
   3867 		      INSERT_FIELD_AND_CONTINUE (opcode, lr, 13);
   3868 		    }
   3869 		  else
   3870 		    as_bad (_("Invalid left/right combination completer"));
   3871 		  break;
   3872 
   3873 		/* Handle saturation at 24:25.  */
   3874 		case 'H':
   3875 		  {
   3876 		    int sat = 3;
   3877 		    if (strncasecmp (s, ",ss", 3) == 0)
   3878 		      {
   3879 			sat = 1;
   3880 			s += 3;
   3881 		      }
   3882 		    else if (strncasecmp (s, ",us", 3) == 0)
   3883 		      {
   3884 			sat = 0;
   3885 			s += 3;
   3886 		      }
   3887 
   3888 		    INSERT_FIELD_AND_CONTINUE (opcode, sat, 6);
   3889 		  }
   3890 
   3891 		/* Handle permutation completer.  */
   3892 		case '*':
   3893 		  if (*s++ == ',')
   3894 		    {
   3895 		      int permloc[4];
   3896 		      int perm = 0;
   3897 		      int i = 0;
   3898 		      permloc[0] = 13;
   3899 		      permloc[1] = 10;
   3900 		      permloc[2] = 8;
   3901 		      permloc[3] = 6;
   3902 		      for (; i < 4; i++)
   3903 			{
   3904 			  switch (*s++)
   3905 			    {
   3906 			    case '0':
   3907 			      perm = 0;
   3908 			      break;
   3909 			    case '1':
   3910 			      perm = 1;
   3911 			      break;
   3912 			    case '2':
   3913 			      perm = 2;
   3914 			      break;
   3915 			    case '3':
   3916 			      perm = 3;
   3917 			      break;
   3918 			    default:
   3919 			      as_bad (_("Invalid permutation completer"));
   3920 			    }
   3921 			  opcode |= perm << permloc[i];
   3922 			}
   3923 		      continue;
   3924 		    }
   3925 		  else
   3926 		    as_bad (_("Invalid permutation completer"));
   3927 		  break;
   3928 
   3929 		default:
   3930 		  abort ();
   3931 		}
   3932 	      break;
   3933 
   3934 	    /* Handle all conditions.  */
   3935 	    case '?':
   3936 	      {
   3937 		args++;
   3938 		switch (*args)
   3939 		  {
   3940 		  /* Handle FP compare conditions.  */
   3941 		  case 'f':
   3942 		    cond = pa_parse_fp_cmp_cond (&s);
   3943 		    INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
   3944 
   3945 		  /* Handle an add condition.  */
   3946 		  case 'A':
   3947 		  case 'a':
   3948 		    cmpltr = 0;
   3949 		    flag = 0;
   3950 		    if (*s == ',')
   3951 		      {
   3952 			s++;
   3953 
   3954 			/* 64 bit conditions.  */
   3955 			if (*args == 'A')
   3956 			  {
   3957 			    if (*s == '*')
   3958 			      s++;
   3959 			    else
   3960 			      break;
   3961 			  }
   3962 			else if (*s == '*')
   3963 			  break;
   3964 
   3965 			name = s;
   3966 			while (*s != ',' && *s != ' ' && *s != '\t')
   3967 			  s += 1;
   3968 			c = *s;
   3969 			*s = 0x00;
   3970 			if (strcmp (name, "=") == 0)
   3971 			  cmpltr = 1;
   3972 			else if (strcmp (name, "<") == 0)
   3973 			  cmpltr = 2;
   3974 			else if (strcmp (name, "<=") == 0)
   3975 			  cmpltr = 3;
   3976 			else if (strcasecmp (name, "nuv") == 0)
   3977 			  cmpltr = 4;
   3978 			else if (strcasecmp (name, "znv") == 0)
   3979 			  cmpltr = 5;
   3980 			else if (strcasecmp (name, "sv") == 0)
   3981 			  cmpltr = 6;
   3982 			else if (strcasecmp (name, "od") == 0)
   3983 			  cmpltr = 7;
   3984 			else if (strcasecmp (name, "tr") == 0)
   3985 			  {
   3986 			    cmpltr = 0;
   3987 			    flag = 1;
   3988 			  }
   3989 			else if (strcmp (name, "<>") == 0)
   3990 			  {
   3991 			    cmpltr = 1;
   3992 			    flag = 1;
   3993 			  }
   3994 			else if (strcmp (name, ">=") == 0)
   3995 			  {
   3996 			    cmpltr = 2;
   3997 			    flag = 1;
   3998 			  }
   3999 			else if (strcmp (name, ">") == 0)
   4000 			  {
   4001 			    cmpltr = 3;
   4002 			    flag = 1;
   4003 			  }
   4004 			else if (strcasecmp (name, "uv") == 0)
   4005 			  {
   4006 			    cmpltr = 4;
   4007 			    flag = 1;
   4008 			  }
   4009 			else if (strcasecmp (name, "vnz") == 0)
   4010 			  {
   4011 			    cmpltr = 5;
   4012 			    flag = 1;
   4013 			  }
   4014 			else if (strcasecmp (name, "nsv") == 0)
   4015 			  {
   4016 			    cmpltr = 6;
   4017 			    flag = 1;
   4018 			  }
   4019 			else if (strcasecmp (name, "ev") == 0)
   4020 			  {
   4021 			    cmpltr = 7;
   4022 			    flag = 1;
   4023 			  }
   4024 			/* ",*" is a valid condition.  */
   4025 			else if (*args == 'a' || *name)
   4026 			  as_bad (_("Invalid Add Condition: %s"), name);
   4027 			*s = c;
   4028 		      }
   4029 		    /* Except with "dc", we have a match failure with
   4030 		       'A' if we don't have a doubleword condition.  */
   4031 		    else if (*args == 'A' && need_cond)
   4032 		      break;
   4033 
   4034 		    opcode |= cmpltr << 13;
   4035 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4036 
   4037 		  /* Handle non-negated add and branch condition.  */
   4038 		  case 'd':
   4039 		    cmpltr = pa_parse_nonneg_add_cmpltr (&s);
   4040 		    if (cmpltr < 0)
   4041 		      {
   4042 			as_bad (_("Invalid Add and Branch Condition"));
   4043 			cmpltr = 0;
   4044 		      }
   4045 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4046 
   4047 		  /* Handle 64 bit wide-mode add and branch condition.  */
   4048 		  case 'W':
   4049 		    cmpltr = pa_parse_addb_64_cmpltr (&s);
   4050 		    if (cmpltr < 0)
   4051 		      {
   4052 			as_bad (_("Invalid Add and Branch Condition"));
   4053 			cmpltr = 0;
   4054 		      }
   4055 		    else
   4056 		      {
   4057 			/* Negated condition requires an opcode change.  */
   4058 			opcode |= (cmpltr & 8) << 24;
   4059 		      }
   4060 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
   4061 
   4062 		  /* Handle a negated or non-negated add and branch
   4063 		     condition.  */
   4064 		  case '@':
   4065 		    save_s = s;
   4066 		    cmpltr = pa_parse_nonneg_add_cmpltr (&s);
   4067 		    if (cmpltr < 0)
   4068 		      {
   4069 			s = save_s;
   4070 			cmpltr = pa_parse_neg_add_cmpltr (&s);
   4071 			if (cmpltr < 0)
   4072 			  {
   4073 			    as_bad (_("Invalid Compare/Subtract Condition"));
   4074 			    cmpltr = 0;
   4075 			  }
   4076 			else
   4077 			  {
   4078 			    /* Negated condition requires an opcode change.  */
   4079 			    opcode |= 1 << 27;
   4080 			  }
   4081 		      }
   4082 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4083 
   4084 		  /* Handle branch on bit conditions.  */
   4085 		  case 'B':
   4086 		  case 'b':
   4087 		    cmpltr = 0;
   4088 		    if (*s == ',')
   4089 		      {
   4090 			s++;
   4091 
   4092 			if (*args == 'B')
   4093 			  {
   4094 			    if (*s == '*')
   4095 			      s++;
   4096 			    else
   4097 			      break;
   4098 			  }
   4099 			else if (*s == '*')
   4100 			  break;
   4101 
   4102 			if (strncmp (s, "<", 1) == 0)
   4103 			  {
   4104 			    cmpltr = 0;
   4105 			    s++;
   4106 			  }
   4107 			else if (strncmp (s, ">=", 2) == 0)
   4108 			  {
   4109 			    cmpltr = 1;
   4110 			    s += 2;
   4111 			  }
   4112 			else
   4113 			  as_bad (_("Invalid Branch On Bit Condition: %c"), *s);
   4114 		      }
   4115 		    else
   4116 		      as_bad (_("Missing Branch On Bit Condition"));
   4117 
   4118 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15);
   4119 
   4120 		  /* Handle a compare/subtract condition.  */
   4121 		  case 'S':
   4122 		  case 's':
   4123 		    cmpltr = 0;
   4124 		    flag = 0;
   4125 		    if (*s == ',')
   4126 		      {
   4127 			s++;
   4128 
   4129 			/* 64 bit conditions.  */
   4130 			if (*args == 'S')
   4131 			  {
   4132 			    if (*s == '*')
   4133 			      s++;
   4134 			    else
   4135 			      break;
   4136 			  }
   4137 			else if (*s == '*')
   4138 			  break;
   4139 
   4140 			name = s;
   4141 			while (*s != ',' && *s != ' ' && *s != '\t')
   4142 			  s += 1;
   4143 			c = *s;
   4144 			*s = 0x00;
   4145 			if (strcmp (name, "=") == 0)
   4146 			  cmpltr = 1;
   4147 			else if (strcmp (name, "<") == 0)
   4148 			  cmpltr = 2;
   4149 			else if (strcmp (name, "<=") == 0)
   4150 			  cmpltr = 3;
   4151 			else if (strcasecmp (name, "<<") == 0)
   4152 			  cmpltr = 4;
   4153 			else if (strcasecmp (name, "<<=") == 0)
   4154 			  cmpltr = 5;
   4155 			else if (strcasecmp (name, "sv") == 0)
   4156 			  cmpltr = 6;
   4157 			else if (strcasecmp (name, "od") == 0)
   4158 			  cmpltr = 7;
   4159 			else if (strcasecmp (name, "tr") == 0)
   4160 			  {
   4161 			    cmpltr = 0;
   4162 			    flag = 1;
   4163 			  }
   4164 			else if (strcmp (name, "<>") == 0)
   4165 			  {
   4166 			    cmpltr = 1;
   4167 			    flag = 1;
   4168 			  }
   4169 			else if (strcmp (name, ">=") == 0)
   4170 			  {
   4171 			    cmpltr = 2;
   4172 			    flag = 1;
   4173 			  }
   4174 			else if (strcmp (name, ">") == 0)
   4175 			  {
   4176 			    cmpltr = 3;
   4177 			    flag = 1;
   4178 			  }
   4179 			else if (strcasecmp (name, ">>=") == 0)
   4180 			  {
   4181 			    cmpltr = 4;
   4182 			    flag = 1;
   4183 			  }
   4184 			else if (strcasecmp (name, ">>") == 0)
   4185 			  {
   4186 			    cmpltr = 5;
   4187 			    flag = 1;
   4188 			  }
   4189 			else if (strcasecmp (name, "nsv") == 0)
   4190 			  {
   4191 			    cmpltr = 6;
   4192 			    flag = 1;
   4193 			  }
   4194 			else if (strcasecmp (name, "ev") == 0)
   4195 			  {
   4196 			    cmpltr = 7;
   4197 			    flag = 1;
   4198 			  }
   4199 			/* ",*" is a valid condition.  */
   4200 			else if (*args != 'S' || *name)
   4201 			  as_bad (_("Invalid Compare/Subtract Condition: %s"),
   4202 				  name);
   4203 			*s = c;
   4204 		      }
   4205 		    /* Except with "db", we have a match failure with
   4206 		       'S' if we don't have a doubleword condition.  */
   4207 		    else if (*args == 'S' && need_cond)
   4208 		      break;
   4209 
   4210 		    opcode |= cmpltr << 13;
   4211 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4212 
   4213 		  /* Handle a non-negated compare condition.  */
   4214 		  case 't':
   4215 		    cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s);
   4216 		    if (cmpltr < 0)
   4217 		      {
   4218 			as_bad (_("Invalid Compare/Subtract Condition"));
   4219 			cmpltr = 0;
   4220 		      }
   4221 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4222 
   4223 		  /* Handle a 32 bit compare and branch condition.  */
   4224 		  case 'n':
   4225 		    save_s = s;
   4226 		    cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s);
   4227 		    if (cmpltr < 0)
   4228 		      {
   4229 			s = save_s;
   4230 			cmpltr = pa_parse_neg_cmpsub_cmpltr (&s);
   4231 			if (cmpltr < 0)
   4232 			  {
   4233 			    as_bad (_("Invalid Compare and Branch Condition"));
   4234 			    cmpltr = 0;
   4235 			  }
   4236 			else
   4237 			  {
   4238 			    /* Negated condition requires an opcode change.  */
   4239 			    opcode |= 1 << 27;
   4240 			  }
   4241 		      }
   4242 
   4243 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4244 
   4245 		  /* Handle a 64 bit compare and branch condition.  */
   4246 		  case 'N':
   4247 		    cmpltr = pa_parse_cmpb_64_cmpltr (&s);
   4248 		    if (cmpltr >= 0)
   4249 		      {
   4250 			/* Negated condition requires an opcode change.  */
   4251 			opcode |= (cmpltr & 8) << 26;
   4252 		      }
   4253 		    else
   4254 		      /* Not a 64 bit cond.  Give 32 bit a chance.  */
   4255 		      break;
   4256 
   4257 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
   4258 
   4259 		  /* Handle a 64 bit cmpib condition.  */
   4260 		  case 'Q':
   4261 		    cmpltr = pa_parse_cmpib_64_cmpltr (&s);
   4262 		    if (cmpltr < 0)
   4263 		      /* Not a 64 bit cond.  Give 32 bit a chance.  */
   4264 		      break;
   4265 
   4266 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4267 
   4268 		  /* Handle a logical instruction condition.  */
   4269 		  case 'L':
   4270 		  case 'l':
   4271 		    cmpltr = 0;
   4272 		    flag = 0;
   4273 		    if (*s == ',')
   4274 		      {
   4275 			s++;
   4276 
   4277 			/* 64 bit conditions.  */
   4278 			if (*args == 'L')
   4279 			  {
   4280 			    if (*s == '*')
   4281 			      s++;
   4282 			    else
   4283 			      break;
   4284 			  }
   4285 			else if (*s == '*')
   4286 			  break;
   4287 
   4288 			name = s;
   4289 			while (*s != ',' && *s != ' ' && *s != '\t')
   4290 			  s += 1;
   4291 			c = *s;
   4292 			*s = 0x00;
   4293 
   4294 			if (strcmp (name, "=") == 0)
   4295 			  cmpltr = 1;
   4296 			else if (strcmp (name, "<") == 0)
   4297 			  cmpltr = 2;
   4298 			else if (strcmp (name, "<=") == 0)
   4299 			  cmpltr = 3;
   4300 			else if (strcasecmp (name, "od") == 0)
   4301 			  cmpltr = 7;
   4302 			else if (strcasecmp (name, "tr") == 0)
   4303 			  {
   4304 			    cmpltr = 0;
   4305 			    flag = 1;
   4306 			  }
   4307 			else if (strcmp (name, "<>") == 0)
   4308 			  {
   4309 			    cmpltr = 1;
   4310 			    flag = 1;
   4311 			  }
   4312 			else if (strcmp (name, ">=") == 0)
   4313 			  {
   4314 			    cmpltr = 2;
   4315 			    flag = 1;
   4316 			  }
   4317 			else if (strcmp (name, ">") == 0)
   4318 			  {
   4319 			    cmpltr = 3;
   4320 			    flag = 1;
   4321 			  }
   4322 			else if (strcasecmp (name, "ev") == 0)
   4323 			  {
   4324 			    cmpltr = 7;
   4325 			    flag = 1;
   4326 			  }
   4327 			/* ",*" is a valid condition.  */
   4328 			else if (*args != 'L' || *name)
   4329 			  as_bad (_("Invalid Logical Instruction Condition."));
   4330 			*s = c;
   4331 		      }
   4332 		    /* 32-bit is default for no condition.  */
   4333 		    else if (*args == 'L')
   4334 		      break;
   4335 
   4336 		    opcode |= cmpltr << 13;
   4337 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4338 
   4339 		  /* Handle a shift/extract/deposit condition.  */
   4340 		  case 'X':
   4341 		  case 'x':
   4342 		  case 'y':
   4343 		    cmpltr = 0;
   4344 		    /* Check immediate values in shift/extract/deposit
   4345 		     * instructions if they will give undefined behaviour.  */
   4346 		    immediate_check = 1;
   4347 		    if (*s == ',')
   4348 		      {
   4349 			save_s = s++;
   4350 
   4351 			/* 64 bit conditions.  */
   4352 			if (*args == 'X')
   4353 			  {
   4354 			    if (*s == '*')
   4355 			      s++;
   4356 			    else
   4357 			      break;
   4358 			  }
   4359 			else if (*s == '*')
   4360 			  break;
   4361 
   4362 			name = s;
   4363 			while (*s != ',' && *s != ' ' && *s != '\t')
   4364 			  s += 1;
   4365 			c = *s;
   4366 			*s = 0x00;
   4367 			if (strcmp (name, "=") == 0)
   4368 			  cmpltr = 1;
   4369 			else if (strcmp (name, "<") == 0)
   4370 			  cmpltr = 2;
   4371 			else if (strcasecmp (name, "od") == 0)
   4372 			  cmpltr = 3;
   4373 			else if (strcasecmp (name, "tr") == 0)
   4374 			  cmpltr = 4;
   4375 			else if (strcmp (name, "<>") == 0)
   4376 			  cmpltr = 5;
   4377 			else if (strcmp (name, ">=") == 0)
   4378 			  cmpltr = 6;
   4379 			else if (strcasecmp (name, "ev") == 0)
   4380 			  cmpltr = 7;
   4381 			/* Handle movb,n.  Put things back the way they were.
   4382 			   This includes moving s back to where it started.  */
   4383 			else if (strcasecmp (name, "n") == 0 && *args == 'y')
   4384 			  {
   4385 			    *s = c;
   4386 			    s = save_s;
   4387 			    continue;
   4388 			  }
   4389 			/* ",*" is a valid condition.  */
   4390 			else if (*args != 'X' || *name)
   4391 			  as_bad (_("Invalid Shift/Extract/Deposit Condition."));
   4392 			*s = c;
   4393 		      }
   4394 
   4395 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4396 
   4397 		  /* Handle a unit instruction condition.  */
   4398 		  case 'U':
   4399 		  case 'u':
   4400 		    cmpltr = 0;
   4401 		    flag = 0;
   4402 		    if (*s == ',')
   4403 		      {
   4404 			int uxor;
   4405 			s++;
   4406 
   4407 			/* 64 bit conditions.  */
   4408 			if (*args == 'U')
   4409 			  {
   4410 			    if (*s == '*')
   4411 			      s++;
   4412 			    else
   4413 			      break;
   4414 			  }
   4415 			else if (*s == '*')
   4416 			  break;
   4417 
   4418 			/* The uxor instruction only supports unit conditions
   4419 			   not involving carries.  */
   4420 			uxor = (opcode & 0xfc000fc0) == 0x08000380;
   4421 			if (strncasecmp (s, "sbz", 3) == 0)
   4422 			  {
   4423 			    cmpltr = 2;
   4424 			    s += 3;
   4425 			  }
   4426 			else if (strncasecmp (s, "shz", 3) == 0)
   4427 			  {
   4428 			    cmpltr = 3;
   4429 			    s += 3;
   4430 			  }
   4431 			else if (!uxor && strncasecmp (s, "sdc", 3) == 0)
   4432 			  {
   4433 			    cmpltr = 4;
   4434 			    s += 3;
   4435 			  }
   4436 			else if (!uxor && strncasecmp (s, "sbc", 3) == 0)
   4437 			  {
   4438 			    cmpltr = 6;
   4439 			    s += 3;
   4440 			  }
   4441 			else if (!uxor && strncasecmp (s, "shc", 3) == 0)
   4442 			  {
   4443 			    cmpltr = 7;
   4444 			    s += 3;
   4445 			  }
   4446 			else if (strncasecmp (s, "tr", 2) == 0)
   4447 			  {
   4448 			    cmpltr = 0;
   4449 			    flag = 1;
   4450 			    s += 2;
   4451 			  }
   4452 			else if (strncasecmp (s, "nbz", 3) == 0)
   4453 			  {
   4454 			    cmpltr = 2;
   4455 			    flag = 1;
   4456 			    s += 3;
   4457 			  }
   4458 			else if (strncasecmp (s, "nhz", 3) == 0)
   4459 			  {
   4460 			    cmpltr = 3;
   4461 			    flag = 1;
   4462 			    s += 3;
   4463 			  }
   4464 			else if (!uxor && strncasecmp (s, "ndc", 3) == 0)
   4465 			  {
   4466 			    cmpltr = 4;
   4467 			    flag = 1;
   4468 			    s += 3;
   4469 			  }
   4470 			else if (!uxor && strncasecmp (s, "nbc", 3) == 0)
   4471 			  {
   4472 			    cmpltr = 6;
   4473 			    flag = 1;
   4474 			    s += 3;
   4475 			  }
   4476 			else if (!uxor && strncasecmp (s, "nhc", 3) == 0)
   4477 			  {
   4478 			    cmpltr = 7;
   4479 			    flag = 1;
   4480 			    s += 3;
   4481 			  }
   4482 			else if (strncasecmp (s, "swz", 3) == 0)
   4483 			  {
   4484 			    cmpltr = 1;
   4485 			    flag = 0;
   4486 			    s += 3;
   4487 			  }
   4488 			else if (!uxor && strncasecmp (s, "swc", 3) == 0)
   4489 			  {
   4490 			    cmpltr = 5;
   4491 			    flag = 0;
   4492 			    s += 3;
   4493 			  }
   4494 			else if (strncasecmp (s, "nwz", 3) == 0)
   4495 			  {
   4496 			    cmpltr = 1;
   4497 			    flag = 1;
   4498 			    s += 3;
   4499 			  }
   4500 			else if (!uxor && strncasecmp (s, "nwc", 3) == 0)
   4501 			  {
   4502 			    cmpltr = 5;
   4503 			    flag = 1;
   4504 			    s += 3;
   4505 			  }
   4506 			/* ",*" is a valid condition.  */
   4507 			else if (*args != 'U' || (*s != ' ' && *s != '\t'))
   4508 			  as_bad (_("Invalid Unit Instruction Condition."));
   4509 		      }
   4510 		    /* 32-bit is default for no condition.  */
   4511 		    else if (*args == 'U')
   4512 		      break;
   4513 
   4514 		    opcode |= cmpltr << 13;
   4515 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4516 
   4517 		  default:
   4518 		    abort ();
   4519 		  }
   4520 		break;
   4521 	      }
   4522 
   4523 	    /* Handle a nullification completer for branch instructions.  */
   4524 	    case 'n':
   4525 	      nullif = pa_parse_nullif (&s);
   4526 	      INSERT_FIELD_AND_CONTINUE (opcode, nullif, 1);
   4527 
   4528 	    /* Handle a nullification completer for copr and spop insns.  */
   4529 	    case 'N':
   4530 	      nullif = pa_parse_nullif (&s);
   4531 	      INSERT_FIELD_AND_CONTINUE (opcode, nullif, 5);
   4532 
   4533 	    /* Handle ,%r2 completer for new syntax branches.  */
   4534 	    case 'L':
   4535 	      if (*s == ',' && strncasecmp (s + 1, "%r2", 3) == 0)
   4536 		s += 4;
   4537 	      else if (*s == ',' && strncasecmp (s + 1, "%rp", 3) == 0)
   4538 		s += 4;
   4539 	      else
   4540 		break;
   4541 	      continue;
   4542 
   4543 	    /* Handle 3 bit entry into the fp compare array.   Valid values
   4544 	       are 0..6 inclusive.  */
   4545 	    case 'h':
   4546 	      get_expression (s);
   4547 	      s = expr_end;
   4548 	      if (the_insn.exp.X_op == O_constant)
   4549 		{
   4550 		  num = evaluate_absolute (&the_insn);
   4551 		  CHECK_FIELD (num, 6, 0, 0);
   4552 		  num++;
   4553 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
   4554 		}
   4555 	      else
   4556 		break;
   4557 
   4558 	    /* Handle 3 bit entry into the fp compare array.   Valid values
   4559 	       are 0..6 inclusive.  */
   4560 	    case 'm':
   4561 	      get_expression (s);
   4562 	      if (the_insn.exp.X_op == O_constant)
   4563 		{
   4564 		  s = expr_end;
   4565 		  num = evaluate_absolute (&the_insn);
   4566 		  CHECK_FIELD (num, 6, 0, 0);
   4567 		  num = (num + 1) ^ 1;
   4568 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
   4569 		}
   4570 	      else
   4571 		break;
   4572 
   4573 	    /* Handle graphics test completers for ftest */
   4574 	    case '=':
   4575 	      {
   4576 		num = pa_parse_ftest_gfx_completer (&s);
   4577 		INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4578 	      }
   4579 
   4580 	    /* Handle a 11 bit immediate at 31.  */
   4581 	    case 'i':
   4582 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4583 	      get_expression (s);
   4584 	      s = expr_end;
   4585 	      if (the_insn.exp.X_op == O_constant)
   4586 		{
   4587 		  num = evaluate_absolute (&the_insn);
   4588 		  CHECK_FIELD (num, 1023, -1024, 0);
   4589 		  num = low_sign_unext (num, 11);
   4590 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4591 		}
   4592 	      else
   4593 		{
   4594 		  if (is_DP_relative (the_insn.exp))
   4595 		    the_insn.reloc = R_HPPA_GOTOFF;
   4596 		  else if (is_PC_relative (the_insn.exp))
   4597 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4598 #ifdef OBJ_ELF
   4599 		  else if (is_tls_gdidx (the_insn.exp))
   4600 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4601 		  else if (is_tls_ldidx (the_insn.exp))
   4602 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4603 		  else if (is_tls_dtpoff (the_insn.exp))
   4604 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4605 		  else if (is_tls_ieoff (the_insn.exp))
   4606 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4607 		  else if (is_tls_leoff (the_insn.exp))
   4608 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4609 #endif
   4610 		  else
   4611 		    the_insn.reloc = R_HPPA;
   4612 		  the_insn.format = 11;
   4613 		  continue;
   4614 		}
   4615 
   4616 	    /* Handle a 14 bit immediate at 31.  */
   4617 	    case 'J':
   4618 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4619 	      get_expression (s);
   4620 	      s = expr_end;
   4621 	      if (the_insn.exp.X_op == O_constant)
   4622 		{
   4623 		  int mb;
   4624 
   4625 		  /* XXX the completer stored away tidbits of information
   4626 		     for us to extract.  We need a cleaner way to do this.
   4627 		     Now that we have lots of letters again, it would be
   4628 		     good to rethink this.  */
   4629 		  mb = opcode & 1;
   4630 		  opcode -= mb;
   4631 		  num = evaluate_absolute (&the_insn);
   4632 		  if (mb != (num < 0))
   4633 		    break;
   4634 		  CHECK_FIELD (num, 8191, -8192, 0);
   4635 		  num = low_sign_unext (num, 14);
   4636 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4637 		}
   4638 	      break;
   4639 
   4640 	    /* Handle a 14 bit immediate at 31.  */
   4641 	    case 'K':
   4642 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4643 	      get_expression (s);
   4644 	      s = expr_end;
   4645 	      if (the_insn.exp.X_op == O_constant)
   4646 		{
   4647 		  int mb;
   4648 
   4649 		  mb = opcode & 1;
   4650 		  opcode -= mb;
   4651 		  num = evaluate_absolute (&the_insn);
   4652 		  if (mb == (num < 0))
   4653 		    break;
   4654 		  if (num % 4)
   4655 		    break;
   4656 		  CHECK_FIELD (num, 8191, -8192, 0);
   4657 		  num = low_sign_unext (num, 14);
   4658 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4659 		}
   4660 	      break;
   4661 
   4662 	    /* Handle a 16 bit immediate at 31.  */
   4663 	    case '<':
   4664 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4665 	      get_expression (s);
   4666 	      s = expr_end;
   4667 	      if (the_insn.exp.X_op == O_constant)
   4668 		{
   4669 		  int mb;
   4670 
   4671 		  mb = opcode & 1;
   4672 		  opcode -= mb;
   4673 		  num = evaluate_absolute (&the_insn);
   4674 		  if (mb != (num < 0))
   4675 		    break;
   4676 		  CHECK_FIELD (num, 32767, -32768, 0);
   4677 		  num = re_assemble_16 (num);
   4678 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4679 		}
   4680 	      break;
   4681 
   4682 	    /* Handle a 16 bit immediate at 31.  */
   4683 	    case '>':
   4684 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4685 	      get_expression (s);
   4686 	      s = expr_end;
   4687 	      if (the_insn.exp.X_op == O_constant)
   4688 		{
   4689 		  int mb;
   4690 
   4691 		  mb = opcode & 1;
   4692 		  opcode -= mb;
   4693 		  num = evaluate_absolute (&the_insn);
   4694 		  if (mb == (num < 0))
   4695 		    break;
   4696 		  if (num % 4)
   4697 		    break;
   4698 		  CHECK_FIELD (num, 32767, -32768, 0);
   4699 		  num = re_assemble_16 (num);
   4700 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4701 		}
   4702 	      break;
   4703 
   4704 	    /* Handle 14 bit immediate, shifted left three times.  */
   4705 	    case '#':
   4706 	      if (bfd_get_mach (stdoutput) != pa20)
   4707 		break;
   4708 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4709 	      get_expression (s);
   4710 	      s = expr_end;
   4711 	      if (the_insn.exp.X_op == O_constant)
   4712 		{
   4713 		  num = evaluate_absolute (&the_insn);
   4714 		  if (num & 0x7)
   4715 		    break;
   4716 		  CHECK_FIELD (num, 8191, -8192, 0);
   4717 		  if (num < 0)
   4718 		    opcode |= 1;
   4719 		  num &= 0x1fff;
   4720 		  num >>= 3;
   4721 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 4);
   4722 		}
   4723 	      else
   4724 		{
   4725 		  if (is_DP_relative (the_insn.exp))
   4726 		    the_insn.reloc = R_HPPA_GOTOFF;
   4727 		  else if (is_PC_relative (the_insn.exp))
   4728 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4729 #ifdef OBJ_ELF
   4730 		  else if (is_tls_gdidx (the_insn.exp))
   4731 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4732 		  else if (is_tls_ldidx (the_insn.exp))
   4733 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4734 		  else if (is_tls_dtpoff (the_insn.exp))
   4735 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4736 		  else if (is_tls_ieoff (the_insn.exp))
   4737 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4738 		  else if (is_tls_leoff (the_insn.exp))
   4739 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4740 #endif
   4741 		  else
   4742 		    the_insn.reloc = R_HPPA;
   4743 		  the_insn.format = 14;
   4744 		  continue;
   4745 		}
   4746 	      break;
   4747 
   4748 	    /* Handle 14 bit immediate, shifted left twice.  */
   4749 	    case 'd':
   4750 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4751 	      get_expression (s);
   4752 	      s = expr_end;
   4753 	      if (the_insn.exp.X_op == O_constant)
   4754 		{
   4755 		  num = evaluate_absolute (&the_insn);
   4756 		  if (num & 0x3)
   4757 		    break;
   4758 		  CHECK_FIELD (num, 8191, -8192, 0);
   4759 		  if (num < 0)
   4760 		    opcode |= 1;
   4761 		  num &= 0x1fff;
   4762 		  num >>= 2;
   4763 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
   4764 		}
   4765 	      else
   4766 		{
   4767 		  if (is_DP_relative (the_insn.exp))
   4768 		    the_insn.reloc = R_HPPA_GOTOFF;
   4769 		  else if (is_PC_relative (the_insn.exp))
   4770 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4771 #ifdef OBJ_ELF
   4772 		  else if (is_tls_gdidx (the_insn.exp))
   4773 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4774 		  else if (is_tls_ldidx (the_insn.exp))
   4775 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4776 		  else if (is_tls_dtpoff (the_insn.exp))
   4777 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4778 		  else if (is_tls_ieoff (the_insn.exp))
   4779 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4780 		  else if (is_tls_leoff (the_insn.exp))
   4781 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4782 #endif
   4783 		  else
   4784 		    the_insn.reloc = R_HPPA;
   4785 		  the_insn.format = 14;
   4786 		  continue;
   4787 		}
   4788 
   4789 	    /* Handle a 14 bit immediate at 31.  */
   4790 	    case 'j':
   4791 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4792 	      get_expression (s);
   4793 	      s = expr_end;
   4794 	      if (the_insn.exp.X_op == O_constant)
   4795 		{
   4796 		  num = evaluate_absolute (&the_insn);
   4797 		  CHECK_FIELD (num, 8191, -8192, 0);
   4798 		  num = low_sign_unext (num, 14);
   4799 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4800 		}
   4801 	      else
   4802 		{
   4803 		  if (is_DP_relative (the_insn.exp))
   4804 		    the_insn.reloc = R_HPPA_GOTOFF;
   4805 		  else if (is_PC_relative (the_insn.exp))
   4806 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4807 #ifdef OBJ_ELF
   4808 		  else if (is_tls_gdidx (the_insn.exp))
   4809 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4810 		  else if (is_tls_ldidx (the_insn.exp))
   4811 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4812 		  else if (is_tls_dtpoff (the_insn.exp))
   4813 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4814 		  else if (is_tls_ieoff (the_insn.exp))
   4815 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4816 		  else if (is_tls_leoff (the_insn.exp))
   4817 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4818 #endif
   4819 		  else
   4820 		    the_insn.reloc = R_HPPA;
   4821 		  the_insn.format = 14;
   4822 		  continue;
   4823 		}
   4824 
   4825 	    /* Handle a 21 bit immediate at 31.  */
   4826 	    case 'k':
   4827 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4828 	      get_expression (s);
   4829 	      s = expr_end;
   4830 	      if (the_insn.exp.X_op == O_constant)
   4831 		{
   4832 		  num = evaluate_absolute (&the_insn);
   4833 		  CHECK_FIELD (num >> 11, 1048575, -1048576, 0);
   4834 		  opcode |= re_assemble_21 (num);
   4835 		  continue;
   4836 		}
   4837 	      else
   4838 		{
   4839 		  if (is_DP_relative (the_insn.exp))
   4840 		    the_insn.reloc = R_HPPA_GOTOFF;
   4841 		  else if (is_PC_relative (the_insn.exp))
   4842 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4843 #ifdef OBJ_ELF
   4844 		  else if (is_tls_gdidx (the_insn.exp))
   4845 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4846 		  else if (is_tls_ldidx (the_insn.exp))
   4847 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4848 		  else if (is_tls_dtpoff (the_insn.exp))
   4849 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4850 		  else if (is_tls_ieoff (the_insn.exp))
   4851 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4852 		  else if (is_tls_leoff (the_insn.exp))
   4853 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4854 #endif
   4855 		  else
   4856 		    the_insn.reloc = R_HPPA;
   4857 		  the_insn.format = 21;
   4858 		  continue;
   4859 		}
   4860 
   4861 	    /* Handle a 16 bit immediate at 31 (PA 2.0 wide mode only).  */
   4862 	    case 'l':
   4863 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4864 	      get_expression (s);
   4865 	      s = expr_end;
   4866 	      if (the_insn.exp.X_op == O_constant)
   4867 		{
   4868 		  num = evaluate_absolute (&the_insn);
   4869 		  CHECK_FIELD (num, 32767, -32768, 0);
   4870 		  opcode |= re_assemble_16 (num);
   4871 		  continue;
   4872 		}
   4873 	      else
   4874 		{
   4875 		  /* ??? Is this valid for wide mode?  */
   4876 		  if (is_DP_relative (the_insn.exp))
   4877 		    the_insn.reloc = R_HPPA_GOTOFF;
   4878 		  else if (is_PC_relative (the_insn.exp))
   4879 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4880 #ifdef OBJ_ELF
   4881 		  else if (is_tls_gdidx (the_insn.exp))
   4882 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4883 		  else if (is_tls_ldidx (the_insn.exp))
   4884 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4885 		  else if (is_tls_dtpoff (the_insn.exp))
   4886 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4887 		  else if (is_tls_ieoff (the_insn.exp))
   4888 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4889 		  else if (is_tls_leoff (the_insn.exp))
   4890 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4891 #endif
   4892 		  else
   4893 		    the_insn.reloc = R_HPPA;
   4894 		  the_insn.format = 14;
   4895 		  continue;
   4896 		}
   4897 
   4898 	    /* Handle a word-aligned 16-bit imm. at 31 (PA2.0 wide).  */
   4899 	    case 'y':
   4900 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4901 	      get_expression (s);
   4902 	      s = expr_end;
   4903 	      if (the_insn.exp.X_op == O_constant)
   4904 		{
   4905 		  num = evaluate_absolute (&the_insn);
   4906 		  CHECK_FIELD (num, 32767, -32768, 0);
   4907 		  CHECK_ALIGN (num, 4, 0);
   4908 		  opcode |= re_assemble_16 (num);
   4909 		  continue;
   4910 		}
   4911 	      else
   4912 		{
   4913 		  /* ??? Is this valid for wide mode?  */
   4914 		  if (is_DP_relative (the_insn.exp))
   4915 		    the_insn.reloc = R_HPPA_GOTOFF;
   4916 		  else if (is_PC_relative (the_insn.exp))
   4917 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4918 #ifdef OBJ_ELF
   4919 		  else if (is_tls_gdidx (the_insn.exp))
   4920 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4921 		  else if (is_tls_ldidx (the_insn.exp))
   4922 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4923 		  else if (is_tls_dtpoff (the_insn.exp))
   4924 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4925 		  else if (is_tls_ieoff (the_insn.exp))
   4926 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4927 		  else if (is_tls_leoff (the_insn.exp))
   4928 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4929 #endif
   4930 		  else
   4931 		    the_insn.reloc = R_HPPA;
   4932 		  the_insn.format = 14;
   4933 		  continue;
   4934 		}
   4935 
   4936 	    /* Handle a dword-aligned 16-bit imm. at 31 (PA2.0 wide).  */
   4937 	    case '&':
   4938 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4939 	      get_expression (s);
   4940 	      s = expr_end;
   4941 	      if (the_insn.exp.X_op == O_constant)
   4942 		{
   4943 		  num = evaluate_absolute (&the_insn);
   4944 		  CHECK_FIELD (num, 32767, -32768, 0);
   4945 		  CHECK_ALIGN (num, 8, 0);
   4946 		  opcode |= re_assemble_16 (num);
   4947 		  continue;
   4948 		}
   4949 	      else
   4950 		{
   4951 		  /* ??? Is this valid for wide mode?  */
   4952 		  if (is_DP_relative (the_insn.exp))
   4953 		    the_insn.reloc = R_HPPA_GOTOFF;
   4954 		  else if (is_PC_relative (the_insn.exp))
   4955 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4956 #ifdef OBJ_ELF
   4957 		  else if (is_tls_gdidx (the_insn.exp))
   4958 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4959 		  else if (is_tls_ldidx (the_insn.exp))
   4960 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4961 		  else if (is_tls_dtpoff (the_insn.exp))
   4962 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4963 		  else if (is_tls_ieoff (the_insn.exp))
   4964 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4965 		  else if (is_tls_leoff (the_insn.exp))
   4966 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4967 #endif
   4968 		  else
   4969 		    the_insn.reloc = R_HPPA;
   4970 		  the_insn.format = 14;
   4971 		  continue;
   4972 		}
   4973 
   4974 	    /* Handle a 12 bit branch displacement.  */
   4975 	    case 'w':
   4976 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4977 	      get_expression (s);
   4978 	      s = expr_end;
   4979 	      the_insn.pcrel = 1;
   4980 	      if (!the_insn.exp.X_add_symbol
   4981 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   4982 			      FAKE_LABEL_NAME))
   4983 		{
   4984 		  num = evaluate_absolute (&the_insn);
   4985 		  if (num % 4)
   4986 		    {
   4987 		      as_bad (_("Branch to unaligned address"));
   4988 		      break;
   4989 		    }
   4990 		  if (the_insn.exp.X_add_symbol)
   4991 		    num -= 8;
   4992 		  CHECK_FIELD (num, 8191, -8192, 0);
   4993 		  opcode |= re_assemble_12 (num >> 2);
   4994 		  continue;
   4995 		}
   4996 	      else
   4997 		{
   4998 		  the_insn.reloc = R_HPPA_PCREL_CALL;
   4999 		  the_insn.format = 12;
   5000 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5001 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5002 		  s = expr_end;
   5003 		  continue;
   5004 		}
   5005 
   5006 	    /* Handle a 17 bit branch displacement.  */
   5007 	    case 'W':
   5008 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5009 	      get_expression (s);
   5010 	      s = expr_end;
   5011 	      the_insn.pcrel = 1;
   5012 	      if (!the_insn.exp.X_add_symbol
   5013 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   5014 			      FAKE_LABEL_NAME))
   5015 		{
   5016 		  num = evaluate_absolute (&the_insn);
   5017 		  if (num % 4)
   5018 		    {
   5019 		      as_bad (_("Branch to unaligned address"));
   5020 		      break;
   5021 		    }
   5022 		  if (the_insn.exp.X_add_symbol)
   5023 		    num -= 8;
   5024 		  CHECK_FIELD (num, 262143, -262144, 0);
   5025 		  opcode |= re_assemble_17 (num >> 2);
   5026 		  continue;
   5027 		}
   5028 	      else
   5029 		{
   5030 		  the_insn.reloc = R_HPPA_PCREL_CALL;
   5031 		  the_insn.format = 17;
   5032 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5033 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5034 		  continue;
   5035 		}
   5036 
   5037 	    /* Handle a 22 bit branch displacement.  */
   5038 	    case 'X':
   5039 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5040 	      get_expression (s);
   5041 	      s = expr_end;
   5042 	      the_insn.pcrel = 1;
   5043 	      if (!the_insn.exp.X_add_symbol
   5044 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   5045 			      FAKE_LABEL_NAME))
   5046 		{
   5047 		  num = evaluate_absolute (&the_insn);
   5048 		  if (num % 4)
   5049 		    {
   5050 		      as_bad (_("Branch to unaligned address"));
   5051 		      break;
   5052 		    }
   5053 		  if (the_insn.exp.X_add_symbol)
   5054 		    num -= 8;
   5055 		  CHECK_FIELD (num, 8388607, -8388608, 0);
   5056 		  opcode |= re_assemble_22 (num >> 2);
   5057 		}
   5058 	      else
   5059 		{
   5060 		  the_insn.reloc = R_HPPA_PCREL_CALL;
   5061 		  the_insn.format = 22;
   5062 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5063 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5064 		  continue;
   5065 		}
   5066 
   5067 	    /* Handle an absolute 17 bit branch target.  */
   5068 	    case 'z':
   5069 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5070 	      get_expression (s);
   5071 	      s = expr_end;
   5072 	      the_insn.pcrel = 0;
   5073 	      if (!the_insn.exp.X_add_symbol
   5074 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   5075 			      FAKE_LABEL_NAME))
   5076 		{
   5077 		  num = evaluate_absolute (&the_insn);
   5078 		  if (num % 4)
   5079 		    {
   5080 		      as_bad (_("Branch to unaligned address"));
   5081 		      break;
   5082 		    }
   5083 		  if (the_insn.exp.X_add_symbol)
   5084 		    num -= 8;
   5085 		  CHECK_FIELD (num, 262143, -262144, 0);
   5086 		  opcode |= re_assemble_17 (num >> 2);
   5087 		  continue;
   5088 		}
   5089 	      else
   5090 		{
   5091 		  the_insn.reloc = R_HPPA_ABS_CALL;
   5092 		  the_insn.format = 17;
   5093 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5094 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5095 		  continue;
   5096 		}
   5097 
   5098 	    /* Handle '%r1' implicit operand of addil instruction.  */
   5099 	    case 'Z':
   5100 	      if (*s == ',' && *(s + 1) == '%' && *(s + 3) == '1'
   5101 		  && (*(s + 2) == 'r' || *(s + 2) == 'R'))
   5102 		{
   5103 		  s += 4;
   5104 		  continue;
   5105 		}
   5106 	      else
   5107 		break;
   5108 
   5109 	    /* Handle '%sr0,%r31' implicit operand of be,l instruction.  */
   5110 	    case 'Y':
   5111 	      if (strncasecmp (s, "%sr0,%r31", 9) != 0)
   5112 		break;
   5113 	      s += 9;
   5114 	      continue;
   5115 
   5116 	    /* Handle immediate value of 0 for ordered load/store instructions.  */
   5117 	    case '@':
   5118 	      if (*s != '0')
   5119 		break;
   5120 	      s++;
   5121 	      continue;
   5122 
   5123 	    /* Handle a 2 bit shift count at 25.  */
   5124 	    case '.':
   5125 	      num = pa_get_absolute_expression (&the_insn, &s);
   5126 	      if (strict && the_insn.exp.X_op != O_constant)
   5127 		break;
   5128 	      s = expr_end;
   5129 	      CHECK_FIELD (num, 3, 1, strict);
   5130 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5131 
   5132 	    /* Handle a 4 bit shift count at 25.  */
   5133 	    case '*':
   5134 	      num = pa_get_absolute_expression (&the_insn, &s);
   5135 	      if (strict && the_insn.exp.X_op != O_constant)
   5136 		break;
   5137 	      s = expr_end;
   5138 	      CHECK_FIELD (num, 15, 0, strict);
   5139 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5140 
   5141 	    /* Handle a 5 bit shift count at 26.  */
   5142 	    case 'p':
   5143 	      num = pa_get_absolute_expression (&the_insn, &s);
   5144 	      if (strict && the_insn.exp.X_op != O_constant)
   5145 		break;
   5146 	      s = expr_end;
   5147 	      CHECK_FIELD (num, 31, 0, strict);
   5148 	      SAVE_IMMEDIATE(num);
   5149 	      INSERT_FIELD_AND_CONTINUE (opcode, 31 - num, 5);
   5150 
   5151 	    /* Handle a 6 bit shift count at 20,22:26.  */
   5152 	    case '~':
   5153 	      num = pa_get_absolute_expression (&the_insn, &s);
   5154 	      if (strict && the_insn.exp.X_op != O_constant)
   5155 		break;
   5156 	      s = expr_end;
   5157 	      CHECK_FIELD (num, 63, 0, strict);
   5158 	      SAVE_IMMEDIATE(num);
   5159 	      num = 63 - num;
   5160 	      opcode |= (num & 0x20) << 6;
   5161 	      INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5);
   5162 
   5163 	    /* Handle a 6 bit field length at 23,27:31.  */
   5164 	    case '%':
   5165 	      flag = 0;
   5166 	      num = pa_get_absolute_expression (&the_insn, &s);
   5167 	      if (strict && the_insn.exp.X_op != O_constant)
   5168 		break;
   5169 	      s = expr_end;
   5170 	      CHECK_FIELD (num, 64, 1, strict);
   5171 	      SAVE_IMMEDIATE(num);
   5172 	      num--;
   5173 	      opcode |= (num & 0x20) << 3;
   5174 	      num = 31 - (num & 0x1f);
   5175 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5176 
   5177 	    /* Handle a 6 bit field length at 19,27:31.  */
   5178 	    case '|':
   5179 	      num = pa_get_absolute_expression (&the_insn, &s);
   5180 	      if (strict && the_insn.exp.X_op != O_constant)
   5181 		break;
   5182 	      s = expr_end;
   5183 	      CHECK_FIELD (num, 64, 1, strict);
   5184 	      SAVE_IMMEDIATE(num);
   5185 	      num--;
   5186 	      opcode |= (num & 0x20) << 7;
   5187 	      num = 31 - (num & 0x1f);
   5188 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5189 
   5190 	    /* Handle a 5 bit bit position at 26.  */
   5191 	    case 'P':
   5192 	      num = pa_get_absolute_expression (&the_insn, &s);
   5193 	      if (strict && the_insn.exp.X_op != O_constant)
   5194 		break;
   5195 	      s = expr_end;
   5196 	      CHECK_FIELD (num, 31, 0, strict);
   5197 	      SAVE_IMMEDIATE(num);
   5198 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 5);
   5199 
   5200 	    /* Handle a 6 bit bit position at 20,22:26.  */
   5201 	    case 'q':
   5202 	      num = pa_get_absolute_expression (&the_insn, &s);
   5203 	      if (strict && the_insn.exp.X_op != O_constant)
   5204 		break;
   5205 	      s = expr_end;
   5206 	      CHECK_FIELD (num, 63, 0, strict);
   5207 	      SAVE_IMMEDIATE(num);
   5208 	      opcode |= (num & 0x20) << 6;
   5209 	      INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5);
   5210 
   5211 	    /* Handle a 5 bit immediate at 10 with 'd' as the complement
   5212 	       of the high bit of the immediate.  */
   5213 	    case 'B':
   5214 	      num = pa_get_absolute_expression (&the_insn, &s);
   5215 	      if (strict && the_insn.exp.X_op != O_constant)
   5216 		break;
   5217 	      s = expr_end;
   5218 	      CHECK_FIELD (num, 63, 0, strict);
   5219 	      if (num & 0x20)
   5220 		;
   5221 	      else
   5222 		opcode |= (1 << 13);
   5223 	      INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 21);
   5224 
   5225 	    /* Handle a 5 bit immediate at 10.  */
   5226 	    case 'Q':
   5227 	      num = pa_get_absolute_expression (&the_insn, &s);
   5228 	      if (strict && the_insn.exp.X_op != O_constant)
   5229 		break;
   5230 	      s = expr_end;
   5231 	      CHECK_FIELD (num, 31, 0, strict);
   5232 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   5233 
   5234 	    /* Handle a 9 bit immediate at 28.  */
   5235 	    case '$':
   5236 	      num = pa_get_absolute_expression (&the_insn, &s);
   5237 	      if (strict && the_insn.exp.X_op != O_constant)
   5238 		break;
   5239 	      s = expr_end;
   5240 	      CHECK_FIELD (num, 511, 1, strict);
   5241 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
   5242 
   5243 	    /* Handle a 13 bit immediate at 18.  */
   5244 	    case 'A':
   5245 	      num = pa_get_absolute_expression (&the_insn, &s);
   5246 	      if (strict && the_insn.exp.X_op != O_constant)
   5247 		break;
   5248 	      s = expr_end;
   5249 	      CHECK_FIELD (num, 8191, 0, strict);
   5250 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
   5251 
   5252 	    /* Handle a 26 bit immediate at 31.  */
   5253 	    case 'D':
   5254 	      num = pa_get_absolute_expression (&the_insn, &s);
   5255 	      if (strict && the_insn.exp.X_op != O_constant)
   5256 		break;
   5257 	      s = expr_end;
   5258 	      CHECK_FIELD (num, 67108863, 0, strict);
   5259 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5260 
   5261 	    /* Handle a 3 bit SFU identifier at 25.  */
   5262 	    case 'v':
   5263 	      if (*s++ != ',')
   5264 		as_bad (_("Invalid SFU identifier"));
   5265 	      num = pa_get_number (&the_insn, &s);
   5266 	      if (strict && the_insn.exp.X_op != O_constant)
   5267 		break;
   5268 	      s = expr_end;
   5269 	      CHECK_FIELD (num, 7, 0, strict);
   5270 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5271 
   5272 	    /* Handle a 20 bit SOP field for spop0.  */
   5273 	    case 'O':
   5274 	      num = pa_get_number (&the_insn, &s);
   5275 	      if (strict && the_insn.exp.X_op != O_constant)
   5276 		break;
   5277 	      s = expr_end;
   5278 	      CHECK_FIELD (num, 1048575, 0, strict);
   5279 	      num = (num & 0x1f) | ((num & 0x000fffe0) << 6);
   5280 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5281 
   5282 	    /* Handle a 15bit SOP field for spop1.  */
   5283 	    case 'o':
   5284 	      num = pa_get_number (&the_insn, &s);
   5285 	      if (strict && the_insn.exp.X_op != O_constant)
   5286 		break;
   5287 	      s = expr_end;
   5288 	      CHECK_FIELD (num, 32767, 0, strict);
   5289 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 11);
   5290 
   5291 	    /* Handle a 10bit SOP field for spop3.  */
   5292 	    case '0':
   5293 	      num = pa_get_number (&the_insn, &s);
   5294 	      if (strict && the_insn.exp.X_op != O_constant)
   5295 		break;
   5296 	      s = expr_end;
   5297 	      CHECK_FIELD (num, 1023, 0, strict);
   5298 	      num = (num & 0x1f) | ((num & 0x000003e0) << 6);
   5299 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5300 
   5301 	    /* Handle a 15 bit SOP field for spop2.  */
   5302 	    case '1':
   5303 	      num = pa_get_number (&the_insn, &s);
   5304 	      if (strict && the_insn.exp.X_op != O_constant)
   5305 		break;
   5306 	      s = expr_end;
   5307 	      CHECK_FIELD (num, 32767, 0, strict);
   5308 	      num = (num & 0x1f) | ((num & 0x00007fe0) << 6);
   5309 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5310 
   5311 	    /* Handle a 3-bit co-processor ID field.  */
   5312 	    case 'u':
   5313 	      if (*s++ != ',')
   5314 		as_bad (_("Invalid COPR identifier"));
   5315 	      num = pa_get_number (&the_insn, &s);
   5316 	      if (strict && the_insn.exp.X_op != O_constant)
   5317 		break;
   5318 	      s = expr_end;
   5319 	      CHECK_FIELD (num, 7, 0, strict);
   5320 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5321 
   5322 	    /* Handle a 22bit SOP field for copr.  */
   5323 	    case '2':
   5324 	      num = pa_get_number (&the_insn, &s);
   5325 	      if (strict && the_insn.exp.X_op != O_constant)
   5326 		break;
   5327 	      s = expr_end;
   5328 	      CHECK_FIELD (num, 4194303, 0, strict);
   5329 	      num = (num & 0x1f) | ((num & 0x003fffe0) << 4);
   5330 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5331 
   5332 	    /* Handle a source FP operand format completer.  */
   5333 	    case '{':
   5334 	      if (*s == ',' && *(s+1) == 't')
   5335 		{
   5336 		  the_insn.trunc = 1;
   5337 		  s += 2;
   5338 		}
   5339 	      else
   5340 		the_insn.trunc = 0;
   5341 	      flag = pa_parse_fp_cnv_format (&s);
   5342 	      the_insn.fpof1 = flag;
   5343 	      if (flag == W || flag == UW)
   5344 		flag = SGL;
   5345 	      if (flag == DW || flag == UDW)
   5346 		flag = DBL;
   5347 	      if (flag == QW || flag == UQW)
   5348 		flag = QUAD;
   5349 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   5350 
   5351 	    /* Handle a destination FP operand format completer.  */
   5352 	    case '_':
   5353 	      /* pa_parse_format needs the ',' prefix.  */
   5354 	      s--;
   5355 	      flag = pa_parse_fp_cnv_format (&s);
   5356 	      the_insn.fpof2 = flag;
   5357 	      if (flag == W || flag == UW)
   5358 		flag = SGL;
   5359 	      if (flag == DW || flag == UDW)
   5360 		flag = DBL;
   5361 	      if (flag == QW || flag == UQW)
   5362 		flag = QUAD;
   5363 	      opcode |= flag << 13;
   5364 	      if (the_insn.fpof1 == SGL
   5365 		  || the_insn.fpof1 == DBL
   5366 		  || the_insn.fpof1 == QUAD)
   5367 		{
   5368 		  if (the_insn.fpof2 == SGL
   5369 		      || the_insn.fpof2 == DBL
   5370 		      || the_insn.fpof2 == QUAD)
   5371 		    flag = 0;
   5372 		  else if (the_insn.fpof2 == W
   5373 		      || the_insn.fpof2 == DW
   5374 		      || the_insn.fpof2 == QW)
   5375 		    flag = 2;
   5376 		  else if (the_insn.fpof2 == UW
   5377 		      || the_insn.fpof2 == UDW
   5378 		      || the_insn.fpof2 == UQW)
   5379 		    flag = 6;
   5380 		  else
   5381 		    abort ();
   5382 		}
   5383 	      else if (the_insn.fpof1 == W
   5384 		       || the_insn.fpof1 == DW
   5385 		       || the_insn.fpof1 == QW)
   5386 		{
   5387 		  if (the_insn.fpof2 == SGL
   5388 		      || the_insn.fpof2 == DBL
   5389 		      || the_insn.fpof2 == QUAD)
   5390 		    flag = 1;
   5391 		  else
   5392 		    abort ();
   5393 		}
   5394 	      else if (the_insn.fpof1 == UW
   5395 		       || the_insn.fpof1 == UDW
   5396 		       || the_insn.fpof1 == UQW)
   5397 		{
   5398 		  if (the_insn.fpof2 == SGL
   5399 		      || the_insn.fpof2 == DBL
   5400 		      || the_insn.fpof2 == QUAD)
   5401 		    flag = 5;
   5402 		  else
   5403 		    abort ();
   5404 		}
   5405 	      flag |= the_insn.trunc;
   5406 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 15);
   5407 
   5408 	    /* Handle a source FP operand format completer.  */
   5409 	    case 'F':
   5410 	      flag = pa_parse_fp_format (&s);
   5411 	      the_insn.fpof1 = flag;
   5412 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   5413 
   5414 	    /* Handle a destination FP operand format completer.  */
   5415 	    case 'G':
   5416 	      /* pa_parse_format needs the ',' prefix.  */
   5417 	      s--;
   5418 	      flag = pa_parse_fp_format (&s);
   5419 	      the_insn.fpof2 = flag;
   5420 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 13);
   5421 
   5422 	    /* Handle a source FP operand format completer at 20.  */
   5423 	    case 'I':
   5424 	      flag = pa_parse_fp_format (&s);
   5425 	      the_insn.fpof1 = flag;
   5426 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   5427 
   5428 	    /* Handle a floating point operand format at 26.
   5429 	       Only allows single and double precision.  */
   5430 	    case 'H':
   5431 	      flag = pa_parse_fp_format (&s);
   5432 	      switch (flag)
   5433 		{
   5434 		case SGL:
   5435 		  opcode |= 0x20;
   5436 		case DBL:
   5437 		  the_insn.fpof1 = flag;
   5438 		  continue;
   5439 
   5440 		case QUAD:
   5441 		case ILLEGAL_FMT:
   5442 		default:
   5443 		  as_bad (_("Invalid Floating Point Operand Format."));
   5444 		}
   5445 	      break;
   5446 
   5447 	    /* Handle all floating point registers.  */
   5448 	    case 'f':
   5449 	      switch (*++args)
   5450 		{
   5451 		/* Float target register.  */
   5452 		case 't':
   5453 		  if (!pa_parse_number (&s, 3))
   5454 		    break;
   5455 		  /* RSEL should not be set.  */
   5456 		  if (pa_number & FP_REG_RSEL)
   5457 		    break;
   5458 		  num = pa_number - FP_REG_BASE;
   5459 		  CHECK_FIELD (num, 31, 0, 0);
   5460 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5461 
   5462 		/* Float target register with L/R selection.  */
   5463 		case 'T':
   5464 		  {
   5465 		    if (!pa_parse_number (&s, 1))
   5466 		      break;
   5467 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5468 		    CHECK_FIELD (num, 31, 0, 0);
   5469 		    opcode |= num;
   5470 
   5471 		    /* 0x30 opcodes are FP arithmetic operation opcodes
   5472 		       and need to be turned into 0x38 opcodes.  This
   5473 		       is not necessary for loads/stores.  */
   5474 		    if (need_pa11_opcode ()
   5475 			&& ((opcode & 0xfc000000) == 0x30000000))
   5476 		      opcode |= 1 << 27;
   5477 
   5478 		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 6 : 0);
   5479 		    continue;
   5480 		  }
   5481 
   5482 		/* Float operand 1.  */
   5483 		case 'a':
   5484 		  {
   5485 		    if (!pa_parse_number (&s, 1))
   5486 		      break;
   5487 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5488 		    CHECK_FIELD (num, 31, 0, 0);
   5489 		    opcode |= num << 21;
   5490 		    if (need_pa11_opcode ())
   5491 		      {
   5492 			opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0);
   5493 			opcode |= 1 << 27;
   5494 		      }
   5495 		    continue;
   5496 		  }
   5497 
   5498 		/* Float operand 1 with L/R selection.  */
   5499 		case 'X':
   5500 		case 'A':
   5501 		  {
   5502 		    if (!pa_parse_number (&s, 1))
   5503 		      break;
   5504 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5505 		    CHECK_FIELD (num, 31, 0, 0);
   5506 		    opcode |= num << 21;
   5507 		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0);
   5508 		    continue;
   5509 		  }
   5510 
   5511 		/* Float operand 2.  */
   5512 		case 'b':
   5513 		  {
   5514 		    if (!pa_parse_number (&s, 1))
   5515 		      break;
   5516 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5517 		    CHECK_FIELD (num, 31, 0, 0);
   5518 		    opcode |= num << 16;
   5519 		    if (need_pa11_opcode ())
   5520 		      {
   5521 			opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0);
   5522 			opcode |= 1 << 27;
   5523 		      }
   5524 		    continue;
   5525 		  }
   5526 
   5527 		/* Float operand 2 with L/R selection.  */
   5528 		case 'B':
   5529 		  {
   5530 		    if (!pa_parse_number (&s, 1))
   5531 		      break;
   5532 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5533 		    CHECK_FIELD (num, 31, 0, 0);
   5534 		    opcode |= num << 16;
   5535 		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0);
   5536 		    continue;
   5537 		  }
   5538 
   5539 		/* Float operand 3 for fmpyfadd, fmpynfadd.  */
   5540 		case 'C':
   5541 		  {
   5542 		    if (!pa_parse_number (&s, 1))
   5543 		      break;
   5544 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5545 		    CHECK_FIELD (num, 31, 0, 0);
   5546 		    opcode |= (num & 0x1c) << 11;
   5547 		    opcode |= (num & 0x03) << 9;
   5548 		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 8 : 0);
   5549 		    continue;
   5550 		  }
   5551 
   5552 		/* Float mult operand 1 for fmpyadd, fmpysub */
   5553 		case 'i':
   5554 		  {
   5555 		    if (!pa_parse_number (&s, 1))
   5556 		      break;
   5557 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5558 		    CHECK_FIELD (num, 31, 0, 0);
   5559 		    if (the_insn.fpof1 == SGL)
   5560 		      {
   5561 			if (num < 16)
   5562 			  {
   5563 			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
   5564 			    break;
   5565 			  }
   5566 			num &= 0xF;
   5567 			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
   5568 		      }
   5569 		    INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   5570 		  }
   5571 
   5572 		/* Float mult operand 2 for fmpyadd, fmpysub */
   5573 		case 'j':
   5574 		  {
   5575 		    if (!pa_parse_number (&s, 1))
   5576 		      break;
   5577 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5578 		    CHECK_FIELD (num, 31, 0, 0);
   5579 		    if (the_insn.fpof1 == SGL)
   5580 		      {
   5581 			if (num < 16)
   5582 			  {
   5583 			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
   5584 			    break;
   5585 			  }
   5586 			num &= 0xF;
   5587 			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
   5588 		      }
   5589 		    INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   5590 		  }
   5591 
   5592 		/* Float mult target for fmpyadd, fmpysub */
   5593 		case 'k':
   5594 		  {
   5595 		    if (!pa_parse_number (&s, 1))
   5596 		      break;
   5597 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5598 		    CHECK_FIELD (num, 31, 0, 0);
   5599 		    if (the_insn.fpof1 == SGL)
   5600 		      {
   5601 			if (num < 16)
   5602 			  {
   5603 			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
   5604 			    break;
   5605 			  }
   5606 			num &= 0xF;
   5607 			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
   5608 		      }
   5609 		    INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5610 		  }
   5611 
   5612 		/* Float add operand 1 for fmpyadd, fmpysub */
   5613 		case 'l':
   5614 		  {
   5615 		    if (!pa_parse_number (&s, 1))
   5616 		      break;
   5617 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5618 		    CHECK_FIELD (num, 31, 0, 0);
   5619 		    if (the_insn.fpof1 == SGL)
   5620 		      {
   5621 			if (num < 16)
   5622 			  {
   5623 			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
   5624 			    break;
   5625 			  }
   5626 			num &= 0xF;
   5627 			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
   5628 		      }
   5629 		    INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5630 		  }
   5631 
   5632 		/* Float add target for fmpyadd, fmpysub */
   5633 		case 'm':
   5634 		  {
   5635 		    if (!pa_parse_number (&s, 1))
   5636 		      break;
   5637 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5638 		    CHECK_FIELD (num, 31, 0, 0);
   5639 		    if (the_insn.fpof1 == SGL)
   5640 		      {
   5641 			if (num < 16)
   5642 			  {
   5643 			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
   5644 			    break;
   5645 			  }
   5646 			num &= 0xF;
   5647 			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
   5648 		      }
   5649 		    INSERT_FIELD_AND_CONTINUE (opcode, num, 11);
   5650 		  }
   5651 
   5652 		/* Handle L/R register halves like 'x'.  */
   5653 		case 'E':
   5654 		case 'e':
   5655 		  {
   5656 		    if (!pa_parse_number (&s, 1))
   5657 		      break;
   5658 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5659 		    CHECK_FIELD (num, 31, 0, 0);
   5660 		    opcode |= num << 16;
   5661 		    if (need_pa11_opcode ())
   5662 		      {
   5663 			opcode |= (pa_number & FP_REG_RSEL ? 1 << 1 : 0);
   5664 		      }
   5665 		    continue;
   5666 		  }
   5667 
   5668 		/* Float target register (PA 2.0 wide).  */
   5669 		case 'x':
   5670 		  if (!pa_parse_number (&s, 3))
   5671 		    break;
   5672 		  num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5673 		  CHECK_FIELD (num, 31, 0, 0);
   5674 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   5675 
   5676 		default:
   5677 		  abort ();
   5678 		}
   5679 	      break;
   5680 
   5681 	    default:
   5682 	      abort ();
   5683 	    }
   5684 	  break;
   5685 	}
   5686 
   5687       /* If this instruction is specific to a particular architecture,
   5688 	 then set a new architecture.  This automatic promotion crud is
   5689 	 for compatibility with HP's old assemblers only.  */
   5690       if (match == TRUE
   5691 	  && bfd_get_mach (stdoutput) < insn->arch
   5692 	  && !bfd_set_arch_mach (stdoutput, bfd_arch_hppa, insn->arch))
   5693 	{
   5694 	  as_warn (_("could not update architecture and machine"));
   5695 	  match = FALSE;
   5696 	}
   5697 
   5698  failed:
   5699       /* Check if the args matched.  */
   5700       if (!match)
   5701 	{
   5702 	  if (&insn[1] - pa_opcodes < (int) NUMOPCODES
   5703 	      && !strcmp (insn->name, insn[1].name))
   5704 	    {
   5705 	      ++insn;
   5706 	      s = argstart;
   5707 	      continue;
   5708 	    }
   5709 	  else
   5710 	    {
   5711 	      as_bad (_("Invalid operands %s"), error_message);
   5712 	      return;
   5713 	    }
   5714 	}
   5715       break;
   5716     }
   5717 
   5718   if (immediate_check)
   5719     {
   5720       if (pos != -1 && len != -1 && pos < len - 1)
   5721         as_warn (_("Immediates %d and %d will give undefined behavior."),
   5722 			pos, len);
   5723     }
   5724 
   5725   the_insn.opcode = opcode;
   5726 }
   5727 
   5728 /* Assemble a single instruction storing it into a frag.  */
   5729 
   5730 void
   5731 md_assemble (char *str)
   5732 {
   5733   char *to;
   5734 
   5735   /* The had better be something to assemble.  */
   5736   gas_assert (str);
   5737 
   5738   /* If we are within a procedure definition, make sure we've
   5739      defined a label for the procedure; handle case where the
   5740      label was defined after the .PROC directive.
   5741 
   5742      Note there's not need to diddle with the segment or fragment
   5743      for the label symbol in this case.  We have already switched
   5744      into the new $CODE$ subspace at this point.  */
   5745   if (within_procedure && last_call_info->start_symbol == NULL)
   5746     {
   5747       label_symbol_struct *label_symbol = pa_get_label ();
   5748 
   5749       if (label_symbol)
   5750 	{
   5751 	  if (label_symbol->lss_label)
   5752 	    {
   5753 	      last_call_info->start_symbol = label_symbol->lss_label;
   5754 	      symbol_get_bfdsym (label_symbol->lss_label)->flags
   5755 		|= BSF_FUNCTION;
   5756 #ifdef OBJ_SOM
   5757 	      /* Also handle allocation of a fixup to hold the unwind
   5758 		 information when the label appears after the proc/procend.  */
   5759 	      if (within_entry_exit)
   5760 		{
   5761 		  char *where;
   5762 		  unsigned int u;
   5763 
   5764 		  where = frag_more (0);
   5765 		  u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
   5766 		  fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   5767 				NULL, (offsetT) 0, NULL,
   5768 				0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
   5769 		}
   5770 #endif
   5771 	    }
   5772 	  else
   5773 	    as_bad (_("Missing function name for .PROC (corrupted label chain)"));
   5774 	}
   5775       else
   5776 	as_bad (_("Missing function name for .PROC"));
   5777     }
   5778 
   5779   /* Assemble the instruction.  Results are saved into "the_insn".  */
   5780   pa_ip (str);
   5781 
   5782   /* Get somewhere to put the assembled instruction.  */
   5783   to = frag_more (4);
   5784 
   5785   /* Output the opcode.  */
   5786   md_number_to_chars (to, the_insn.opcode, 4);
   5787 
   5788   /* If necessary output more stuff.  */
   5789   if (the_insn.reloc != R_HPPA_NONE)
   5790     fix_new_hppa (frag_now, (to - frag_now->fr_literal), 4, NULL,
   5791 		  (offsetT) 0, &the_insn.exp, the_insn.pcrel,
   5792 		  the_insn.reloc, the_insn.field_selector,
   5793 		  the_insn.format, the_insn.arg_reloc, 0);
   5794 
   5795 #ifdef OBJ_ELF
   5796   dwarf2_emit_insn (4);
   5797 #endif
   5798 }
   5799 
   5800 #ifdef OBJ_SOM
   5801 /* Handle an alignment directive.  Special so that we can update the
   5802    alignment of the subspace if necessary.  */
   5803 static void
   5804 pa_align (int bytes)
   5805 {
   5806   /* We must have a valid space and subspace.  */
   5807   pa_check_current_space_and_subspace ();
   5808 
   5809   /* Let the generic gas code do most of the work.  */
   5810   s_align_bytes (bytes);
   5811 
   5812   /* If bytes is a power of 2, then update the current subspace's
   5813      alignment if necessary.  */
   5814   if (exact_log2 (bytes) != -1)
   5815     record_alignment (current_subspace->ssd_seg, exact_log2 (bytes));
   5816 }
   5817 #endif
   5818 
   5819 /* Handle a .BLOCK type pseudo-op.  */
   5820 
   5821 static void
   5822 pa_block (int z ATTRIBUTE_UNUSED)
   5823 {
   5824   unsigned int temp_size;
   5825 
   5826 #ifdef OBJ_SOM
   5827   /* We must have a valid space and subspace.  */
   5828   pa_check_current_space_and_subspace ();
   5829 #endif
   5830 
   5831   temp_size = get_absolute_expression ();
   5832 
   5833   if (temp_size > 0x3FFFFFFF)
   5834     {
   5835       as_bad (_("Argument to .BLOCK/.BLOCKZ must be between 0 and 0x3fffffff"));
   5836       temp_size = 0;
   5837     }
   5838   else
   5839     {
   5840       /* Always fill with zeros, that's what the HP assembler does.  */
   5841       char *p = frag_var (rs_fill, 1, 1, 0, NULL, temp_size, NULL);
   5842       *p = 0;
   5843     }
   5844 
   5845   pa_undefine_label ();
   5846   demand_empty_rest_of_line ();
   5847 }
   5848 
   5849 /* Handle a .begin_brtab and .end_brtab pseudo-op.  */
   5850 
   5851 static void
   5852 pa_brtab (int begin ATTRIBUTE_UNUSED)
   5853 {
   5854 
   5855 #ifdef OBJ_SOM
   5856   /* The BRTAB relocations are only available in SOM (to denote
   5857      the beginning and end of branch tables).  */
   5858   char *where = frag_more (0);
   5859 
   5860   fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   5861 		NULL, (offsetT) 0, NULL,
   5862 		0, begin ? R_HPPA_BEGIN_BRTAB : R_HPPA_END_BRTAB,
   5863 		e_fsel, 0, 0, 0);
   5864 #endif
   5865 
   5866   demand_empty_rest_of_line ();
   5867 }
   5868 
   5869 /* Handle a .begin_try and .end_try pseudo-op.  */
   5870 
   5871 static void
   5872 pa_try (int begin ATTRIBUTE_UNUSED)
   5873 {
   5874 #ifdef OBJ_SOM
   5875   expressionS exp;
   5876   char *where = frag_more (0);
   5877 
   5878   if (! begin)
   5879     expression (&exp);
   5880 
   5881   /* The TRY relocations are only available in SOM (to denote
   5882      the beginning and end of exception handling regions).  */
   5883 
   5884   fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   5885 		NULL, (offsetT) 0, begin ? NULL : &exp,
   5886 		0, begin ? R_HPPA_BEGIN_TRY : R_HPPA_END_TRY,
   5887 		e_fsel, 0, 0, 0);
   5888 #endif
   5889 
   5890   demand_empty_rest_of_line ();
   5891 }
   5892 
   5893 /* Do the dirty work of building a call descriptor which describes
   5894    where the caller placed arguments to a function call.  */
   5895 
   5896 static void
   5897 pa_call_args (struct call_desc *call_desc)
   5898 {
   5899   char *name, c;
   5900   unsigned int temp, arg_reloc;
   5901 
   5902   while (!is_end_of_statement ())
   5903     {
   5904       c = get_symbol_name (&name);
   5905       /* Process a source argument.  */
   5906       if ((strncasecmp (name, "argw", 4) == 0))
   5907 	{
   5908 	  temp = atoi (name + 4);
   5909 	  (void) restore_line_pointer (c);
   5910 	  input_line_pointer++;
   5911 	  c = get_symbol_name (&name);
   5912 	  arg_reloc = pa_build_arg_reloc (name);
   5913 	  call_desc->arg_reloc |= pa_align_arg_reloc (temp, arg_reloc);
   5914 	}
   5915       /* Process a return value.  */
   5916       else if ((strncasecmp (name, "rtnval", 6) == 0))
   5917 	{
   5918 	  (void) restore_line_pointer (c);
   5919 	  input_line_pointer++;
   5920 	  c = get_symbol_name (&name);
   5921 	  arg_reloc = pa_build_arg_reloc (name);
   5922 	  call_desc->arg_reloc |= (arg_reloc & 0x3);
   5923 	}
   5924       else
   5925 	{
   5926 	  as_bad (_("Invalid .CALL argument: %s"), name);
   5927 	}
   5928 
   5929       (void) restore_line_pointer (c);
   5930       if (!is_end_of_statement ())
   5931 	input_line_pointer++;
   5932     }
   5933 }
   5934 
   5935 /* Handle a .CALL pseudo-op.  This involves storing away information
   5936    about where arguments are to be found so the linker can detect
   5937    (and correct) argument location mismatches between caller and callee.  */
   5938 
   5939 static void
   5940 pa_call (int unused ATTRIBUTE_UNUSED)
   5941 {
   5942 #ifdef OBJ_SOM
   5943   /* We must have a valid space and subspace.  */
   5944   pa_check_current_space_and_subspace ();
   5945 #endif
   5946 
   5947   pa_call_args (&last_call_desc);
   5948   demand_empty_rest_of_line ();
   5949 }
   5950 
   5951 #ifdef OBJ_ELF
   5952 /* Build an entry in the UNWIND subspace from the given function
   5953    attributes in CALL_INFO.  This is not needed for SOM as using
   5954    R_ENTRY and R_EXIT relocations allow the linker to handle building
   5955    of the unwind spaces.  */
   5956 
   5957 static void
   5958 pa_build_unwind_subspace (struct call_info *call_info)
   5959 {
   5960   asection *seg, *save_seg;
   5961   subsegT save_subseg;
   5962   unsigned int unwind;
   5963   int reloc;
   5964   char *name, *p;
   5965   symbolS *symbolP;
   5966 
   5967   if ((bfd_get_section_flags (stdoutput, now_seg)
   5968        & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
   5969       != (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
   5970     return;
   5971 
   5972   if (call_info->start_symbol == NULL)
   5973     /* This can happen if there were errors earlier on in the assembly.  */
   5974     return;
   5975 
   5976   /* Replace the start symbol with a local symbol that will be reduced
   5977      to a section offset.  This avoids problems with weak functions with
   5978      multiple definitions, etc.  */
   5979   name = concat ("L$\001start_", S_GET_NAME (call_info->start_symbol),
   5980 		 (char *) NULL);
   5981 
   5982   /* If we have a .procend preceded by a .exit, then the symbol will have
   5983      already been defined.  In that case, we don't want another unwind
   5984      entry.  */
   5985   symbolP = symbol_find (name);
   5986   if (symbolP)
   5987     {
   5988       xfree (name);
   5989       return;
   5990     }
   5991   else
   5992     {
   5993       symbolP = symbol_new (name, now_seg,
   5994 			    S_GET_VALUE (call_info->start_symbol), frag_now);
   5995       gas_assert (symbolP);
   5996       S_CLEAR_EXTERNAL (symbolP);
   5997       symbol_table_insert (symbolP);
   5998     }
   5999 
   6000   reloc = R_PARISC_SEGREL32;
   6001   save_seg = now_seg;
   6002   save_subseg = now_subseg;
   6003   /* Get into the right seg/subseg.  This may involve creating
   6004      the seg the first time through.  Make sure to have the
   6005      old seg/subseg so that we can reset things when we are done.  */
   6006   seg = bfd_get_section_by_name (stdoutput, UNWIND_SECTION_NAME);
   6007   if (seg == ASEC_NULL)
   6008     {
   6009       seg = subseg_new (UNWIND_SECTION_NAME, 0);
   6010       bfd_set_section_flags (stdoutput, seg,
   6011 			     SEC_READONLY | SEC_HAS_CONTENTS
   6012 			     | SEC_LOAD | SEC_RELOC | SEC_ALLOC | SEC_DATA);
   6013       bfd_set_section_alignment (stdoutput, seg, 2);
   6014     }
   6015 
   6016   subseg_set (seg, 0);
   6017 
   6018   /* Get some space to hold relocation information for the unwind
   6019      descriptor.  */
   6020   p = frag_more (16);
   6021 
   6022   /* Relocation info. for start offset of the function.  */
   6023   md_number_to_chars (p, 0, 4);
   6024   fix_new_hppa (frag_now, p - frag_now->fr_literal, 4,
   6025 		symbolP, (offsetT) 0,
   6026 		(expressionS *) NULL, 0, reloc,
   6027 		e_fsel, 32, 0, 0);
   6028 
   6029   /* Relocation info. for end offset of the function.
   6030 
   6031      Because we allow reductions of 32bit relocations for ELF, this will be
   6032      reduced to section_sym + offset which avoids putting the temporary
   6033      symbol into the symbol table.  It (should) end up giving the same
   6034      value as call_info->start_symbol + function size once the linker is
   6035      finished with its work.  */
   6036   md_number_to_chars (p + 4, 0, 4);
   6037   fix_new_hppa (frag_now, p + 4 - frag_now->fr_literal, 4,
   6038 		call_info->end_symbol, (offsetT) 0,
   6039 		(expressionS *) NULL, 0, reloc,
   6040 		e_fsel, 32, 0, 0);
   6041 
   6042   /* Dump the descriptor.  */
   6043   unwind = UNWIND_LOW32 (&call_info->ci_unwind.descriptor);
   6044   md_number_to_chars (p + 8, unwind, 4);
   6045 
   6046   unwind = UNWIND_HIGH32 (&call_info->ci_unwind.descriptor);
   6047   md_number_to_chars (p + 12, unwind, 4);
   6048 
   6049   /* Return back to the original segment/subsegment.  */
   6050   subseg_set (save_seg, save_subseg);
   6051 }
   6052 #endif
   6053 
   6054 /* Process a .CALLINFO pseudo-op.  This information is used later
   6055    to build unwind descriptors and maybe one day to support
   6056    .ENTER and .LEAVE.  */
   6057 
   6058 static void
   6059 pa_callinfo (int unused ATTRIBUTE_UNUSED)
   6060 {
   6061   char *name, c;
   6062   int temp;
   6063 
   6064 #ifdef OBJ_SOM
   6065   /* We must have a valid space and subspace.  */
   6066   pa_check_current_space_and_subspace ();
   6067 #endif
   6068 
   6069   /* .CALLINFO must appear within a procedure definition.  */
   6070   if (!within_procedure)
   6071     as_bad (_(".callinfo is not within a procedure definition"));
   6072 
   6073   /* Mark the fact that we found the .CALLINFO for the
   6074      current procedure.  */
   6075   callinfo_found = TRUE;
   6076 
   6077   /* Iterate over the .CALLINFO arguments.  */
   6078   while (!is_end_of_statement ())
   6079     {
   6080       c = get_symbol_name (&name);
   6081       /* Frame size specification.  */
   6082       if ((strncasecmp (name, "frame", 5) == 0))
   6083 	{
   6084 	  (void) restore_line_pointer (c);
   6085 	  input_line_pointer++;
   6086 	  temp = get_absolute_expression ();
   6087 	  if ((temp & 0x3) != 0)
   6088 	    {
   6089 	      as_bad (_("FRAME parameter must be a multiple of 8: %d\n"), temp);
   6090 	      temp = 0;
   6091 	    }
   6092 
   6093 	  /* callinfo is in bytes and unwind_desc is in 8 byte units.  */
   6094 	  last_call_info->ci_unwind.descriptor.frame_size = temp / 8;
   6095 	}
   6096       /* Entry register (GR, GR and SR) specifications.  */
   6097       else if ((strncasecmp (name, "entry_gr", 8) == 0))
   6098 	{
   6099 	  (void) restore_line_pointer (c);
   6100 	  input_line_pointer++;
   6101 	  temp = get_absolute_expression ();
   6102 	  /* The HP assembler accepts 19 as the high bound for ENTRY_GR
   6103 	     even though %r19 is caller saved.  I think this is a bug in
   6104 	     the HP assembler, and we are not going to emulate it.  */
   6105 	  if (temp < 3 || temp > 18)
   6106 	    as_bad (_("Value for ENTRY_GR must be in the range 3..18\n"));
   6107 	  last_call_info->ci_unwind.descriptor.entry_gr = temp - 2;
   6108 	}
   6109       else if ((strncasecmp (name, "entry_fr", 8) == 0))
   6110 	{
   6111 	  (void) restore_line_pointer (c);
   6112 	  input_line_pointer++;
   6113 	  temp = get_absolute_expression ();
   6114 	  /* Similarly the HP assembler takes 31 as the high bound even
   6115 	     though %fr21 is the last callee saved floating point register.  */
   6116 	  if (temp < 12 || temp > 21)
   6117 	    as_bad (_("Value for ENTRY_FR must be in the range 12..21\n"));
   6118 	  last_call_info->ci_unwind.descriptor.entry_fr = temp - 11;
   6119 	}
   6120       else if ((strncasecmp (name, "entry_sr", 8) == 0))
   6121 	{
   6122 	  (void) restore_line_pointer (c);
   6123 	  input_line_pointer++;
   6124 	  temp = get_absolute_expression ();
   6125 	  if (temp != 3)
   6126 	    as_bad (_("Value for ENTRY_SR must be 3\n"));
   6127 	}
   6128       /* Note whether or not this function performs any calls.  */
   6129       else if ((strncasecmp (name, "calls", 5) == 0)
   6130 	       || (strncasecmp (name, "caller", 6) == 0))
   6131 	{
   6132 	  (void) restore_line_pointer (c);
   6133 	}
   6134       else if ((strncasecmp (name, "no_calls", 8) == 0))
   6135 	{
   6136 	  (void) restore_line_pointer (c);
   6137 	}
   6138       /* Should RP be saved into the stack.  */
   6139       else if ((strncasecmp (name, "save_rp", 7) == 0))
   6140 	{
   6141 	  (void) restore_line_pointer (c);
   6142 	  last_call_info->ci_unwind.descriptor.save_rp = 1;
   6143 	}
   6144       /* Likewise for SP.  */
   6145       else if ((strncasecmp (name, "save_sp", 7) == 0))
   6146 	{
   6147 	  (void) restore_line_pointer (c);
   6148 	  last_call_info->ci_unwind.descriptor.save_sp = 1;
   6149 	}
   6150       /* Is this an unwindable procedure.  If so mark it so
   6151 	 in the unwind descriptor.  */
   6152       else if ((strncasecmp (name, "no_unwind", 9) == 0))
   6153 	{
   6154 	  (void) restore_line_pointer (c);
   6155 	  last_call_info->ci_unwind.descriptor.cannot_unwind = 1;
   6156 	}
   6157       /* Is this an interrupt routine.  If so mark it in the
   6158 	 unwind descriptor.  */
   6159       else if ((strncasecmp (name, "hpux_int", 7) == 0))
   6160 	{
   6161 	  (void) restore_line_pointer (c);
   6162 	  last_call_info->ci_unwind.descriptor.hpux_interrupt_marker = 1;
   6163 	}
   6164       /* Is this a millicode routine.  "millicode" isn't in my
   6165 	 assembler manual, but my copy is old.  The HP assembler
   6166 	 accepts it, and there's a place in the unwind descriptor
   6167 	 to drop the information, so we'll accept it too.  */
   6168       else if ((strncasecmp (name, "millicode", 9) == 0))
   6169 	{
   6170 	  (void) restore_line_pointer (c);
   6171 	  last_call_info->ci_unwind.descriptor.millicode = 1;
   6172 	}
   6173       else
   6174 	{
   6175 	  as_bad (_("Invalid .CALLINFO argument: %s"), name);
   6176 	  (void) restore_line_pointer (c);
   6177 	}
   6178 
   6179       if (!is_end_of_statement ())
   6180 	input_line_pointer++;
   6181     }
   6182 
   6183   demand_empty_rest_of_line ();
   6184 }
   6185 
   6186 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
   6187 /* Switch to the text space.  Like s_text, but delete our
   6188    label when finished.  */
   6189 
   6190 static void
   6191 pa_text (int unused ATTRIBUTE_UNUSED)
   6192 {
   6193 #ifdef OBJ_SOM
   6194   current_space = is_defined_space ("$TEXT$");
   6195   current_subspace
   6196     = pa_subsegment_to_subspace (current_space->sd_seg, 0);
   6197 #endif
   6198 
   6199   s_text (0);
   6200   pa_undefine_label ();
   6201 }
   6202 
   6203 /* Switch to the data space.  As usual delete our label.  */
   6204 
   6205 static void
   6206 pa_data (int unused ATTRIBUTE_UNUSED)
   6207 {
   6208 #ifdef OBJ_SOM
   6209   current_space = is_defined_space ("$PRIVATE$");
   6210   current_subspace
   6211     = pa_subsegment_to_subspace (current_space->sd_seg, 0);
   6212 #endif
   6213   s_data (0);
   6214   pa_undefine_label ();
   6215 }
   6216 
   6217 /* This is different than the standard GAS s_comm(). On HP9000/800 machines,
   6218    the .comm pseudo-op has the following syntax:
   6219 
   6220    <label> .comm <length>
   6221 
   6222    where <label> is optional and is a symbol whose address will be the start of
   6223    a block of memory <length> bytes long. <length> must be an absolute
   6224    expression.  <length> bytes will be allocated in the current space
   6225    and subspace.
   6226 
   6227    Also note the label may not even be on the same line as the .comm.
   6228 
   6229    This difference in syntax means the colon function will be called
   6230    on the symbol before we arrive in pa_comm.  colon will set a number
   6231    of attributes of the symbol that need to be fixed here.  In particular
   6232    the value, section pointer, fragment pointer, flags, etc.  What
   6233    a pain.
   6234 
   6235    This also makes error detection all but impossible.  */
   6236 
   6237 static void
   6238 pa_comm (int unused ATTRIBUTE_UNUSED)
   6239 {
   6240   unsigned int size;
   6241   symbolS *symbol;
   6242   label_symbol_struct *label_symbol = pa_get_label ();
   6243 
   6244   if (label_symbol)
   6245     symbol = label_symbol->lss_label;
   6246   else
   6247     symbol = NULL;
   6248 
   6249   SKIP_WHITESPACE ();
   6250   size = get_absolute_expression ();
   6251 
   6252   if (symbol)
   6253     {
   6254       symbol_get_bfdsym (symbol)->flags |= BSF_OBJECT;
   6255       S_SET_VALUE (symbol, size);
   6256       S_SET_SEGMENT (symbol, bfd_com_section_ptr);
   6257       S_SET_EXTERNAL (symbol);
   6258 
   6259       /* colon() has already set the frag to the current location in the
   6260 	 current subspace; we need to reset the fragment to the zero address
   6261 	 fragment.  We also need to reset the segment pointer.  */
   6262       symbol_set_frag (symbol, &zero_address_frag);
   6263     }
   6264   demand_empty_rest_of_line ();
   6265 }
   6266 #endif /* !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) */
   6267 
   6268 /* Process a .END pseudo-op.  */
   6269 
   6270 static void
   6271 pa_end (int unused ATTRIBUTE_UNUSED)
   6272 {
   6273   demand_empty_rest_of_line ();
   6274 }
   6275 
   6276 /* Process a .ENTER pseudo-op.  This is not supported.  */
   6277 
   6278 static void
   6279 pa_enter (int unused ATTRIBUTE_UNUSED)
   6280 {
   6281 #ifdef OBJ_SOM
   6282   /* We must have a valid space and subspace.  */
   6283   pa_check_current_space_and_subspace ();
   6284 #endif
   6285 
   6286   as_bad (_("The .ENTER pseudo-op is not supported"));
   6287   demand_empty_rest_of_line ();
   6288 }
   6289 
   6290 /* Process a .ENTRY pseudo-op.  .ENTRY marks the beginning of the
   6291    procedure.  */
   6292 
   6293 static void
   6294 pa_entry (int unused ATTRIBUTE_UNUSED)
   6295 {
   6296 #ifdef OBJ_SOM
   6297   /* We must have a valid space and subspace.  */
   6298   pa_check_current_space_and_subspace ();
   6299 #endif
   6300 
   6301   if (!within_procedure)
   6302     as_bad (_("Misplaced .entry. Ignored."));
   6303   else
   6304     {
   6305       if (!callinfo_found)
   6306 	as_bad (_("Missing .callinfo."));
   6307     }
   6308   demand_empty_rest_of_line ();
   6309   within_entry_exit = TRUE;
   6310 
   6311 #ifdef OBJ_SOM
   6312   /* SOM defers building of unwind descriptors until the link phase.
   6313      The assembler is responsible for creating an R_ENTRY relocation
   6314      to mark the beginning of a region and hold the unwind bits, and
   6315      for creating an R_EXIT relocation to mark the end of the region.
   6316 
   6317      FIXME.  ELF should be using the same conventions!  The problem
   6318      is an unwind requires too much relocation space.  Hmmm.  Maybe
   6319      if we split the unwind bits up between the relocations which
   6320      denote the entry and exit points.  */
   6321   if (last_call_info->start_symbol != NULL)
   6322     {
   6323       char *where;
   6324       unsigned int u;
   6325 
   6326       where = frag_more (0);
   6327       u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
   6328       fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   6329 		    NULL, (offsetT) 0, NULL,
   6330 		    0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
   6331     }
   6332 #endif
   6333 }
   6334 
   6335 /* Silly nonsense for pa_equ.  The only half-sensible use for this is
   6336    being able to subtract two register symbols that specify a range of
   6337    registers, to get the size of the range.  */
   6338 static int fudge_reg_expressions;
   6339 
   6340 int
   6341 hppa_force_reg_syms_absolute (expressionS *resultP,
   6342 			      operatorT op ATTRIBUTE_UNUSED,
   6343 			      expressionS *rightP)
   6344 {
   6345   if (fudge_reg_expressions
   6346       && rightP->X_op == O_register
   6347       && resultP->X_op == O_register)
   6348     {
   6349       rightP->X_op = O_constant;
   6350       resultP->X_op = O_constant;
   6351     }
   6352   return 0;  /* Continue normal expr handling.  */
   6353 }
   6354 
   6355 /* Handle a .EQU pseudo-op.  */
   6356 
   6357 static void
   6358 pa_equ (int reg)
   6359 {
   6360   label_symbol_struct *label_symbol = pa_get_label ();
   6361   symbolS *symbol;
   6362 
   6363   if (label_symbol)
   6364     {
   6365       symbol = label_symbol->lss_label;
   6366       if (reg)
   6367 	{
   6368 	  strict = 1;
   6369 	  if (!pa_parse_number (&input_line_pointer, 0))
   6370 	    as_bad (_(".REG expression must be a register"));
   6371 	  S_SET_VALUE (symbol, pa_number);
   6372 	  S_SET_SEGMENT (symbol, reg_section);
   6373 	}
   6374       else
   6375 	{
   6376 	  expressionS exp;
   6377 	  segT seg;
   6378 
   6379 	  fudge_reg_expressions = 1;
   6380 	  seg = expression (&exp);
   6381 	  fudge_reg_expressions = 0;
   6382 	  if (exp.X_op != O_constant
   6383 	      && exp.X_op != O_register)
   6384 	    {
   6385 	      if (exp.X_op != O_absent)
   6386 		as_bad (_("bad or irreducible absolute expression; zero assumed"));
   6387 	      exp.X_add_number = 0;
   6388 	      seg = absolute_section;
   6389 	    }
   6390 	  S_SET_VALUE (symbol, (unsigned int) exp.X_add_number);
   6391 	  S_SET_SEGMENT (symbol, seg);
   6392 	}
   6393     }
   6394   else
   6395     {
   6396       if (reg)
   6397 	as_bad (_(".REG must use a label"));
   6398       else
   6399 	as_bad (_(".EQU must use a label"));
   6400     }
   6401 
   6402   pa_undefine_label ();
   6403   demand_empty_rest_of_line ();
   6404 }
   6405 
   6406 #ifdef OBJ_ELF
   6407 /* Mark the end of a function so that it's possible to compute
   6408    the size of the function in elf_hppa_final_processing.  */
   6409 
   6410 static void
   6411 hppa_elf_mark_end_of_function (void)
   6412 {
   6413   /* ELF does not have EXIT relocations.  All we do is create a
   6414      temporary symbol marking the end of the function.  */
   6415   char *name;
   6416   symbolS *symbolP;
   6417 
   6418   if (last_call_info == NULL || last_call_info->start_symbol == NULL)
   6419     {
   6420       /* We have already warned about a missing label,
   6421 	 or other problems.  */
   6422       return;
   6423     }
   6424 
   6425   name = concat ("L$\001end_", S_GET_NAME (last_call_info->start_symbol),
   6426 		 (char *) NULL);
   6427 
   6428   /* If we have a .exit followed by a .procend, then the
   6429      symbol will have already been defined.  */
   6430   symbolP = symbol_find (name);
   6431   if (symbolP)
   6432     {
   6433       /* The symbol has already been defined!  This can
   6434 	 happen if we have a .exit followed by a .procend.
   6435 
   6436 	 This is *not* an error.  All we want to do is free
   6437 	 the memory we just allocated for the name and continue.  */
   6438       xfree (name);
   6439     }
   6440   else
   6441     {
   6442       /* symbol value should be the offset of the
   6443 	 last instruction of the function */
   6444       symbolP = symbol_new (name, now_seg, (valueT) (frag_now_fix () - 4),
   6445 			    frag_now);
   6446 
   6447       gas_assert (symbolP);
   6448       S_CLEAR_EXTERNAL (symbolP);
   6449       symbol_table_insert (symbolP);
   6450     }
   6451 
   6452   if (symbolP)
   6453     last_call_info->end_symbol = symbolP;
   6454   else
   6455     as_bad (_("Symbol '%s' could not be created."), name);
   6456 }
   6457 #endif
   6458 
   6459 /* Helper function.  Does processing for the end of a function.  This
   6460    usually involves creating some relocations or building special
   6461    symbols to mark the end of the function.  */
   6462 
   6463 static void
   6464 process_exit (void)
   6465 {
   6466   char *where;
   6467 
   6468   where = frag_more (0);
   6469 
   6470 #ifdef OBJ_ELF
   6471   /* Mark the end of the function, stuff away the location of the frag
   6472      for the end of the function, and finally call pa_build_unwind_subspace
   6473      to add an entry in the unwind table.  */
   6474   (void) where;
   6475   hppa_elf_mark_end_of_function ();
   6476   pa_build_unwind_subspace (last_call_info);
   6477 #else
   6478   /* SOM defers building of unwind descriptors until the link phase.
   6479      The assembler is responsible for creating an R_ENTRY relocation
   6480      to mark the beginning of a region and hold the unwind bits, and
   6481      for creating an R_EXIT relocation to mark the end of the region.
   6482 
   6483      FIXME.  ELF should be using the same conventions!  The problem
   6484      is an unwind requires too much relocation space.  Hmmm.  Maybe
   6485      if we split the unwind bits up between the relocations which
   6486      denote the entry and exit points.  */
   6487   fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   6488 		NULL, (offsetT) 0,
   6489 		NULL, 0, R_HPPA_EXIT, e_fsel, 0, 0,
   6490 		UNWIND_HIGH32 (&last_call_info->ci_unwind.descriptor));
   6491 #endif
   6492 }
   6493 
   6494 /* Process a .EXIT pseudo-op.  */
   6495 
   6496 static void
   6497 pa_exit (int unused ATTRIBUTE_UNUSED)
   6498 {
   6499 #ifdef OBJ_SOM
   6500   /* We must have a valid space and subspace.  */
   6501   pa_check_current_space_and_subspace ();
   6502 #endif
   6503 
   6504   if (!within_procedure)
   6505     as_bad (_(".EXIT must appear within a procedure"));
   6506   else
   6507     {
   6508       if (!callinfo_found)
   6509 	as_bad (_("Missing .callinfo"));
   6510       else
   6511 	{
   6512 	  if (!within_entry_exit)
   6513 	    as_bad (_("No .ENTRY for this .EXIT"));
   6514 	  else
   6515 	    {
   6516 	      within_entry_exit = FALSE;
   6517 	      process_exit ();
   6518 	    }
   6519 	}
   6520     }
   6521   demand_empty_rest_of_line ();
   6522 }
   6523 
   6524 /* Helper function to process arguments to a .EXPORT pseudo-op.  */
   6525 
   6526 static void
   6527 pa_type_args (symbolS *symbolP, int is_export)
   6528 {
   6529   char *name, c;
   6530   unsigned int temp, arg_reloc;
   6531   pa_symbol_type type = SYMBOL_TYPE_UNKNOWN;
   6532   asymbol *bfdsym = symbol_get_bfdsym (symbolP);
   6533 
   6534   if (strncasecmp (input_line_pointer, "absolute", 8) == 0)
   6535     {
   6536       input_line_pointer += 8;
   6537       bfdsym->flags &= ~BSF_FUNCTION;
   6538       S_SET_SEGMENT (symbolP, bfd_abs_section_ptr);
   6539       type = SYMBOL_TYPE_ABSOLUTE;
   6540     }
   6541   else if (strncasecmp (input_line_pointer, "code", 4) == 0)
   6542     {
   6543       input_line_pointer += 4;
   6544       /* IMPORTing/EXPORTing CODE types for functions is meaningless for SOM,
   6545 	 instead one should be IMPORTing/EXPORTing ENTRY types.
   6546 
   6547 	 Complain if one tries to EXPORT a CODE type since that's never
   6548 	 done.  Both GCC and HP C still try to IMPORT CODE types, so
   6549 	 silently fix them to be ENTRY types.  */
   6550       if (S_IS_FUNCTION (symbolP))
   6551 	{
   6552 	  if (is_export)
   6553 	    as_tsktsk (_("Using ENTRY rather than CODE in export directive for %s"),
   6554 		       S_GET_NAME (symbolP));
   6555 
   6556 	  bfdsym->flags |= BSF_FUNCTION;
   6557 	  type = SYMBOL_TYPE_ENTRY;
   6558 	}
   6559       else
   6560 	{
   6561 	  bfdsym->flags &= ~BSF_FUNCTION;
   6562 	  type = SYMBOL_TYPE_CODE;
   6563 	}
   6564     }
   6565   else if (strncasecmp (input_line_pointer, "data", 4) == 0)
   6566     {
   6567       input_line_pointer += 4;
   6568       bfdsym->flags &= ~BSF_FUNCTION;
   6569       bfdsym->flags |= BSF_OBJECT;
   6570       type = SYMBOL_TYPE_DATA;
   6571     }
   6572   else if ((strncasecmp (input_line_pointer, "entry", 5) == 0))
   6573     {
   6574       input_line_pointer += 5;
   6575       bfdsym->flags |= BSF_FUNCTION;
   6576       type = SYMBOL_TYPE_ENTRY;
   6577     }
   6578   else if (strncasecmp (input_line_pointer, "millicode", 9) == 0)
   6579     {
   6580       input_line_pointer += 9;
   6581       bfdsym->flags |= BSF_FUNCTION;
   6582 #ifdef OBJ_ELF
   6583       {
   6584 	elf_symbol_type *elfsym = (elf_symbol_type *) bfdsym;
   6585 	elfsym->internal_elf_sym.st_info =
   6586 	  ELF_ST_INFO (ELF_ST_BIND (elfsym->internal_elf_sym.st_info),
   6587 		       STT_PARISC_MILLI);
   6588       }
   6589 #endif
   6590       type = SYMBOL_TYPE_MILLICODE;
   6591     }
   6592   else if (strncasecmp (input_line_pointer, "plabel", 6) == 0)
   6593     {
   6594       input_line_pointer += 6;
   6595       bfdsym->flags &= ~BSF_FUNCTION;
   6596       type = SYMBOL_TYPE_PLABEL;
   6597     }
   6598   else if (strncasecmp (input_line_pointer, "pri_prog", 8) == 0)
   6599     {
   6600       input_line_pointer += 8;
   6601       bfdsym->flags |= BSF_FUNCTION;
   6602       type = SYMBOL_TYPE_PRI_PROG;
   6603     }
   6604   else if (strncasecmp (input_line_pointer, "sec_prog", 8) == 0)
   6605     {
   6606       input_line_pointer += 8;
   6607       bfdsym->flags |= BSF_FUNCTION;
   6608       type = SYMBOL_TYPE_SEC_PROG;
   6609     }
   6610 
   6611   /* SOM requires much more information about symbol types
   6612      than BFD understands.  This is how we get this information
   6613      to the SOM BFD backend.  */
   6614 #ifdef obj_set_symbol_type
   6615   obj_set_symbol_type (bfdsym, (int) type);
   6616 #else
   6617   (void) type;
   6618 #endif
   6619 
   6620   /* Now that the type of the exported symbol has been handled,
   6621      handle any argument relocation information.  */
   6622   while (!is_end_of_statement ())
   6623     {
   6624       if (*input_line_pointer == ',')
   6625 	input_line_pointer++;
   6626       c = get_symbol_name (&name);
   6627       /* Argument sources.  */
   6628       if ((strncasecmp (name, "argw", 4) == 0))
   6629 	{
   6630 	  (void) restore_line_pointer (c);
   6631 	  input_line_pointer++;
   6632 	  temp = atoi (name + 4);
   6633 	  c = get_symbol_name (&name);
   6634 	  arg_reloc = pa_align_arg_reloc (temp, pa_build_arg_reloc (name));
   6635 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
   6636 	  symbol_arg_reloc_info (symbolP) |= arg_reloc;
   6637 #else
   6638 	  (void) arg_reloc;
   6639 #endif
   6640 	  (void) restore_line_pointer (c);
   6641 	}
   6642       /* The return value.  */
   6643       else if ((strncasecmp (name, "rtnval", 6)) == 0)
   6644 	{
   6645 	  (void) restore_line_pointer (c);
   6646 	  input_line_pointer++;
   6647 	  c = get_symbol_name (&name);
   6648 	  arg_reloc = pa_build_arg_reloc (name);
   6649 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
   6650 	  symbol_arg_reloc_info (symbolP) |= arg_reloc;
   6651 #else
   6652 	  (void) arg_reloc;
   6653 #endif
   6654 	  (void) restore_line_pointer (c);
   6655 	}
   6656       /* Privilege level.  */
   6657       else if ((strncasecmp (name, "priv_lev", 8)) == 0)
   6658 	{
   6659 	  char *priv;
   6660 
   6661 	  (void) restore_line_pointer (c);
   6662 	  input_line_pointer++;
   6663 	  temp = atoi (input_line_pointer);
   6664 #ifdef OBJ_SOM
   6665 	  ((obj_symbol_type *) bfdsym)->tc_data.ap.hppa_priv_level = temp;
   6666 #endif
   6667 	  c = get_symbol_name (&priv);
   6668 	  (void) restore_line_pointer (c);
   6669 	}
   6670       else
   6671 	{
   6672 	  as_bad (_("Undefined .EXPORT/.IMPORT argument (ignored): %s"), name);
   6673 	  (void) restore_line_pointer (c);
   6674 	}
   6675 
   6676       if (!is_end_of_statement ())
   6677 	input_line_pointer++;
   6678     }
   6679 }
   6680 
   6681 /* Process a .EXPORT directive.  This makes functions external
   6682    and provides information such as argument relocation entries
   6683    to callers.  */
   6684 
   6685 static void
   6686 pa_export (int unused ATTRIBUTE_UNUSED)
   6687 {
   6688   char *name, c;
   6689   symbolS *symbol;
   6690 
   6691   c = get_symbol_name (&name);
   6692   /* Make sure the given symbol exists.  */
   6693   if ((symbol = symbol_find_or_make (name)) == NULL)
   6694     {
   6695       as_bad (_("Cannot define export symbol: %s\n"), name);
   6696       restore_line_pointer (c);
   6697       input_line_pointer++;
   6698     }
   6699   else
   6700     {
   6701       /* OK.  Set the external bits and process argument relocations.
   6702 	 For the HP, weak and global are not mutually exclusive.
   6703 	 S_SET_EXTERNAL will not set BSF_GLOBAL if WEAK is set.
   6704 	 Call S_SET_EXTERNAL to get the other processing.  Manually
   6705 	 set BSF_GLOBAL when we get back.  */
   6706       S_SET_EXTERNAL (symbol);
   6707       symbol_get_bfdsym (symbol)->flags |= BSF_GLOBAL;
   6708       (void) restore_line_pointer (c);
   6709       if (!is_end_of_statement ())
   6710 	{
   6711 	  input_line_pointer++;
   6712 	  pa_type_args (symbol, 1);
   6713 	}
   6714     }
   6715 
   6716   demand_empty_rest_of_line ();
   6717 }
   6718 
   6719 /* Handle an .IMPORT pseudo-op.  Any symbol referenced in a given
   6720    assembly file must either be defined in the assembly file, or
   6721    explicitly IMPORTED from another.  */
   6722 
   6723 static void
   6724 pa_import (int unused ATTRIBUTE_UNUSED)
   6725 {
   6726   char *name, c;
   6727   symbolS *symbol;
   6728 
   6729   c = get_symbol_name (&name);
   6730 
   6731   symbol = symbol_find (name);
   6732   /* Ugh.  We might be importing a symbol defined earlier in the file,
   6733      in which case all the code below will really screw things up
   6734      (set the wrong segment, symbol flags & type, etc).  */
   6735   if (symbol == NULL || !S_IS_DEFINED (symbol))
   6736     {
   6737       symbol = symbol_find_or_make (name);
   6738       (void) restore_line_pointer (c);
   6739 
   6740       if (!is_end_of_statement ())
   6741 	{
   6742 	  input_line_pointer++;
   6743 	  pa_type_args (symbol, 0);
   6744 	}
   6745       else
   6746 	{
   6747 	  /* Sigh.  To be compatible with the HP assembler and to help
   6748 	     poorly written assembly code, we assign a type based on
   6749 	     the current segment.  Note only BSF_FUNCTION really
   6750 	     matters, we do not need to set the full SYMBOL_TYPE_* info.  */
   6751 	  if (now_seg == text_section)
   6752 	    symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION;
   6753 
   6754 	  /* If the section is undefined, then the symbol is undefined
   6755 	     Since this is an import, leave the section undefined.  */
   6756 	  S_SET_SEGMENT (symbol, bfd_und_section_ptr);
   6757 	}
   6758     }
   6759   else
   6760     {
   6761       /* The symbol was already defined.  Just eat everything up to
   6762 	 the end of the current statement.  */
   6763       while (!is_end_of_statement ())
   6764 	input_line_pointer++;
   6765     }
   6766 
   6767   demand_empty_rest_of_line ();
   6768 }
   6769 
   6770 /* Handle a .LABEL pseudo-op.  */
   6771 
   6772 static void
   6773 pa_label (int unused ATTRIBUTE_UNUSED)
   6774 {
   6775   char *name, c;
   6776 
   6777   c = get_symbol_name (&name);
   6778 
   6779   if (strlen (name) > 0)
   6780     {
   6781       colon (name);
   6782       (void) restore_line_pointer (c);
   6783     }
   6784   else
   6785     {
   6786       as_warn (_("Missing label name on .LABEL"));
   6787     }
   6788 
   6789   if (!is_end_of_statement ())
   6790     {
   6791       as_warn (_("extra .LABEL arguments ignored."));
   6792       ignore_rest_of_line ();
   6793     }
   6794   demand_empty_rest_of_line ();
   6795 }
   6796 
   6797 /* Handle a .LEAVE pseudo-op.  This is not supported yet.  */
   6798 
   6799 static void
   6800 pa_leave (int unused ATTRIBUTE_UNUSED)
   6801 {
   6802 #ifdef OBJ_SOM
   6803   /* We must have a valid space and subspace.  */
   6804   pa_check_current_space_and_subspace ();
   6805 #endif
   6806 
   6807   as_bad (_("The .LEAVE pseudo-op is not supported"));
   6808   demand_empty_rest_of_line ();
   6809 }
   6810 
   6811 /* Handle a .LEVEL pseudo-op.  */
   6812 
   6813 static void
   6814 pa_level (int unused ATTRIBUTE_UNUSED)
   6815 {
   6816   char *level;
   6817 
   6818   level = input_line_pointer;
   6819   if (strncmp (level, "1.0", 3) == 0)
   6820     {
   6821       input_line_pointer += 3;
   6822       if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 10))
   6823 	as_warn (_("could not set architecture and machine"));
   6824     }
   6825   else if (strncmp (level, "1.1", 3) == 0)
   6826     {
   6827       input_line_pointer += 3;
   6828       if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 11))
   6829 	as_warn (_("could not set architecture and machine"));
   6830     }
   6831   else if (strncmp (level, "2.0w", 4) == 0)
   6832     {
   6833       input_line_pointer += 4;
   6834       if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 25))
   6835 	as_warn (_("could not set architecture and machine"));
   6836     }
   6837   else if (strncmp (level, "2.0", 3) == 0)
   6838     {
   6839       input_line_pointer += 3;
   6840       if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 20))
   6841 	as_warn (_("could not set architecture and machine"));
   6842     }
   6843   else
   6844     {
   6845       as_bad (_("Unrecognized .LEVEL argument\n"));
   6846       ignore_rest_of_line ();
   6847     }
   6848   demand_empty_rest_of_line ();
   6849 }
   6850 
   6851 /* Handle a .ORIGIN pseudo-op.  */
   6852 
   6853 static void
   6854 pa_origin (int unused ATTRIBUTE_UNUSED)
   6855 {
   6856 #ifdef OBJ_SOM
   6857   /* We must have a valid space and subspace.  */
   6858   pa_check_current_space_and_subspace ();
   6859 #endif
   6860 
   6861   s_org (0);
   6862   pa_undefine_label ();
   6863 }
   6864 
   6865 /* Handle a .PARAM pseudo-op.  This is much like a .EXPORT, except it
   6866    is for static functions.  FIXME.  Should share more code with .EXPORT.  */
   6867 
   6868 static void
   6869 pa_param (int unused ATTRIBUTE_UNUSED)
   6870 {
   6871   char *name, c;
   6872   symbolS *symbol;
   6873 
   6874   c = get_symbol_name (&name);
   6875 
   6876   if ((symbol = symbol_find_or_make (name)) == NULL)
   6877     {
   6878       as_bad (_("Cannot define static symbol: %s\n"), name);
   6879       (void) restore_line_pointer (c);
   6880       input_line_pointer++;
   6881     }
   6882   else
   6883     {
   6884       S_CLEAR_EXTERNAL (symbol);
   6885       (void) restore_line_pointer (c);
   6886       if (!is_end_of_statement ())
   6887 	{
   6888 	  input_line_pointer++;
   6889 	  pa_type_args (symbol, 0);
   6890 	}
   6891     }
   6892 
   6893   demand_empty_rest_of_line ();
   6894 }
   6895 
   6896 /* Handle a .PROC pseudo-op.  It is used to mark the beginning
   6897    of a procedure from a syntactical point of view.  */
   6898 
   6899 static void
   6900 pa_proc (int unused ATTRIBUTE_UNUSED)
   6901 {
   6902   struct call_info *call_info;
   6903 
   6904 #ifdef OBJ_SOM
   6905   /* We must have a valid space and subspace.  */
   6906   pa_check_current_space_and_subspace ();
   6907 #endif
   6908 
   6909   if (within_procedure)
   6910     as_fatal (_("Nested procedures"));
   6911 
   6912   /* Reset global variables for new procedure.  */
   6913   callinfo_found = FALSE;
   6914   within_procedure = TRUE;
   6915 
   6916   /* Create another call_info structure.  */
   6917   call_info = XNEW (struct call_info);
   6918 
   6919   if (!call_info)
   6920     as_fatal (_("Cannot allocate unwind descriptor\n"));
   6921 
   6922   memset (call_info, 0, sizeof (struct call_info));
   6923 
   6924   call_info->ci_next = NULL;
   6925 
   6926   if (call_info_root == NULL)
   6927     {
   6928       call_info_root = call_info;
   6929       last_call_info = call_info;
   6930     }
   6931   else
   6932     {
   6933       last_call_info->ci_next = call_info;
   6934       last_call_info = call_info;
   6935     }
   6936 
   6937   /* set up defaults on call_info structure */
   6938 
   6939   call_info->ci_unwind.descriptor.cannot_unwind = 0;
   6940   call_info->ci_unwind.descriptor.region_desc = 1;
   6941   call_info->ci_unwind.descriptor.hpux_interrupt_marker = 0;
   6942 
   6943   /* If we got a .PROC pseudo-op, we know that the function is defined
   6944      locally.  Make sure it gets into the symbol table.  */
   6945   {
   6946     label_symbol_struct *label_symbol = pa_get_label ();
   6947 
   6948     if (label_symbol)
   6949       {
   6950 	if (label_symbol->lss_label)
   6951 	  {
   6952 	    last_call_info->start_symbol = label_symbol->lss_label;
   6953 	    symbol_get_bfdsym (label_symbol->lss_label)->flags |= BSF_FUNCTION;
   6954 	  }
   6955 	else
   6956 	  as_bad (_("Missing function name for .PROC (corrupted label chain)"));
   6957       }
   6958     else
   6959       last_call_info->start_symbol = NULL;
   6960   }
   6961 
   6962   demand_empty_rest_of_line ();
   6963 }
   6964 
   6965 /* Process the syntactical end of a procedure.  Make sure all the
   6966    appropriate pseudo-ops were found within the procedure.  */
   6967 
   6968 static void
   6969 pa_procend (int unused ATTRIBUTE_UNUSED)
   6970 {
   6971 #ifdef OBJ_SOM
   6972   /* We must have a valid space and subspace.  */
   6973   pa_check_current_space_and_subspace ();
   6974 #endif
   6975 
   6976   /* If we are within a procedure definition, make sure we've
   6977      defined a label for the procedure; handle case where the
   6978      label was defined after the .PROC directive.
   6979 
   6980      Note there's not need to diddle with the segment or fragment
   6981      for the label symbol in this case.  We have already switched
   6982      into the new $CODE$ subspace at this point.  */
   6983   if (within_procedure && last_call_info->start_symbol == NULL)
   6984     {
   6985       label_symbol_struct *label_symbol = pa_get_label ();
   6986 
   6987       if (label_symbol)
   6988 	{
   6989 	  if (label_symbol->lss_label)
   6990 	    {
   6991 	      last_call_info->start_symbol = label_symbol->lss_label;
   6992 	      symbol_get_bfdsym (label_symbol->lss_label)->flags
   6993 		|= BSF_FUNCTION;
   6994 #ifdef OBJ_SOM
   6995 	      /* Also handle allocation of a fixup to hold the unwind
   6996 		 information when the label appears after the proc/procend.  */
   6997 	      if (within_entry_exit)
   6998 		{
   6999 		  char *where;
   7000 		  unsigned int u;
   7001 
   7002 		  where = frag_more (0);
   7003 		  u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
   7004 		  fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   7005 				NULL, (offsetT) 0, NULL,
   7006 				0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
   7007 		}
   7008 #endif
   7009 	    }
   7010 	  else
   7011 	    as_bad (_("Missing function name for .PROC (corrupted label chain)"));
   7012 	}
   7013       else
   7014 	as_bad (_("Missing function name for .PROC"));
   7015     }
   7016 
   7017   if (!within_procedure)
   7018     as_bad (_("misplaced .procend"));
   7019 
   7020   if (!callinfo_found)
   7021     as_bad (_("Missing .callinfo for this procedure"));
   7022 
   7023   if (within_entry_exit)
   7024     as_bad (_("Missing .EXIT for a .ENTRY"));
   7025 
   7026 #ifdef OBJ_ELF
   7027   /* ELF needs to mark the end of each function so that it can compute
   7028      the size of the function (apparently its needed in the symbol table).  */
   7029   hppa_elf_mark_end_of_function ();
   7030 #endif
   7031 
   7032   within_procedure = FALSE;
   7033   demand_empty_rest_of_line ();
   7034   pa_undefine_label ();
   7035 }
   7036 
   7037 #ifdef OBJ_SOM
   7038 /* If VALUE is an exact power of two between zero and 2^31, then
   7039    return log2 (VALUE).  Else return -1.  */
   7040 
   7041 static int
   7042 exact_log2 (int value)
   7043 {
   7044   int shift = 0;
   7045 
   7046   while ((1 << shift) != value && shift < 32)
   7047     shift++;
   7048 
   7049   if (shift >= 32)
   7050     return -1;
   7051   else
   7052     return shift;
   7053 }
   7054 
   7055 /* Check to make sure we have a valid space and subspace.  */
   7056 
   7057 static void
   7058 pa_check_current_space_and_subspace (void)
   7059 {
   7060   if (current_space == NULL)
   7061     as_fatal (_("Not in a space.\n"));
   7062 
   7063   if (current_subspace == NULL)
   7064     as_fatal (_("Not in a subspace.\n"));
   7065 }
   7066 
   7067 /* Parse the parameters to a .SPACE directive; if CREATE_FLAG is nonzero,
   7068    then create a new space entry to hold the information specified
   7069    by the parameters to the .SPACE directive.  */
   7070 
   7071 static sd_chain_struct *
   7072 pa_parse_space_stmt (const char *space_name, int create_flag)
   7073 {
   7074   char *name, *ptemp, c;
   7075   char loadable, defined, private, sort;
   7076   int spnum;
   7077   asection *seg = NULL;
   7078   sd_chain_struct *space;
   7079 
   7080   /* Load default values.  */
   7081   spnum = 0;
   7082   sort = 0;
   7083   loadable = TRUE;
   7084   defined = TRUE;
   7085   private = FALSE;
   7086   if (strcmp (space_name, "$TEXT$") == 0)
   7087     {
   7088       seg = pa_def_spaces[0].segment;
   7089       defined = pa_def_spaces[0].defined;
   7090       private = pa_def_spaces[0].private;
   7091       sort = pa_def_spaces[0].sort;
   7092       spnum = pa_def_spaces[0].spnum;
   7093     }
   7094   else if (strcmp (space_name, "$PRIVATE$") == 0)
   7095     {
   7096       seg = pa_def_spaces[1].segment;
   7097       defined = pa_def_spaces[1].defined;
   7098       private = pa_def_spaces[1].private;
   7099       sort = pa_def_spaces[1].sort;
   7100       spnum = pa_def_spaces[1].spnum;
   7101     }
   7102 
   7103   if (!is_end_of_statement ())
   7104     {
   7105       print_errors = FALSE;
   7106       ptemp = input_line_pointer + 1;
   7107       /* First see if the space was specified as a number rather than
   7108 	 as a name.  According to the PA assembly manual the rest of
   7109 	 the line should be ignored.  */
   7110       strict = 0;
   7111       pa_parse_number (&ptemp, 0);
   7112       if (pa_number >= 0)
   7113 	{
   7114 	  spnum = pa_number;
   7115 	  input_line_pointer = ptemp;
   7116 	}
   7117       else
   7118 	{
   7119 	  while (!is_end_of_statement ())
   7120 	    {
   7121 	      input_line_pointer++;
   7122 	      c = get_symbol_name (&name);
   7123 	      if ((strncasecmp (name, "spnum", 5) == 0))
   7124 		{
   7125 		  (void) restore_line_pointer (c);
   7126 		  input_line_pointer++;
   7127 		  spnum = get_absolute_expression ();
   7128 		}
   7129 	      else if ((strncasecmp (name, "sort", 4) == 0))
   7130 		{
   7131 		  (void) restore_line_pointer (c);
   7132 		  input_line_pointer++;
   7133 		  sort = get_absolute_expression ();
   7134 		}
   7135 	      else if ((strncasecmp (name, "unloadable", 10) == 0))
   7136 		{
   7137 		  (void) restore_line_pointer (c);
   7138 		  loadable = FALSE;
   7139 		}
   7140 	      else if ((strncasecmp (name, "notdefined", 10) == 0))
   7141 		{
   7142 		  (void) restore_line_pointer (c);
   7143 		  defined = FALSE;
   7144 		}
   7145 	      else if ((strncasecmp (name, "private", 7) == 0))
   7146 		{
   7147 		  (void) restore_line_pointer (c);
   7148 		  private = TRUE;
   7149 		}
   7150 	      else
   7151 		{
   7152 		  as_bad (_("Invalid .SPACE argument"));
   7153 		  (void) restore_line_pointer (c);
   7154 		  if (!is_end_of_statement ())
   7155 		    input_line_pointer++;
   7156 		}
   7157 	    }
   7158 	}
   7159       print_errors = TRUE;
   7160     }
   7161 
   7162   if (create_flag && seg == NULL)
   7163     seg = subseg_new (space_name, 0);
   7164 
   7165   /* If create_flag is nonzero, then create the new space with
   7166      the attributes computed above.  Else set the values in
   7167      an already existing space -- this can only happen for
   7168      the first occurrence of a built-in space.  */
   7169   if (create_flag)
   7170     space = create_new_space (space_name, spnum, loadable, defined,
   7171 			      private, sort, seg, 1);
   7172   else
   7173     {
   7174       space = is_defined_space (space_name);
   7175       SPACE_SPNUM (space) = spnum;
   7176       SPACE_DEFINED (space) = defined & 1;
   7177       SPACE_USER_DEFINED (space) = 1;
   7178     }
   7179 
   7180 #ifdef obj_set_section_attributes
   7181   obj_set_section_attributes (seg, defined, private, sort, spnum);
   7182 #endif
   7183 
   7184   return space;
   7185 }
   7186 
   7187 /* Handle a .SPACE pseudo-op; this switches the current space to the
   7188    given space, creating the new space if necessary.  */
   7189 
   7190 static void
   7191 pa_space (int unused ATTRIBUTE_UNUSED)
   7192 {
   7193   char *name, c, *space_name, *save_s;
   7194   sd_chain_struct *sd_chain;
   7195 
   7196   if (within_procedure)
   7197     {
   7198       as_bad (_("Can\'t change spaces within a procedure definition. Ignored"));
   7199       ignore_rest_of_line ();
   7200     }
   7201   else
   7202     {
   7203       /* Check for some of the predefined spaces.   FIXME: most of the code
   7204 	 below is repeated several times, can we extract the common parts
   7205 	 and place them into a subroutine or something similar?  */
   7206       /* FIXME Is this (and the next IF stmt) really right?
   7207 	 What if INPUT_LINE_POINTER points to "$TEXT$FOO"?  */
   7208       if (strncmp (input_line_pointer, "$TEXT$", 6) == 0)
   7209 	{
   7210 	  input_line_pointer += 6;
   7211 	  sd_chain = is_defined_space ("$TEXT$");
   7212 	  if (sd_chain == NULL)
   7213 	    sd_chain = pa_parse_space_stmt ("$TEXT$", 1);
   7214 	  else if (SPACE_USER_DEFINED (sd_chain) == 0)
   7215 	    sd_chain = pa_parse_space_stmt ("$TEXT$", 0);
   7216 
   7217 	  current_space = sd_chain;
   7218 	  subseg_set (text_section, sd_chain->sd_last_subseg);
   7219 	  current_subspace
   7220 	    = pa_subsegment_to_subspace (text_section,
   7221 					 sd_chain->sd_last_subseg);
   7222 	  demand_empty_rest_of_line ();
   7223 	  return;
   7224 	}
   7225       if (strncmp (input_line_pointer, "$PRIVATE$", 9) == 0)
   7226 	{
   7227 	  input_line_pointer += 9;
   7228 	  sd_chain = is_defined_space ("$PRIVATE$");
   7229 	  if (sd_chain == NULL)
   7230 	    sd_chain = pa_parse_space_stmt ("$PRIVATE$", 1);
   7231 	  else if (SPACE_USER_DEFINED (sd_chain) == 0)
   7232 	    sd_chain = pa_parse_space_stmt ("$PRIVATE$", 0);
   7233 
   7234 	  current_space = sd_chain;
   7235 	  subseg_set (data_section, sd_chain->sd_last_subseg);
   7236 	  current_subspace
   7237 	    = pa_subsegment_to_subspace (data_section,
   7238 					 sd_chain->sd_last_subseg);
   7239 	  demand_empty_rest_of_line ();
   7240 	  return;
   7241 	}
   7242       if (!strncasecmp (input_line_pointer,
   7243 			GDB_DEBUG_SPACE_NAME,
   7244 			strlen (GDB_DEBUG_SPACE_NAME)))
   7245 	{
   7246 	  input_line_pointer += strlen (GDB_DEBUG_SPACE_NAME);
   7247 	  sd_chain = is_defined_space (GDB_DEBUG_SPACE_NAME);
   7248 	  if (sd_chain == NULL)
   7249 	    sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 1);
   7250 	  else if (SPACE_USER_DEFINED (sd_chain) == 0)
   7251 	    sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 0);
   7252 
   7253 	  current_space = sd_chain;
   7254 
   7255 	  {
   7256 	    asection *gdb_section
   7257 	    = bfd_make_section_old_way (stdoutput, GDB_DEBUG_SPACE_NAME);
   7258 
   7259 	    subseg_set (gdb_section, sd_chain->sd_last_subseg);
   7260 	    current_subspace
   7261 	      = pa_subsegment_to_subspace (gdb_section,
   7262 					   sd_chain->sd_last_subseg);
   7263 	  }
   7264 	  demand_empty_rest_of_line ();
   7265 	  return;
   7266 	}
   7267 
   7268       /* It could be a space specified by number.  */
   7269       print_errors = 0;
   7270       save_s = input_line_pointer;
   7271       strict = 0;
   7272       pa_parse_number (&input_line_pointer, 0);
   7273       if (pa_number >= 0)
   7274 	{
   7275 	  if ((sd_chain = pa_find_space_by_number (pa_number)))
   7276 	    {
   7277 	      current_space = sd_chain;
   7278 
   7279 	      subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg);
   7280 	      current_subspace
   7281 		= pa_subsegment_to_subspace (sd_chain->sd_seg,
   7282 					     sd_chain->sd_last_subseg);
   7283 	      demand_empty_rest_of_line ();
   7284 	      return;
   7285 	    }
   7286 	}
   7287 
   7288       /* Not a number, attempt to create a new space.  */
   7289       print_errors = 1;
   7290       input_line_pointer = save_s;
   7291       c = get_symbol_name (&name);
   7292       space_name = xstrdup (name);
   7293       (void) restore_line_pointer (c);
   7294 
   7295       sd_chain = pa_parse_space_stmt (space_name, 1);
   7296       current_space = sd_chain;
   7297 
   7298       subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg);
   7299       current_subspace = pa_subsegment_to_subspace (sd_chain->sd_seg,
   7300 						  sd_chain->sd_last_subseg);
   7301       demand_empty_rest_of_line ();
   7302     }
   7303 }
   7304 
   7305 /* Switch to a new space.  (I think).  FIXME.  */
   7306 
   7307 static void
   7308 pa_spnum (int unused ATTRIBUTE_UNUSED)
   7309 {
   7310   char *name;
   7311   char c;
   7312   char *p;
   7313   sd_chain_struct *space;
   7314 
   7315   c = get_symbol_name (&name);
   7316   space = is_defined_space (name);
   7317   if (space)
   7318     {
   7319       p = frag_more (4);
   7320       md_number_to_chars (p, SPACE_SPNUM (space), 4);
   7321     }
   7322   else
   7323     as_warn (_("Undefined space: '%s' Assuming space number = 0."), name);
   7324 
   7325   (void) restore_line_pointer (c);
   7326   demand_empty_rest_of_line ();
   7327 }
   7328 
   7329 /* Handle a .SUBSPACE pseudo-op; this switches the current subspace to the
   7330    given subspace, creating the new subspace if necessary.
   7331 
   7332    FIXME.  Should mirror pa_space more closely, in particular how
   7333    they're broken up into subroutines.  */
   7334 
   7335 static void
   7336 pa_subspace (int create_new)
   7337 {
   7338   char *name, *ss_name, c;
   7339   char loadable, code_only, comdat, common, dup_common, zero, sort;
   7340   int i, access_ctr, space_index, alignment, quadrant, applicable, flags;
   7341   sd_chain_struct *space;
   7342   ssd_chain_struct *ssd;
   7343   asection *section;
   7344 
   7345   if (current_space == NULL)
   7346     as_fatal (_("Must be in a space before changing or declaring subspaces.\n"));
   7347 
   7348   if (within_procedure)
   7349     {
   7350       as_bad (_("Can\'t change subspaces within a procedure definition. Ignored"));
   7351       ignore_rest_of_line ();
   7352     }
   7353   else
   7354     {
   7355       c = get_symbol_name (&name);
   7356       ss_name = xstrdup (name);
   7357       (void) restore_line_pointer (c);
   7358 
   7359       /* Load default values.  */
   7360       sort = 0;
   7361       access_ctr = 0x7f;
   7362       loadable = 1;
   7363       comdat = 0;
   7364       common = 0;
   7365       dup_common = 0;
   7366       code_only = 0;
   7367       zero = 0;
   7368       space_index = ~0;
   7369       alignment = 1;
   7370       quadrant = 0;
   7371 
   7372       space = current_space;
   7373       if (create_new)
   7374 	ssd = NULL;
   7375       else
   7376 	ssd = is_defined_subspace (ss_name);
   7377       /* Allow user to override the builtin attributes of subspaces.  But
   7378 	 only allow the attributes to be changed once!  */
   7379       if (ssd && SUBSPACE_DEFINED (ssd))
   7380 	{
   7381 	  subseg_set (ssd->ssd_seg, ssd->ssd_subseg);
   7382 	  current_subspace = ssd;
   7383 	  if (!is_end_of_statement ())
   7384 	    as_warn (_("Parameters of an existing subspace can\'t be modified"));
   7385 	  demand_empty_rest_of_line ();
   7386 	  return;
   7387 	}
   7388       else
   7389 	{
   7390 	  /* A new subspace.  Load default values if it matches one of
   7391 	     the builtin subspaces.  */
   7392 	  i = 0;
   7393 	  while (pa_def_subspaces[i].name)
   7394 	    {
   7395 	      if (strcasecmp (pa_def_subspaces[i].name, ss_name) == 0)
   7396 		{
   7397 		  loadable = pa_def_subspaces[i].loadable;
   7398 		  comdat = pa_def_subspaces[i].comdat;
   7399 		  common = pa_def_subspaces[i].common;
   7400 		  dup_common = pa_def_subspaces[i].dup_common;
   7401 		  code_only = pa_def_subspaces[i].code_only;
   7402 		  zero = pa_def_subspaces[i].zero;
   7403 		  space_index = pa_def_subspaces[i].space_index;
   7404 		  alignment = pa_def_subspaces[i].alignment;
   7405 		  quadrant = pa_def_subspaces[i].quadrant;
   7406 		  access_ctr = pa_def_subspaces[i].access;
   7407 		  sort = pa_def_subspaces[i].sort;
   7408 		  break;
   7409 		}
   7410 	      i++;
   7411 	    }
   7412 	}
   7413 
   7414       /* We should be working with a new subspace now.  Fill in
   7415 	 any information as specified by the user.  */
   7416       if (!is_end_of_statement ())
   7417 	{
   7418 	  input_line_pointer++;
   7419 	  while (!is_end_of_statement ())
   7420 	    {
   7421 	      c = get_symbol_name (&name);
   7422 	      if ((strncasecmp (name, "quad", 4) == 0))
   7423 		{
   7424 		  (void) restore_line_pointer (c);
   7425 		  input_line_pointer++;
   7426 		  quadrant = get_absolute_expression ();
   7427 		}
   7428 	      else if ((strncasecmp (name, "align", 5) == 0))
   7429 		{
   7430 		  (void) restore_line_pointer (c);
   7431 		  input_line_pointer++;
   7432 		  alignment = get_absolute_expression ();
   7433 		  if (exact_log2 (alignment) == -1)
   7434 		    {
   7435 		      as_bad (_("Alignment must be a power of 2"));
   7436 		      alignment = 1;
   7437 		    }
   7438 		}
   7439 	      else if ((strncasecmp (name, "access", 6) == 0))
   7440 		{
   7441 		  (void) restore_line_pointer (c);
   7442 		  input_line_pointer++;
   7443 		  access_ctr = get_absolute_expression ();
   7444 		}
   7445 	      else if ((strncasecmp (name, "sort", 4) == 0))
   7446 		{
   7447 		  (void) restore_line_pointer (c);
   7448 		  input_line_pointer++;
   7449 		  sort = get_absolute_expression ();
   7450 		}
   7451 	      else if ((strncasecmp (name, "code_only", 9) == 0))
   7452 		{
   7453 		  (void) restore_line_pointer (c);
   7454 		  code_only = 1;
   7455 		}
   7456 	      else if ((strncasecmp (name, "unloadable", 10) == 0))
   7457 		{
   7458 		  (void) restore_line_pointer (c);
   7459 		  loadable = 0;
   7460 		}
   7461 	      else if ((strncasecmp (name, "comdat", 6) == 0))
   7462 		{
   7463 		  (void) restore_line_pointer (c);
   7464 		  comdat = 1;
   7465 		}
   7466 	      else if ((strncasecmp (name, "common", 6) == 0))
   7467 		{
   7468 		  (void) restore_line_pointer (c);
   7469 		  common = 1;
   7470 		}
   7471 	      else if ((strncasecmp (name, "dup_comm", 8) == 0))
   7472 		{
   7473 		  (void) restore_line_pointer (c);
   7474 		  dup_common = 1;
   7475 		}
   7476 	      else if ((strncasecmp (name, "zero", 4) == 0))
   7477 		{
   7478 		  (void) restore_line_pointer (c);
   7479 		  zero = 1;
   7480 		}
   7481 	      else if ((strncasecmp (name, "first", 5) == 0))
   7482 		as_bad (_("FIRST not supported as a .SUBSPACE argument"));
   7483 	      else
   7484 		as_bad (_("Invalid .SUBSPACE argument"));
   7485 
   7486 	      if (!is_end_of_statement ())
   7487 		input_line_pointer++;
   7488 	    }
   7489 	}
   7490 
   7491       /* Compute a reasonable set of BFD flags based on the information
   7492 	 in the .subspace directive.  */
   7493       applicable = bfd_applicable_section_flags (stdoutput);
   7494       flags = 0;
   7495       if (loadable)
   7496 	flags |= (SEC_ALLOC | SEC_LOAD);
   7497       if (code_only)
   7498 	flags |= SEC_CODE;
   7499 
   7500       /* These flags are used to implement various flavors of initialized
   7501 	 common.  The SOM linker discards duplicate subspaces when they
   7502 	 have the same "key" symbol name.  This support is more like
   7503 	 GNU linkonce than BFD common.  Further, pc-relative relocations
   7504 	 are converted to section relative relocations in BFD common
   7505 	 sections.  This complicates the handling of relocations in
   7506 	 common sections containing text and isn't currently supported
   7507 	 correctly in the SOM BFD backend.  */
   7508       if (comdat || common || dup_common)
   7509 	flags |= SEC_LINK_ONCE;
   7510 
   7511       flags |= SEC_RELOC | SEC_HAS_CONTENTS;
   7512 
   7513       /* This is a zero-filled subspace (eg BSS).  */
   7514       if (zero)
   7515 	flags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
   7516 
   7517       applicable &= flags;
   7518 
   7519       /* If this is an existing subspace, then we want to use the
   7520 	 segment already associated with the subspace.
   7521 
   7522 	 FIXME NOW!  ELF BFD doesn't appear to be ready to deal with
   7523 	 lots of sections.  It might be a problem in the PA ELF
   7524 	 code, I do not know yet.  For now avoid creating anything
   7525 	 but the "standard" sections for ELF.  */
   7526       if (create_new)
   7527 	section = subseg_force_new (ss_name, 0);
   7528       else if (ssd)
   7529 	section = ssd->ssd_seg;
   7530       else
   7531 	section = subseg_new (ss_name, 0);
   7532 
   7533       if (zero)
   7534 	seg_info (section)->bss = 1;
   7535 
   7536       /* Now set the flags.  */
   7537       bfd_set_section_flags (stdoutput, section, applicable);
   7538 
   7539       /* Record any alignment request for this section.  */
   7540       record_alignment (section, exact_log2 (alignment));
   7541 
   7542       /* Set the starting offset for this section.  */
   7543       bfd_set_section_vma (stdoutput, section,
   7544 			   pa_subspace_start (space, quadrant));
   7545 
   7546       /* Now that all the flags are set, update an existing subspace,
   7547 	 or create a new one.  */
   7548       if (ssd)
   7549 
   7550 	current_subspace = update_subspace (space, ss_name, loadable,
   7551 					    code_only, comdat, common,
   7552 					    dup_common, sort, zero, access_ctr,
   7553 					    space_index, alignment, quadrant,
   7554 					    section);
   7555       else
   7556 	current_subspace = create_new_subspace (space, ss_name, loadable,
   7557 						code_only, comdat, common,
   7558 						dup_common, zero, sort,
   7559 						access_ctr, space_index,
   7560 						alignment, quadrant, section);
   7561 
   7562       demand_empty_rest_of_line ();
   7563       current_subspace->ssd_seg = section;
   7564       subseg_set (current_subspace->ssd_seg, current_subspace->ssd_subseg);
   7565     }
   7566   SUBSPACE_DEFINED (current_subspace) = 1;
   7567 }
   7568 
   7569 /* Create default space and subspace dictionaries.  */
   7570 
   7571 static void
   7572 pa_spaces_begin (void)
   7573 {
   7574   int i;
   7575 
   7576   space_dict_root = NULL;
   7577   space_dict_last = NULL;
   7578 
   7579   i = 0;
   7580   while (pa_def_spaces[i].name)
   7581     {
   7582       const char *name;
   7583 
   7584       /* Pick the right name to use for the new section.  */
   7585       name = pa_def_spaces[i].name;
   7586 
   7587       pa_def_spaces[i].segment = subseg_new (name, 0);
   7588       create_new_space (pa_def_spaces[i].name, pa_def_spaces[i].spnum,
   7589 			pa_def_spaces[i].loadable, pa_def_spaces[i].defined,
   7590 			pa_def_spaces[i].private, pa_def_spaces[i].sort,
   7591 			pa_def_spaces[i].segment, 0);
   7592       i++;
   7593     }
   7594 
   7595   i = 0;
   7596   while (pa_def_subspaces[i].name)
   7597     {
   7598       const char *name;
   7599       int applicable, subsegment;
   7600       asection *segment = NULL;
   7601       sd_chain_struct *space;
   7602 
   7603       /* Pick the right name for the new section and pick the right
   7604 	 subsegment number.  */
   7605       name = pa_def_subspaces[i].name;
   7606       subsegment = 0;
   7607 
   7608       /* Create the new section.  */
   7609       segment = subseg_new (name, subsegment);
   7610 
   7611       /* For SOM we want to replace the standard .text, .data, and .bss
   7612 	 sections with our own.   We also want to set BFD flags for
   7613 	 all the built-in subspaces.  */
   7614       if (!strcmp (pa_def_subspaces[i].name, "$CODE$"))
   7615 	{
   7616 	  text_section = segment;
   7617 	  applicable = bfd_applicable_section_flags (stdoutput);
   7618 	  bfd_set_section_flags (stdoutput, segment,
   7619 				 applicable & (SEC_ALLOC | SEC_LOAD
   7620 					       | SEC_RELOC | SEC_CODE
   7621 					       | SEC_READONLY
   7622 					       | SEC_HAS_CONTENTS));
   7623 	}
   7624       else if (!strcmp (pa_def_subspaces[i].name, "$DATA$"))
   7625 	{
   7626 	  data_section = segment;
   7627 	  applicable = bfd_applicable_section_flags (stdoutput);
   7628 	  bfd_set_section_flags (stdoutput, segment,
   7629 				 applicable & (SEC_ALLOC | SEC_LOAD
   7630 					       | SEC_RELOC
   7631 					       | SEC_HAS_CONTENTS));
   7632 
   7633 	}
   7634       else if (!strcmp (pa_def_subspaces[i].name, "$BSS$"))
   7635 	{
   7636 	  bss_section = segment;
   7637 	  applicable = bfd_applicable_section_flags (stdoutput);
   7638 	  bfd_set_section_flags (stdoutput, segment,
   7639 				 applicable & SEC_ALLOC);
   7640 	}
   7641       else if (!strcmp (pa_def_subspaces[i].name, "$LIT$"))
   7642 	{
   7643 	  applicable = bfd_applicable_section_flags (stdoutput);
   7644 	  bfd_set_section_flags (stdoutput, segment,
   7645 				 applicable & (SEC_ALLOC | SEC_LOAD
   7646 					       | SEC_RELOC
   7647 					       | SEC_READONLY
   7648 					       | SEC_HAS_CONTENTS));
   7649 	}
   7650       else if (!strcmp (pa_def_subspaces[i].name, "$MILLICODE$"))
   7651 	{
   7652 	  applicable = bfd_applicable_section_flags (stdoutput);
   7653 	  bfd_set_section_flags (stdoutput, segment,
   7654 				 applicable & (SEC_ALLOC | SEC_LOAD
   7655 					       | SEC_RELOC
   7656 					       | SEC_READONLY
   7657 					       | SEC_HAS_CONTENTS));
   7658 	}
   7659       else if (!strcmp (pa_def_subspaces[i].name, "$UNWIND$"))
   7660 	{
   7661 	  applicable = bfd_applicable_section_flags (stdoutput);
   7662 	  bfd_set_section_flags (stdoutput, segment,
   7663 				 applicable & (SEC_ALLOC | SEC_LOAD
   7664 					       | SEC_RELOC
   7665 					       | SEC_READONLY
   7666 					       | SEC_HAS_CONTENTS));
   7667 	}
   7668 
   7669       /* Find the space associated with this subspace.  */
   7670       space = pa_segment_to_space (pa_def_spaces[pa_def_subspaces[i].
   7671 						 def_space_index].segment);
   7672       if (space == NULL)
   7673 	{
   7674 	  as_fatal (_("Internal error: Unable to find containing space for %s."),
   7675 		    pa_def_subspaces[i].name);
   7676 	}
   7677 
   7678       create_new_subspace (space, name,
   7679 			   pa_def_subspaces[i].loadable,
   7680 			   pa_def_subspaces[i].code_only,
   7681 			   pa_def_subspaces[i].comdat,
   7682 			   pa_def_subspaces[i].common,
   7683 			   pa_def_subspaces[i].dup_common,
   7684 			   pa_def_subspaces[i].zero,
   7685 			   pa_def_subspaces[i].sort,
   7686 			   pa_def_subspaces[i].access,
   7687 			   pa_def_subspaces[i].space_index,
   7688 			   pa_def_subspaces[i].alignment,
   7689 			   pa_def_subspaces[i].quadrant,
   7690 			   segment);
   7691       i++;
   7692     }
   7693 }
   7694 
   7695 /* Create a new space NAME, with the appropriate flags as defined
   7696    by the given parameters.  */
   7697 
   7698 static sd_chain_struct *
   7699 create_new_space (const char *name,
   7700 		  int spnum,
   7701 		  int loadable ATTRIBUTE_UNUSED,
   7702 		  int defined,
   7703 		  int private,
   7704 		  int sort,
   7705 		  asection *seg,
   7706 		  int user_defined)
   7707 {
   7708   sd_chain_struct *chain_entry;
   7709 
   7710   chain_entry = XNEW (sd_chain_struct);
   7711   SPACE_NAME (chain_entry) = xstrdup (name);
   7712   SPACE_DEFINED (chain_entry) = defined;
   7713   SPACE_USER_DEFINED (chain_entry) = user_defined;
   7714   SPACE_SPNUM (chain_entry) = spnum;
   7715 
   7716   chain_entry->sd_seg = seg;
   7717   chain_entry->sd_last_subseg = -1;
   7718   chain_entry->sd_subspaces = NULL;
   7719   chain_entry->sd_next = NULL;
   7720 
   7721   /* Find spot for the new space based on its sort key.  */
   7722   if (!space_dict_last)
   7723     space_dict_last = chain_entry;
   7724 
   7725   if (space_dict_root == NULL)
   7726     space_dict_root = chain_entry;
   7727   else
   7728     {
   7729       sd_chain_struct *chain_pointer;
   7730       sd_chain_struct *prev_chain_pointer;
   7731 
   7732       chain_pointer = space_dict_root;
   7733       prev_chain_pointer = NULL;
   7734 
   7735       while (chain_pointer)
   7736 	{
   7737 	  prev_chain_pointer = chain_pointer;
   7738 	  chain_pointer = chain_pointer->sd_next;
   7739 	}
   7740 
   7741       /* At this point we've found the correct place to add the new
   7742 	 entry.  So add it and update the linked lists as appropriate.  */
   7743       if (prev_chain_pointer)
   7744 	{
   7745 	  chain_entry->sd_next = chain_pointer;
   7746 	  prev_chain_pointer->sd_next = chain_entry;
   7747 	}
   7748       else
   7749 	{
   7750 	  space_dict_root = chain_entry;
   7751 	  chain_entry->sd_next = chain_pointer;
   7752 	}
   7753 
   7754       if (chain_entry->sd_next == NULL)
   7755 	space_dict_last = chain_entry;
   7756     }
   7757 
   7758   /* This is here to catch predefined spaces which do not get
   7759      modified by the user's input.  Another call is found at
   7760      the bottom of pa_parse_space_stmt to handle cases where
   7761      the user modifies a predefined space.  */
   7762 #ifdef obj_set_section_attributes
   7763   obj_set_section_attributes (seg, defined, private, sort, spnum);
   7764 #endif
   7765 
   7766   return chain_entry;
   7767 }
   7768 
   7769 /* Create a new subspace NAME, with the appropriate flags as defined
   7770    by the given parameters.
   7771 
   7772    Add the new subspace to the subspace dictionary chain in numerical
   7773    order as defined by the SORT entries.  */
   7774 
   7775 static ssd_chain_struct *
   7776 create_new_subspace (sd_chain_struct *space,
   7777 		     const char *name,
   7778 		     int loadable ATTRIBUTE_UNUSED,
   7779 		     int code_only ATTRIBUTE_UNUSED,
   7780 		     int comdat,
   7781 		     int common,
   7782 		     int dup_common,
   7783 		     int is_zero ATTRIBUTE_UNUSED,
   7784 		     int sort,
   7785 		     int access_ctr,
   7786 		     int space_index ATTRIBUTE_UNUSED,
   7787 		     int alignment ATTRIBUTE_UNUSED,
   7788 		     int quadrant,
   7789 		     asection *seg)
   7790 {
   7791   ssd_chain_struct *chain_entry;
   7792 
   7793   chain_entry = XNEW (ssd_chain_struct);
   7794   SUBSPACE_NAME (chain_entry) = xstrdup (name);
   7795 
   7796   /* Initialize subspace_defined.  When we hit a .subspace directive
   7797      we'll set it to 1 which "locks-in" the subspace attributes.  */
   7798   SUBSPACE_DEFINED (chain_entry) = 0;
   7799 
   7800   chain_entry->ssd_subseg = 0;
   7801   chain_entry->ssd_seg = seg;
   7802   chain_entry->ssd_next = NULL;
   7803 
   7804   /* Find spot for the new subspace based on its sort key.  */
   7805   if (space->sd_subspaces == NULL)
   7806     space->sd_subspaces = chain_entry;
   7807   else
   7808     {
   7809       ssd_chain_struct *chain_pointer;
   7810       ssd_chain_struct *prev_chain_pointer;
   7811 
   7812       chain_pointer = space->sd_subspaces;
   7813       prev_chain_pointer = NULL;
   7814 
   7815       while (chain_pointer)
   7816 	{
   7817 	  prev_chain_pointer = chain_pointer;
   7818 	  chain_pointer = chain_pointer->ssd_next;
   7819 	}
   7820 
   7821       /* Now we have somewhere to put the new entry.  Insert it and update
   7822 	 the links.  */
   7823       if (prev_chain_pointer)
   7824 	{
   7825 	  chain_entry->ssd_next = chain_pointer;
   7826 	  prev_chain_pointer->ssd_next = chain_entry;
   7827 	}
   7828       else
   7829 	{
   7830 	  space->sd_subspaces = chain_entry;
   7831 	  chain_entry->ssd_next = chain_pointer;
   7832 	}
   7833     }
   7834 
   7835 #ifdef obj_set_subsection_attributes
   7836   obj_set_subsection_attributes (seg, space->sd_seg, access_ctr, sort,
   7837 				 quadrant, comdat, common, dup_common);
   7838 #endif
   7839 
   7840   return chain_entry;
   7841 }
   7842 
   7843 /* Update the information for the given subspace based upon the
   7844    various arguments.   Return the modified subspace chain entry.  */
   7845 
   7846 static ssd_chain_struct *
   7847 update_subspace (sd_chain_struct *space,
   7848 		 char *name,
   7849 		 int loadable ATTRIBUTE_UNUSED,
   7850 		 int code_only ATTRIBUTE_UNUSED,
   7851 		 int comdat,
   7852 		 int common,
   7853 		 int dup_common,
   7854 		 int sort,
   7855 		 int zero ATTRIBUTE_UNUSED,
   7856 		 int access_ctr,
   7857 		 int space_index ATTRIBUTE_UNUSED,
   7858 		 int alignment ATTRIBUTE_UNUSED,
   7859 		 int quadrant,
   7860 		 asection *section)
   7861 {
   7862   ssd_chain_struct *chain_entry;
   7863 
   7864   chain_entry = is_defined_subspace (name);
   7865 
   7866 #ifdef obj_set_subsection_attributes
   7867   obj_set_subsection_attributes (section, space->sd_seg, access_ctr, sort,
   7868 				 quadrant, comdat, common, dup_common);
   7869 #endif
   7870 
   7871   return chain_entry;
   7872 }
   7873 
   7874 /* Return the space chain entry for the space with the name NAME or
   7875    NULL if no such space exists.  */
   7876 
   7877 static sd_chain_struct *
   7878 is_defined_space (const char *name)
   7879 {
   7880   sd_chain_struct *chain_pointer;
   7881 
   7882   for (chain_pointer = space_dict_root;
   7883        chain_pointer;
   7884        chain_pointer = chain_pointer->sd_next)
   7885     if (strcmp (SPACE_NAME (chain_pointer), name) == 0)
   7886       return chain_pointer;
   7887 
   7888   /* No mapping from segment to space was found.  Return NULL.  */
   7889   return NULL;
   7890 }
   7891 
   7892 /* Find and return the space associated with the given seg.  If no mapping
   7893    from the given seg to a space is found, then return NULL.
   7894 
   7895    Unlike subspaces, the number of spaces is not expected to grow much,
   7896    so a linear exhaustive search is OK here.  */
   7897 
   7898 static sd_chain_struct *
   7899 pa_segment_to_space (asection *seg)
   7900 {
   7901   sd_chain_struct *space_chain;
   7902 
   7903   /* Walk through each space looking for the correct mapping.  */
   7904   for (space_chain = space_dict_root;
   7905        space_chain;
   7906        space_chain = space_chain->sd_next)
   7907     if (space_chain->sd_seg == seg)
   7908       return space_chain;
   7909 
   7910   /* Mapping was not found.  Return NULL.  */
   7911   return NULL;
   7912 }
   7913 
   7914 /* Return the first space chain entry for the subspace with the name
   7915    NAME or NULL if no such subspace exists.
   7916 
   7917    When there are multiple subspaces with the same name, switching to
   7918    the first (i.e., default) subspace is preferable in most situations.
   7919    For example, it wouldn't be desirable to merge COMDAT data with non
   7920    COMDAT data.
   7921 
   7922    Uses a linear search through all the spaces and subspaces, this may
   7923    not be appropriate if we ever being placing each function in its
   7924    own subspace.  */
   7925 
   7926 static ssd_chain_struct *
   7927 is_defined_subspace (const char *name)
   7928 {
   7929   sd_chain_struct *space_chain;
   7930   ssd_chain_struct *subspace_chain;
   7931 
   7932   /* Walk through each space.  */
   7933   for (space_chain = space_dict_root;
   7934        space_chain;
   7935        space_chain = space_chain->sd_next)
   7936     {
   7937       /* Walk through each subspace looking for a name which matches.  */
   7938       for (subspace_chain = space_chain->sd_subspaces;
   7939 	   subspace_chain;
   7940 	   subspace_chain = subspace_chain->ssd_next)
   7941 	if (strcmp (SUBSPACE_NAME (subspace_chain), name) == 0)
   7942 	  return subspace_chain;
   7943     }
   7944 
   7945   /* Subspace wasn't found.  Return NULL.  */
   7946   return NULL;
   7947 }
   7948 
   7949 /* Find and return the subspace associated with the given seg.  If no
   7950    mapping from the given seg to a subspace is found, then return NULL.
   7951 
   7952    If we ever put each procedure/function within its own subspace
   7953    (to make life easier on the compiler and linker), then this will have
   7954    to become more efficient.  */
   7955 
   7956 static ssd_chain_struct *
   7957 pa_subsegment_to_subspace (asection *seg, subsegT subseg)
   7958 {
   7959   sd_chain_struct *space_chain;
   7960   ssd_chain_struct *subspace_chain;
   7961 
   7962   /* Walk through each space.  */
   7963   for (space_chain = space_dict_root;
   7964        space_chain;
   7965        space_chain = space_chain->sd_next)
   7966     {
   7967       if (space_chain->sd_seg == seg)
   7968 	{
   7969 	  /* Walk through each subspace within each space looking for
   7970 	     the correct mapping.  */
   7971 	  for (subspace_chain = space_chain->sd_subspaces;
   7972 	       subspace_chain;
   7973 	       subspace_chain = subspace_chain->ssd_next)
   7974 	    if (subspace_chain->ssd_subseg == (int) subseg)
   7975 	      return subspace_chain;
   7976 	}
   7977     }
   7978 
   7979   /* No mapping from subsegment to subspace found.  Return NULL.  */
   7980   return NULL;
   7981 }
   7982 
   7983 /* Given a number, try and find a space with the name number.
   7984 
   7985    Return a pointer to a space dictionary chain entry for the space
   7986    that was found or NULL on failure.  */
   7987 
   7988 static sd_chain_struct *
   7989 pa_find_space_by_number (int number)
   7990 {
   7991   sd_chain_struct *space_chain;
   7992 
   7993   for (space_chain = space_dict_root;
   7994        space_chain;
   7995        space_chain = space_chain->sd_next)
   7996     {
   7997       if (SPACE_SPNUM (space_chain) == (unsigned int) number)
   7998 	return space_chain;
   7999     }
   8000 
   8001   /* No appropriate space found.  Return NULL.  */
   8002   return NULL;
   8003 }
   8004 
   8005 /* Return the starting address for the given subspace.  If the starting
   8006    address is unknown then return zero.  */
   8007 
   8008 static unsigned int
   8009 pa_subspace_start (sd_chain_struct *space, int quadrant)
   8010 {
   8011   /* FIXME.  Assumes everyone puts read/write data at 0x4000000, this
   8012      is not correct for the PA OSF1 port.  */
   8013   if ((strcmp (SPACE_NAME (space), "$PRIVATE$") == 0) && quadrant == 1)
   8014     return 0x40000000;
   8015   else if (space->sd_seg == data_section && quadrant == 1)
   8016     return 0x40000000;
   8017   else
   8018     return 0;
   8019   return 0;
   8020 }
   8021 #endif
   8022 
   8023 /* Helper function for pa_stringer.  Used to find the end of
   8024    a string.  */
   8025 
   8026 static unsigned int
   8027 pa_stringer_aux (char *s)
   8028 {
   8029   unsigned int c = *s & CHAR_MASK;
   8030 
   8031   switch (c)
   8032     {
   8033     case '\"':
   8034       c = NOT_A_CHAR;
   8035       break;
   8036     default:
   8037       break;
   8038     }
   8039   return c;
   8040 }
   8041 
   8042 /* Handle a .STRING type pseudo-op.  */
   8043 
   8044 static void
   8045 pa_stringer (int append_zero)
   8046 {
   8047   char *s, num_buf[4];
   8048   unsigned int c;
   8049   int i;
   8050 
   8051   /* Preprocess the string to handle PA-specific escape sequences.
   8052      For example, \xDD where DD is a hexadecimal number should be
   8053      changed to \OOO where OOO is an octal number.  */
   8054 
   8055 #ifdef OBJ_SOM
   8056   /* We must have a valid space and subspace.  */
   8057   pa_check_current_space_and_subspace ();
   8058 #endif
   8059 
   8060   /* Skip the opening quote.  */
   8061   s = input_line_pointer + 1;
   8062 
   8063   while (is_a_char (c = pa_stringer_aux (s++)))
   8064     {
   8065       if (c == '\\')
   8066 	{
   8067 	  c = *s;
   8068 	  switch (c)
   8069 	    {
   8070 	      /* Handle \x<num>.  */
   8071 	    case 'x':
   8072 	      {
   8073 		unsigned int number;
   8074 		int num_digit;
   8075 		char dg;
   8076 		char *s_start = s;
   8077 
   8078 		/* Get past the 'x'.  */
   8079 		s++;
   8080 		for (num_digit = 0, number = 0, dg = *s;
   8081 		     num_digit < 2
   8082 		     && (ISDIGIT (dg) || (dg >= 'a' && dg <= 'f')
   8083 			 || (dg >= 'A' && dg <= 'F'));
   8084 		     num_digit++)
   8085 		  {
   8086 		    if (ISDIGIT (dg))
   8087 		      number = number * 16 + dg - '0';
   8088 		    else if (dg >= 'a' && dg <= 'f')
   8089 		      number = number * 16 + dg - 'a' + 10;
   8090 		    else
   8091 		      number = number * 16 + dg - 'A' + 10;
   8092 
   8093 		    s++;
   8094 		    dg = *s;
   8095 		  }
   8096 		if (num_digit > 0)
   8097 		  {
   8098 		    switch (num_digit)
   8099 		      {
   8100 		      case 1:
   8101 			sprintf (num_buf, "%02o", number);
   8102 			break;
   8103 		      case 2:
   8104 			sprintf (num_buf, "%03o", number);
   8105 			break;
   8106 		      }
   8107 		    for (i = 0; i <= num_digit; i++)
   8108 		      s_start[i] = num_buf[i];
   8109 		  }
   8110 		break;
   8111 	      }
   8112 	    /* This might be a "\"", skip over the escaped char.  */
   8113 	    default:
   8114 	      s++;
   8115 	      break;
   8116 	    }
   8117 	}
   8118     }
   8119   stringer (8 + append_zero);
   8120   pa_undefine_label ();
   8121 }
   8122 
   8123 /* Handle a .VERSION pseudo-op.  */
   8124 
   8125 static void
   8126 pa_version (int unused ATTRIBUTE_UNUSED)
   8127 {
   8128   obj_version (0);
   8129   pa_undefine_label ();
   8130 }
   8131 
   8132 #ifdef OBJ_SOM
   8133 
   8134 /* Handle a .COMPILER pseudo-op.  */
   8135 
   8136 static void
   8137 pa_compiler (int unused ATTRIBUTE_UNUSED)
   8138 {
   8139   obj_som_compiler (0);
   8140   pa_undefine_label ();
   8141 }
   8142 
   8143 #endif
   8144 
   8145 /* Handle a .COPYRIGHT pseudo-op.  */
   8146 
   8147 static void
   8148 pa_copyright (int unused ATTRIBUTE_UNUSED)
   8149 {
   8150   obj_copyright (0);
   8151   pa_undefine_label ();
   8152 }
   8153 
   8154 /* Just like a normal cons, but when finished we have to undefine
   8155    the latest space label.  */
   8156 
   8157 static void
   8158 pa_cons (int nbytes)
   8159 {
   8160   cons (nbytes);
   8161   pa_undefine_label ();
   8162 }
   8163 
   8164 /* Like float_cons, but we need to undefine our label.  */
   8165 
   8166 static void
   8167 pa_float_cons (int float_type)
   8168 {
   8169   float_cons (float_type);
   8170   pa_undefine_label ();
   8171 }
   8172 
   8173 /* Like s_fill, but delete our label when finished.  */
   8174 
   8175 static void
   8176 pa_fill (int unused ATTRIBUTE_UNUSED)
   8177 {
   8178 #ifdef OBJ_SOM
   8179   /* We must have a valid space and subspace.  */
   8180   pa_check_current_space_and_subspace ();
   8181 #endif
   8182 
   8183   s_fill (0);
   8184   pa_undefine_label ();
   8185 }
   8186 
   8187 /* Like lcomm, but delete our label when finished.  */
   8188 
   8189 static void
   8190 pa_lcomm (int needs_align)
   8191 {
   8192 #ifdef OBJ_SOM
   8193   /* We must have a valid space and subspace.  */
   8194   pa_check_current_space_and_subspace ();
   8195 #endif
   8196 
   8197   s_lcomm (needs_align);
   8198   pa_undefine_label ();
   8199 }
   8200 
   8201 /* Like lsym, but delete our label when finished.  */
   8202 
   8203 static void
   8204 pa_lsym (int unused ATTRIBUTE_UNUSED)
   8205 {
   8206 #ifdef OBJ_SOM
   8207   /* We must have a valid space and subspace.  */
   8208   pa_check_current_space_and_subspace ();
   8209 #endif
   8210 
   8211   s_lsym (0);
   8212   pa_undefine_label ();
   8213 }
   8214 
   8215 /* This function is called once, at assembler startup time.  It should
   8216    set up all the tables, etc. that the MD part of the assembler will need.  */
   8217 
   8218 void
   8219 md_begin (void)
   8220 {
   8221   const char *retval = NULL;
   8222   int lose = 0;
   8223   unsigned int i = 0;
   8224 
   8225   last_call_info = NULL;
   8226   call_info_root = NULL;
   8227 
   8228   /* Set the default machine type.  */
   8229   if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, DEFAULT_LEVEL))
   8230     as_warn (_("could not set architecture and machine"));
   8231 
   8232   /* Folding of text and data segments fails miserably on the PA.
   8233      Warn user and disable "-R" option.  */
   8234   if (flag_readonly_data_in_text)
   8235     {
   8236       as_warn (_("-R option not supported on this target."));
   8237       flag_readonly_data_in_text = 0;
   8238     }
   8239 
   8240 #ifdef OBJ_SOM
   8241   pa_spaces_begin ();
   8242 #endif
   8243 
   8244   op_hash = hash_new ();
   8245 
   8246   while (i < NUMOPCODES)
   8247     {
   8248       const char *name = pa_opcodes[i].name;
   8249 
   8250       retval = hash_insert (op_hash, name, (struct pa_opcode *) &pa_opcodes[i]);
   8251       if (retval != NULL && *retval != '\0')
   8252 	{
   8253 	  as_fatal (_("Internal error: can't hash `%s': %s\n"), name, retval);
   8254 	  lose = 1;
   8255 	}
   8256 
   8257       do
   8258 	{
   8259 	  if ((pa_opcodes[i].match & pa_opcodes[i].mask)
   8260 	      != pa_opcodes[i].match)
   8261 	    {
   8262 	      fprintf (stderr, _("internal error: losing opcode: `%s' \"%s\"\n"),
   8263 		       pa_opcodes[i].name, pa_opcodes[i].args);
   8264 	      lose = 1;
   8265 	    }
   8266 	  ++i;
   8267 	}
   8268       while (i < NUMOPCODES && !strcmp (pa_opcodes[i].name, name));
   8269     }
   8270 
   8271   if (lose)
   8272     as_fatal (_("Broken assembler.  No assembly attempted."));
   8273 
   8274 #ifdef OBJ_SOM
   8275   /* SOM will change text_section.  To make sure we never put
   8276      anything into the old one switch to the new one now.  */
   8277   subseg_set (text_section, 0);
   8278 #endif
   8279 
   8280 #ifdef OBJ_SOM
   8281   dummy_symbol = symbol_find_or_make ("L$dummy");
   8282   S_SET_SEGMENT (dummy_symbol, text_section);
   8283   /* Force the symbol to be converted to a real symbol.  */
   8284   symbol_get_bfdsym (dummy_symbol)->flags |= BSF_KEEP;
   8285 #endif
   8286 }
   8287 
   8288 /* On the PA relocations which involve function symbols must not be
   8289    adjusted.  This so that the linker can know when/how to create argument
   8290    relocation stubs for indirect calls and calls to static functions.
   8291 
   8292    "T" field selectors create DLT relative fixups for accessing
   8293    globals and statics in PIC code; each DLT relative fixup creates
   8294    an entry in the DLT table.  The entries contain the address of
   8295    the final target (eg accessing "foo" would create a DLT entry
   8296    with the address of "foo").
   8297 
   8298    Unfortunately, the HP linker doesn't take into account any addend
   8299    when generating the DLT; so accessing $LIT$+8 puts the address of
   8300    $LIT$ into the DLT rather than the address of $LIT$+8.
   8301 
   8302    The end result is we can't perform relocation symbol reductions for
   8303    any fixup which creates entries in the DLT (eg they use "T" field
   8304    selectors).
   8305 
   8306    ??? Reject reductions involving symbols with external scope; such
   8307    reductions make life a living hell for object file editors.  */
   8308 
   8309 int
   8310 hppa_fix_adjustable (fixS *fixp)
   8311 {
   8312 #ifdef OBJ_ELF
   8313   reloc_type code;
   8314 #endif
   8315   struct hppa_fix_struct *hppa_fix;
   8316 
   8317   hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data;
   8318 
   8319 #ifdef OBJ_ELF
   8320   /* LR/RR selectors are implicitly used for a number of different relocation
   8321      types.  We must ensure that none of these types are adjusted (see below)
   8322      even if they occur with a different selector.  */
   8323   code = elf_hppa_reloc_final_type (stdoutput, fixp->fx_r_type,
   8324 		  		    hppa_fix->fx_r_format,
   8325 				    hppa_fix->fx_r_field);
   8326 
   8327   switch (code)
   8328     {
   8329     /* Relocation types which use e_lrsel.  */
   8330     case R_PARISC_DIR21L:
   8331     case R_PARISC_DLTREL21L:
   8332     case R_PARISC_DPREL21L:
   8333     case R_PARISC_PLTOFF21L:
   8334 
   8335     /* Relocation types which use e_rrsel.  */
   8336     case R_PARISC_DIR14R:
   8337     case R_PARISC_DIR14DR:
   8338     case R_PARISC_DIR14WR:
   8339     case R_PARISC_DIR17R:
   8340     case R_PARISC_DLTREL14R:
   8341     case R_PARISC_DLTREL14DR:
   8342     case R_PARISC_DLTREL14WR:
   8343     case R_PARISC_DPREL14R:
   8344     case R_PARISC_DPREL14DR:
   8345     case R_PARISC_DPREL14WR:
   8346     case R_PARISC_PLTOFF14R:
   8347     case R_PARISC_PLTOFF14DR:
   8348     case R_PARISC_PLTOFF14WR:
   8349 
   8350     /* Other types that we reject for reduction.  */
   8351     case R_PARISC_GNU_VTENTRY:
   8352     case R_PARISC_GNU_VTINHERIT:
   8353       return 0;
   8354     default:
   8355       break;
   8356     }
   8357 #endif
   8358 
   8359   /* Reject reductions of symbols in sym1-sym2 expressions when
   8360      the fixup will occur in a CODE subspace.
   8361 
   8362      XXX FIXME: Long term we probably want to reject all of these;
   8363      for example reducing in the debug section would lose if we ever
   8364      supported using the optimizing hp linker.  */
   8365   if (fixp->fx_addsy
   8366       && fixp->fx_subsy
   8367       && (hppa_fix->segment->flags & SEC_CODE))
   8368     return 0;
   8369 
   8370   /* We can't adjust any relocs that use LR% and RR% field selectors.
   8371 
   8372      If a symbol is reduced to a section symbol, the assembler will
   8373      adjust the addend unless the symbol happens to reside right at
   8374      the start of the section.  Additionally, the linker has no choice
   8375      but to manipulate the addends when coalescing input sections for
   8376      "ld -r".  Since an LR% field selector is defined to round the
   8377      addend, we can't change the addend without risking that a LR% and
   8378      it's corresponding (possible multiple) RR% field will no longer
   8379      sum to the right value.
   8380 
   8381      eg. Suppose we have
   8382      .		ldil	LR%foo+0,%r21
   8383      .		ldw	RR%foo+0(%r21),%r26
   8384      .		ldw	RR%foo+4(%r21),%r25
   8385 
   8386      If foo is at address 4092 (decimal) in section `sect', then after
   8387      reducing to the section symbol we get
   8388      .			LR%sect+4092 == (L%sect)+0
   8389      .			RR%sect+4092 == (R%sect)+4092
   8390      .			RR%sect+4096 == (R%sect)-4096
   8391      and the last address loses because rounding the addend to 8k
   8392      multiples takes us up to 8192 with an offset of -4096.
   8393 
   8394      In cases where the LR% expression is identical to the RR% one we
   8395      will never have a problem, but is so happens that gcc rounds
   8396      addends involved in LR% field selectors to work around a HP
   8397      linker bug.  ie. We often have addresses like the last case
   8398      above where the LR% expression is offset from the RR% one.  */
   8399 
   8400   if (hppa_fix->fx_r_field == e_lrsel
   8401       || hppa_fix->fx_r_field == e_rrsel
   8402       || hppa_fix->fx_r_field == e_nlrsel)
   8403     return 0;
   8404 
   8405   /* Reject reductions of symbols in DLT relative relocs,
   8406      relocations with plabels.  */
   8407   if (hppa_fix->fx_r_field == e_tsel
   8408       || hppa_fix->fx_r_field == e_ltsel
   8409       || hppa_fix->fx_r_field == e_rtsel
   8410       || hppa_fix->fx_r_field == e_psel
   8411       || hppa_fix->fx_r_field == e_rpsel
   8412       || hppa_fix->fx_r_field == e_lpsel)
   8413     return 0;
   8414 
   8415   /* Reject absolute calls (jumps).  */
   8416   if (hppa_fix->fx_r_type == R_HPPA_ABS_CALL)
   8417     return 0;
   8418 
   8419   /* Reject reductions of function symbols.  */
   8420   if (fixp->fx_addsy != 0 && S_IS_FUNCTION (fixp->fx_addsy))
   8421     return 0;
   8422 
   8423   return 1;
   8424 }
   8425 
   8426 /* Return nonzero if the fixup in FIXP will require a relocation,
   8427    even it if appears that the fixup could be completely handled
   8428    within GAS.  */
   8429 
   8430 int
   8431 hppa_force_relocation (struct fix *fixp)
   8432 {
   8433   struct hppa_fix_struct *hppa_fixp;
   8434 
   8435   hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data;
   8436 #ifdef OBJ_SOM
   8437   if (fixp->fx_r_type == (int) R_HPPA_ENTRY
   8438       || fixp->fx_r_type == (int) R_HPPA_EXIT
   8439       || fixp->fx_r_type == (int) R_HPPA_BEGIN_BRTAB
   8440       || fixp->fx_r_type == (int) R_HPPA_END_BRTAB
   8441       || fixp->fx_r_type == (int) R_HPPA_BEGIN_TRY
   8442       || fixp->fx_r_type == (int) R_HPPA_END_TRY
   8443       || (fixp->fx_addsy != NULL && fixp->fx_subsy != NULL
   8444 	  && (hppa_fixp->segment->flags & SEC_CODE) != 0))
   8445     return 1;
   8446 #endif
   8447 #ifdef OBJ_ELF
   8448   if (fixp->fx_r_type == (int) R_PARISC_GNU_VTINHERIT
   8449       || fixp->fx_r_type == (int) R_PARISC_GNU_VTENTRY)
   8450     return 1;
   8451 #endif
   8452 
   8453   gas_assert (fixp->fx_addsy != NULL);
   8454 
   8455   /* Ensure we emit a relocation for global symbols so that dynamic
   8456      linking works.  */
   8457   if (S_FORCE_RELOC (fixp->fx_addsy, 1))
   8458     return 1;
   8459 
   8460   /* It is necessary to force PC-relative calls/jumps to have a relocation
   8461      entry if they're going to need either an argument relocation or long
   8462      call stub.  */
   8463   if (fixp->fx_pcrel
   8464       && arg_reloc_stub_needed (symbol_arg_reloc_info (fixp->fx_addsy),
   8465 				hppa_fixp->fx_arg_reloc))
   8466     return 1;
   8467 
   8468   /* Now check to see if we're going to need a long-branch stub.  */
   8469   if (fixp->fx_r_type == (int) R_HPPA_PCREL_CALL)
   8470     {
   8471       long pc = md_pcrel_from (fixp);
   8472       valueT distance, min_stub_distance;
   8473 
   8474       distance = fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy) - pc - 8;
   8475 
   8476       /* Distance to the closest possible stub.  This will detect most
   8477 	 but not all circumstances where a stub will not work.  */
   8478       min_stub_distance = pc + 16;
   8479 #ifdef OBJ_SOM
   8480       if (last_call_info != NULL)
   8481 	min_stub_distance -= S_GET_VALUE (last_call_info->start_symbol);
   8482 #endif
   8483 
   8484       if ((distance + 8388608 >= 16777216
   8485 	   && min_stub_distance <= 8388608)
   8486 	  || (hppa_fixp->fx_r_format == 17
   8487 	      && distance + 262144 >= 524288
   8488 	      && min_stub_distance <= 262144)
   8489 	  || (hppa_fixp->fx_r_format == 12
   8490 	      && distance + 8192 >= 16384
   8491 	      && min_stub_distance <= 8192)
   8492 	  )
   8493 	return 1;
   8494     }
   8495 
   8496   if (fixp->fx_r_type == (int) R_HPPA_ABS_CALL)
   8497     return 1;
   8498 
   8499   /* No need (yet) to force another relocations to be emitted.  */
   8500   return 0;
   8501 }
   8502 
   8503 /* Now for some ELF specific code.  FIXME.  */
   8504 #ifdef OBJ_ELF
   8505 /* For ELF, this function serves one purpose:  to setup the st_size
   8506    field of STT_FUNC symbols.  To do this, we need to scan the
   8507    call_info structure list, determining st_size in by taking the
   8508    difference in the address of the beginning/end marker symbols.  */
   8509 
   8510 void
   8511 elf_hppa_final_processing (void)
   8512 {
   8513   struct call_info *call_info_pointer;
   8514 
   8515   for (call_info_pointer = call_info_root;
   8516        call_info_pointer;
   8517        call_info_pointer = call_info_pointer->ci_next)
   8518     {
   8519       elf_symbol_type *esym
   8520 	= ((elf_symbol_type *)
   8521 	   symbol_get_bfdsym (call_info_pointer->start_symbol));
   8522       esym->internal_elf_sym.st_size =
   8523 	S_GET_VALUE (call_info_pointer->end_symbol)
   8524 	- S_GET_VALUE (call_info_pointer->start_symbol) + 4;
   8525     }
   8526 }
   8527 
   8528 static void
   8529 pa_vtable_entry (int ignore ATTRIBUTE_UNUSED)
   8530 {
   8531   struct fix *new_fix;
   8532 
   8533   new_fix = obj_elf_vtable_entry (0);
   8534 
   8535   if (new_fix)
   8536     {
   8537       struct hppa_fix_struct * hppa_fix = XOBNEW (&notes, struct hppa_fix_struct);
   8538 
   8539       hppa_fix->fx_r_type = R_HPPA;
   8540       hppa_fix->fx_r_field = e_fsel;
   8541       hppa_fix->fx_r_format = 32;
   8542       hppa_fix->fx_arg_reloc = 0;
   8543       hppa_fix->segment = now_seg;
   8544       new_fix->tc_fix_data = (void *) hppa_fix;
   8545       new_fix->fx_r_type = (int) R_PARISC_GNU_VTENTRY;
   8546     }
   8547 }
   8548 
   8549 static void
   8550 pa_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
   8551 {
   8552   struct fix *new_fix;
   8553 
   8554   new_fix = obj_elf_vtable_inherit (0);
   8555 
   8556   if (new_fix)
   8557     {
   8558       struct hppa_fix_struct * hppa_fix = XOBNEW (&notes, struct hppa_fix_struct);
   8559 
   8560       hppa_fix->fx_r_type = R_HPPA;
   8561       hppa_fix->fx_r_field = e_fsel;
   8562       hppa_fix->fx_r_format = 32;
   8563       hppa_fix->fx_arg_reloc = 0;
   8564       hppa_fix->segment = now_seg;
   8565       new_fix->tc_fix_data = (void *) hppa_fix;
   8566       new_fix->fx_r_type = (int) R_PARISC_GNU_VTINHERIT;
   8567     }
   8568 }
   8569 #endif
   8570 
   8571 /* Table of pseudo ops for the PA.  FIXME -- how many of these
   8572    are now redundant with the overall GAS and the object file
   8573    dependent tables?  */
   8574 const pseudo_typeS md_pseudo_table[] =
   8575 {
   8576   /* align pseudo-ops on the PA specify the actual alignment requested,
   8577      not the log2 of the requested alignment.  */
   8578 #ifdef OBJ_SOM
   8579   {"align", pa_align, 8},
   8580 #endif
   8581 #ifdef OBJ_ELF
   8582   {"align", s_align_bytes, 8},
   8583 #endif
   8584   {"begin_brtab", pa_brtab, 1},
   8585   {"begin_try", pa_try, 1},
   8586   {"block", pa_block, 1},
   8587   {"blockz", pa_block, 0},
   8588   {"byte", pa_cons, 1},
   8589   {"call", pa_call, 0},
   8590   {"callinfo", pa_callinfo, 0},
   8591 #if defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))
   8592   {"code", obj_elf_text, 0},
   8593 #else
   8594   {"code", pa_text, 0},
   8595   {"comm", pa_comm, 0},
   8596 #endif
   8597 #ifdef OBJ_SOM
   8598   {"compiler", pa_compiler, 0},
   8599 #endif
   8600   {"copyright", pa_copyright, 0},
   8601 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
   8602   {"data", pa_data, 0},
   8603 #endif
   8604   {"double", pa_float_cons, 'd'},
   8605   {"dword", pa_cons, 8},
   8606   {"end", pa_end, 0},
   8607   {"end_brtab", pa_brtab, 0},
   8608 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
   8609   {"end_try", pa_try, 0},
   8610 #endif
   8611   {"enter", pa_enter, 0},
   8612   {"entry", pa_entry, 0},
   8613   {"equ", pa_equ, 0},
   8614   {"exit", pa_exit, 0},
   8615   {"export", pa_export, 0},
   8616   {"fill", pa_fill, 0},
   8617   {"float", pa_float_cons, 'f'},
   8618   {"half", pa_cons, 2},
   8619   {"import", pa_import, 0},
   8620   {"int", pa_cons, 4},
   8621   {"label", pa_label, 0},
   8622   {"lcomm", pa_lcomm, 0},
   8623   {"leave", pa_leave, 0},
   8624   {"level", pa_level, 0},
   8625   {"long", pa_cons, 4},
   8626   {"lsym", pa_lsym, 0},
   8627 #ifdef OBJ_SOM
   8628   {"nsubspa", pa_subspace, 1},
   8629 #endif
   8630   {"octa", pa_cons, 16},
   8631   {"org", pa_origin, 0},
   8632   {"origin", pa_origin, 0},
   8633   {"param", pa_param, 0},
   8634   {"proc", pa_proc, 0},
   8635   {"procend", pa_procend, 0},
   8636   {"quad", pa_cons, 8},
   8637   {"reg", pa_equ, 1},
   8638   {"short", pa_cons, 2},
   8639   {"single", pa_float_cons, 'f'},
   8640 #ifdef OBJ_SOM
   8641   {"space", pa_space, 0},
   8642   {"spnum", pa_spnum, 0},
   8643 #endif
   8644   {"string", pa_stringer, 0},
   8645   {"stringz", pa_stringer, 1},
   8646 #ifdef OBJ_SOM
   8647   {"subspa", pa_subspace, 0},
   8648 #endif
   8649 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
   8650   {"text", pa_text, 0},
   8651 #endif
   8652   {"version", pa_version, 0},
   8653 #ifdef OBJ_ELF
   8654   {"vtable_entry", pa_vtable_entry, 0},
   8655   {"vtable_inherit", pa_vtable_inherit, 0},
   8656 #endif
   8657   {"word", pa_cons, 4},
   8658   {NULL, 0, 0}
   8659 };
   8660 
   8661 #ifdef OBJ_ELF
   8662 void
   8663 hppa_cfi_frame_initial_instructions (void)
   8664 {
   8665   cfi_add_CFA_def_cfa (30, 0);
   8666 }
   8667 
   8668 int
   8669 hppa_regname_to_dw2regnum (char *regname)
   8670 {
   8671   unsigned int regnum = -1;
   8672   unsigned int i;
   8673   const char *p;
   8674   char *q;
   8675   static struct { const char *name; int dw2regnum; } regnames[] =
   8676     {
   8677       { "sp", 30 }, { "rp", 2 },
   8678     };
   8679 
   8680   for (i = 0; i < ARRAY_SIZE (regnames); ++i)
   8681     if (strcmp (regnames[i].name, regname) == 0)
   8682       return regnames[i].dw2regnum;
   8683 
   8684   if (regname[0] == 'r')
   8685     {
   8686       p = regname + 1;
   8687       regnum = strtoul (p, &q, 10);
   8688       if (p == q || *q || regnum >= 32)
   8689 	return -1;
   8690     }
   8691   else if (regname[0] == 'f' && regname[1] == 'r')
   8692     {
   8693       p = regname + 2;
   8694       regnum = strtoul (p, &q, 10);
   8695 #if TARGET_ARCH_SIZE == 64
   8696       if (p == q || *q || regnum <= 4 || regnum >= 32)
   8697 	return -1;
   8698       regnum += 32 - 4;
   8699 #else
   8700       if (p == q
   8701 	  || (*q  && ((*q != 'L' && *q != 'R') || *(q + 1)))
   8702 	  || regnum <= 4 || regnum >= 32)
   8703 	return -1;
   8704       regnum = (regnum - 4) * 2 + 32;
   8705       if (*q == 'R')
   8706 	regnum++;
   8707 #endif
   8708     }
   8709   return regnum;
   8710 }
   8711 #endif
   8712