Home | History | Annotate | Download | only in config
      1 /* tc-hppa.c -- Assemble for the PA
      2    Copyright (C) 1989-2014 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     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     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     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     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     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 (char *, int, int,
    507 						  int, int, int,
    508 						  asection *, int);
    509 static ssd_chain_struct *create_new_subspace (sd_chain_struct *,
    510 						      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 (char *);
    520 static ssd_chain_struct *is_defined_subspace (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 (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 /* Nonzero when strict matching is enabled.  Zero otherwise.
    610 
    611    Each opcode in the table has a flag which indicates whether or
    612    not strict matching should be enabled for that instruction.
    613 
    614    Mainly, strict causes errors to be ignored when a match failure
    615    occurs.  However, it also affects the parsing of register fields
    616    by pa_parse_number.  */
    617 static int strict;
    618 
    619 /* pa_parse_number returns values in `pa_number'.  Mostly
    620    pa_parse_number is used to return a register number, with floating
    621    point registers being numbered from FP_REG_BASE upwards.
    622    The bit specified with FP_REG_RSEL is set if the floating point
    623    register has a `r' suffix.  */
    624 #define FP_REG_BASE 64
    625 #define FP_REG_RSEL 128
    626 static int pa_number;
    627 
    628 #ifdef OBJ_SOM
    629 /* A dummy bfd symbol so that all relocations have symbols of some kind.  */
    630 static symbolS *dummy_symbol;
    631 #endif
    632 
    633 /* Nonzero if errors are to be printed.  */
    634 static int print_errors = 1;
    635 
    636 /* List of registers that are pre-defined:
    637 
    638    Each general register has one predefined name of the form
    639    %r<REGNUM> which has the value <REGNUM>.
    640 
    641    Space and control registers are handled in a similar manner,
    642    but use %sr<REGNUM> and %cr<REGNUM> as their predefined names.
    643 
    644    Likewise for the floating point registers, but of the form
    645    %fr<REGNUM>.  Floating point registers have additional predefined
    646    names with 'L' and 'R' suffixes (e.g. %fr19L, %fr19R) which
    647    again have the value <REGNUM>.
    648 
    649    Many registers also have synonyms:
    650 
    651    %r26 - %r23 have %arg0 - %arg3 as synonyms
    652    %r28 - %r29 have %ret0 - %ret1 as synonyms
    653    %fr4 - %fr7 have %farg0 - %farg3 as synonyms
    654    %r30 has %sp as a synonym
    655    %r27 has %dp as a synonym
    656    %r2  has %rp as a synonym
    657 
    658    Almost every control register has a synonym; they are not listed
    659    here for brevity.
    660 
    661    The table is sorted. Suitable for searching by a binary search.  */
    662 
    663 static const struct pd_reg pre_defined_registers[] =
    664 {
    665   {"%arg0",  26},
    666   {"%arg1",  25},
    667   {"%arg2",  24},
    668   {"%arg3",  23},
    669   {"%cr0",    0},
    670   {"%cr10",  10},
    671   {"%cr11",  11},
    672   {"%cr12",  12},
    673   {"%cr13",  13},
    674   {"%cr14",  14},
    675   {"%cr15",  15},
    676   {"%cr16",  16},
    677   {"%cr17",  17},
    678   {"%cr18",  18},
    679   {"%cr19",  19},
    680   {"%cr20",  20},
    681   {"%cr21",  21},
    682   {"%cr22",  22},
    683   {"%cr23",  23},
    684   {"%cr24",  24},
    685   {"%cr25",  25},
    686   {"%cr26",  26},
    687   {"%cr27",  27},
    688   {"%cr28",  28},
    689   {"%cr29",  29},
    690   {"%cr30",  30},
    691   {"%cr31",  31},
    692   {"%cr8",    8},
    693   {"%cr9",    9},
    694   {"%dp",    27},
    695   {"%eiem",  15},
    696   {"%eirr",  23},
    697   {"%farg0",  4 + FP_REG_BASE},
    698   {"%farg1",  5 + FP_REG_BASE},
    699   {"%farg2",  6 + FP_REG_BASE},
    700   {"%farg3",  7 + FP_REG_BASE},
    701   {"%fr0",    0 + FP_REG_BASE},
    702   {"%fr0l",   0 + FP_REG_BASE},
    703   {"%fr0r",   0 + FP_REG_BASE + FP_REG_RSEL},
    704   {"%fr1",    1 + FP_REG_BASE},
    705   {"%fr10",  10 + FP_REG_BASE},
    706   {"%fr10l", 10 + FP_REG_BASE},
    707   {"%fr10r", 10 + FP_REG_BASE + FP_REG_RSEL},
    708   {"%fr11",  11 + FP_REG_BASE},
    709   {"%fr11l", 11 + FP_REG_BASE},
    710   {"%fr11r", 11 + FP_REG_BASE + FP_REG_RSEL},
    711   {"%fr12",  12 + FP_REG_BASE},
    712   {"%fr12l", 12 + FP_REG_BASE},
    713   {"%fr12r", 12 + FP_REG_BASE + FP_REG_RSEL},
    714   {"%fr13",  13 + FP_REG_BASE},
    715   {"%fr13l", 13 + FP_REG_BASE},
    716   {"%fr13r", 13 + FP_REG_BASE + FP_REG_RSEL},
    717   {"%fr14",  14 + FP_REG_BASE},
    718   {"%fr14l", 14 + FP_REG_BASE},
    719   {"%fr14r", 14 + FP_REG_BASE + FP_REG_RSEL},
    720   {"%fr15",  15 + FP_REG_BASE},
    721   {"%fr15l", 15 + FP_REG_BASE},
    722   {"%fr15r", 15 + FP_REG_BASE + FP_REG_RSEL},
    723   {"%fr16",  16 + FP_REG_BASE},
    724   {"%fr16l", 16 + FP_REG_BASE},
    725   {"%fr16r", 16 + FP_REG_BASE + FP_REG_RSEL},
    726   {"%fr17",  17 + FP_REG_BASE},
    727   {"%fr17l", 17 + FP_REG_BASE},
    728   {"%fr17r", 17 + FP_REG_BASE + FP_REG_RSEL},
    729   {"%fr18",  18 + FP_REG_BASE},
    730   {"%fr18l", 18 + FP_REG_BASE},
    731   {"%fr18r", 18 + FP_REG_BASE + FP_REG_RSEL},
    732   {"%fr19",  19 + FP_REG_BASE},
    733   {"%fr19l", 19 + FP_REG_BASE},
    734   {"%fr19r", 19 + FP_REG_BASE + FP_REG_RSEL},
    735   {"%fr1l",   1 + FP_REG_BASE},
    736   {"%fr1r",   1 + FP_REG_BASE + FP_REG_RSEL},
    737   {"%fr2",    2 + FP_REG_BASE},
    738   {"%fr20",  20 + FP_REG_BASE},
    739   {"%fr20l", 20 + FP_REG_BASE},
    740   {"%fr20r", 20 + FP_REG_BASE + FP_REG_RSEL},
    741   {"%fr21",  21 + FP_REG_BASE},
    742   {"%fr21l", 21 + FP_REG_BASE},
    743   {"%fr21r", 21 + FP_REG_BASE + FP_REG_RSEL},
    744   {"%fr22",  22 + FP_REG_BASE},
    745   {"%fr22l", 22 + FP_REG_BASE},
    746   {"%fr22r", 22 + FP_REG_BASE + FP_REG_RSEL},
    747   {"%fr23",  23 + FP_REG_BASE},
    748   {"%fr23l", 23 + FP_REG_BASE},
    749   {"%fr23r", 23 + FP_REG_BASE + FP_REG_RSEL},
    750   {"%fr24",  24 + FP_REG_BASE},
    751   {"%fr24l", 24 + FP_REG_BASE},
    752   {"%fr24r", 24 + FP_REG_BASE + FP_REG_RSEL},
    753   {"%fr25",  25 + FP_REG_BASE},
    754   {"%fr25l", 25 + FP_REG_BASE},
    755   {"%fr25r", 25 + FP_REG_BASE + FP_REG_RSEL},
    756   {"%fr26",  26 + FP_REG_BASE},
    757   {"%fr26l", 26 + FP_REG_BASE},
    758   {"%fr26r", 26 + FP_REG_BASE + FP_REG_RSEL},
    759   {"%fr27",  27 + FP_REG_BASE},
    760   {"%fr27l", 27 + FP_REG_BASE},
    761   {"%fr27r", 27 + FP_REG_BASE + FP_REG_RSEL},
    762   {"%fr28",  28 + FP_REG_BASE},
    763   {"%fr28l", 28 + FP_REG_BASE},
    764   {"%fr28r", 28 + FP_REG_BASE + FP_REG_RSEL},
    765   {"%fr29",  29 + FP_REG_BASE},
    766   {"%fr29l", 29 + FP_REG_BASE},
    767   {"%fr29r", 29 + FP_REG_BASE + FP_REG_RSEL},
    768   {"%fr2l",   2 + FP_REG_BASE},
    769   {"%fr2r",   2 + FP_REG_BASE + FP_REG_RSEL},
    770   {"%fr3",    3 + FP_REG_BASE},
    771   {"%fr30",  30 + FP_REG_BASE},
    772   {"%fr30l", 30 + FP_REG_BASE},
    773   {"%fr30r", 30 + FP_REG_BASE + FP_REG_RSEL},
    774   {"%fr31",  31 + FP_REG_BASE},
    775   {"%fr31l", 31 + FP_REG_BASE},
    776   {"%fr31r", 31 + FP_REG_BASE + FP_REG_RSEL},
    777   {"%fr3l",   3 + FP_REG_BASE},
    778   {"%fr3r",   3 + FP_REG_BASE + FP_REG_RSEL},
    779   {"%fr4",    4 + FP_REG_BASE},
    780   {"%fr4l",   4 + FP_REG_BASE},
    781   {"%fr4r",   4 + FP_REG_BASE + FP_REG_RSEL},
    782   {"%fr5",    5 + FP_REG_BASE},
    783   {"%fr5l",   5 + FP_REG_BASE},
    784   {"%fr5r",   5 + FP_REG_BASE + FP_REG_RSEL},
    785   {"%fr6",    6 + FP_REG_BASE},
    786   {"%fr6l",   6 + FP_REG_BASE},
    787   {"%fr6r",   6 + FP_REG_BASE + FP_REG_RSEL},
    788   {"%fr7",    7 + FP_REG_BASE},
    789   {"%fr7l",   7 + FP_REG_BASE},
    790   {"%fr7r",   7 + FP_REG_BASE + FP_REG_RSEL},
    791   {"%fr8",    8 + FP_REG_BASE},
    792   {"%fr8l",   8 + FP_REG_BASE},
    793   {"%fr8r",   8 + FP_REG_BASE + FP_REG_RSEL},
    794   {"%fr9",    9 + FP_REG_BASE},
    795   {"%fr9l",   9 + FP_REG_BASE},
    796   {"%fr9r",   9 + FP_REG_BASE + FP_REG_RSEL},
    797   {"%fret",   4},
    798   {"%hta",   25},
    799   {"%iir",   19},
    800   {"%ior",   21},
    801   {"%ipsw",  22},
    802   {"%isr",   20},
    803   {"%itmr",  16},
    804   {"%iva",   14},
    805 #if TARGET_ARCH_SIZE == 64
    806   {"%mrp",    2},
    807 #else
    808   {"%mrp",   31},
    809 #endif
    810   {"%pcoq",  18},
    811   {"%pcsq",  17},
    812   {"%pidr1",  8},
    813   {"%pidr2",  9},
    814   {"%pidr3", 12},
    815   {"%pidr4", 13},
    816   {"%ppda",  24},
    817   {"%r0",     0},
    818   {"%r1",     1},
    819   {"%r10",   10},
    820   {"%r11",   11},
    821   {"%r12",   12},
    822   {"%r13",   13},
    823   {"%r14",   14},
    824   {"%r15",   15},
    825   {"%r16",   16},
    826   {"%r17",   17},
    827   {"%r18",   18},
    828   {"%r19",   19},
    829   {"%r2",     2},
    830   {"%r20",   20},
    831   {"%r21",   21},
    832   {"%r22",   22},
    833   {"%r23",   23},
    834   {"%r24",   24},
    835   {"%r25",   25},
    836   {"%r26",   26},
    837   {"%r27",   27},
    838   {"%r28",   28},
    839   {"%r29",   29},
    840   {"%r3",     3},
    841   {"%r30",   30},
    842   {"%r31",   31},
    843   {"%r4",     4},
    844   {"%r5",     5},
    845   {"%r6",     6},
    846   {"%r7",     7},
    847   {"%r8",     8},
    848   {"%r9",     9},
    849   {"%rctr",   0},
    850   {"%ret0",  28},
    851   {"%ret1",  29},
    852   {"%rp",     2},
    853   {"%sar",   11},
    854   {"%sp",    30},
    855   {"%sr0",    0},
    856   {"%sr1",    1},
    857   {"%sr2",    2},
    858   {"%sr3",    3},
    859   {"%sr4",    4},
    860   {"%sr5",    5},
    861   {"%sr6",    6},
    862   {"%sr7",    7},
    863   {"%t1",    22},
    864   {"%t2",    21},
    865   {"%t3",    20},
    866   {"%t4",    19},
    867   {"%tf1",   11},
    868   {"%tf2",   10},
    869   {"%tf3",    9},
    870   {"%tf4",    8},
    871   {"%tr0",   24},
    872   {"%tr1",   25},
    873   {"%tr2",   26},
    874   {"%tr3",   27},
    875   {"%tr4",   28},
    876   {"%tr5",   29},
    877   {"%tr6",   30},
    878   {"%tr7",   31}
    879 };
    880 
    881 /* This table is sorted by order of the length of the string. This is
    882    so we check for <> before we check for <. If we had a <> and checked
    883    for < first, we would get a false match.  */
    884 static const struct fp_cond_map fp_cond_map[] =
    885 {
    886   {"false?", 0},
    887   {"false", 1},
    888   {"true?", 30},
    889   {"true", 31},
    890   {"!<=>", 3},
    891   {"!?>=", 8},
    892   {"!?<=", 16},
    893   {"!<>", 7},
    894   {"!>=", 11},
    895   {"!?>", 12},
    896   {"?<=", 14},
    897   {"!<=", 19},
    898   {"!?<", 20},
    899   {"?>=", 22},
    900   {"!?=", 24},
    901   {"!=t", 27},
    902   {"<=>", 29},
    903   {"=t", 5},
    904   {"?=", 6},
    905   {"?<", 10},
    906   {"<=", 13},
    907   {"!>", 15},
    908   {"?>", 18},
    909   {">=", 21},
    910   {"!<", 23},
    911   {"<>", 25},
    912   {"!=", 26},
    913   {"!?", 28},
    914   {"?", 2},
    915   {"=", 4},
    916   {"<", 9},
    917   {">", 17}
    918 };
    919 
    920 static const struct selector_entry selector_table[] =
    921 {
    922   {"f", e_fsel},
    923   {"l", e_lsel},
    924   {"ld", e_ldsel},
    925   {"lp", e_lpsel},
    926   {"lr", e_lrsel},
    927   {"ls", e_lssel},
    928   {"lt", e_ltsel},
    929   {"ltp", e_ltpsel},
    930   {"n", e_nsel},
    931   {"nl", e_nlsel},
    932   {"nlr", e_nlrsel},
    933   {"p", e_psel},
    934   {"r", e_rsel},
    935   {"rd", e_rdsel},
    936   {"rp", e_rpsel},
    937   {"rr", e_rrsel},
    938   {"rs", e_rssel},
    939   {"rt", e_rtsel},
    940   {"rtp", e_rtpsel},
    941   {"t", e_tsel},
    942 };
    943 
    944 #ifdef OBJ_SOM
    945 /* default space and subspace dictionaries */
    946 
    947 #define GDB_SYMBOLS	GDB_SYMBOLS_SUBSPACE_NAME
    948 #define GDB_STRINGS	GDB_STRINGS_SUBSPACE_NAME
    949 
    950 /* pre-defined subsegments (subspaces) for the HPPA.  */
    951 #define SUBSEG_CODE   0
    952 #define SUBSEG_LIT    1
    953 #define SUBSEG_MILLI  2
    954 #define SUBSEG_DATA   0
    955 #define SUBSEG_BSS    2
    956 #define SUBSEG_UNWIND 3
    957 #define SUBSEG_GDB_STRINGS 0
    958 #define SUBSEG_GDB_SYMBOLS 1
    959 
    960 static struct default_subspace_dict pa_def_subspaces[] =
    961 {
    962   {"$CODE$", 1, 1, 1, 0, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, SUBSEG_CODE},
    963   {"$DATA$", 1, 1, 0, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, SUBSEG_DATA},
    964   {"$LIT$", 1, 1, 0, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, SUBSEG_LIT},
    965   {"$MILLICODE$", 1, 1, 0, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, SUBSEG_MILLI},
    966   {"$BSS$", 1, 1, 0, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, SUBSEG_BSS},
    967   {NULL, 0, 1, 0, 0, 0, 0, 0, 255, 0x1f, 0, 4, 0, 0, 0}
    968 };
    969 
    970 static struct default_space_dict pa_def_spaces[] =
    971 {
    972   {"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL},
    973   {"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL},
    974   {NULL, 0, 0, 0, 0, 0, ASEC_NULL}
    975 };
    976 
    977 /* Misc local definitions used by the assembler.  */
    978 
    979 /* These macros are used to maintain spaces/subspaces.  */
    980 #define SPACE_DEFINED(space_chain)	(space_chain)->sd_defined
    981 #define SPACE_USER_DEFINED(space_chain) (space_chain)->sd_user_defined
    982 #define SPACE_SPNUM(space_chain)	(space_chain)->sd_spnum
    983 #define SPACE_NAME(space_chain)		(space_chain)->sd_name
    984 
    985 #define SUBSPACE_DEFINED(ss_chain)	(ss_chain)->ssd_defined
    986 #define SUBSPACE_NAME(ss_chain)		(ss_chain)->ssd_name
    987 #endif
    988 
    989 /* Return nonzero if the string pointed to by S potentially represents
    990    a right or left half of a FP register  */
    991 #define IS_R_SELECT(S)   (*(S) == 'R' || *(S) == 'r')
    992 #define IS_L_SELECT(S)   (*(S) == 'L' || *(S) == 'l')
    993 
    994 /* Store immediate values of shift/deposit/extract functions.  */
    995 
    996 #define SAVE_IMMEDIATE(VALUE) \
    997   { \
    998     if (immediate_check) \
    999       { \
   1000 	if (pos == -1) \
   1001 	  pos = (VALUE); \
   1002 	else if (len == -1) \
   1003 	  len = (VALUE); \
   1004       } \
   1005   }
   1006 
   1007 /* Insert FIELD into OPCODE starting at bit START.  Continue pa_ip
   1008    main loop after insertion.  */
   1009 
   1010 #define INSERT_FIELD_AND_CONTINUE(OPCODE, FIELD, START) \
   1011   { \
   1012     ((OPCODE) |= (FIELD) << (START)); \
   1013     continue; \
   1014   }
   1015 
   1016 /* Simple range checking for FIELD against HIGH and LOW bounds.
   1017    IGNORE is used to suppress the error message.  */
   1018 
   1019 #define CHECK_FIELD(FIELD, HIGH, LOW, IGNORE) \
   1020   { \
   1021     if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
   1022       { \
   1023 	if (! IGNORE) \
   1024 	  as_bad (_("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
   1025 		  (int) (FIELD));\
   1026 	break; \
   1027       } \
   1028   }
   1029 
   1030 /* Variant of CHECK_FIELD for use in md_apply_fix and other places where
   1031    the current file and line number are not valid.  */
   1032 
   1033 #define CHECK_FIELD_WHERE(FIELD, HIGH, LOW, FILENAME, LINE) \
   1034   { \
   1035     if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
   1036       { \
   1037 	as_bad_where ((FILENAME), (LINE), \
   1038 		      _("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
   1039 		      (int) (FIELD));\
   1040 	break; \
   1041       } \
   1042   }
   1043 
   1044 /* Simple alignment checking for FIELD against ALIGN (a power of two).
   1045    IGNORE is used to suppress the error message.  */
   1046 
   1047 #define CHECK_ALIGN(FIELD, ALIGN, IGNORE) \
   1048   { \
   1049     if ((FIELD) & ((ALIGN) - 1)) \
   1050       { \
   1051 	if (! IGNORE) \
   1052 	  as_bad (_("Field not properly aligned [%d] (%d)."), (ALIGN), \
   1053 		  (int) (FIELD));\
   1054 	break; \
   1055       } \
   1056   }
   1057 
   1058 #define is_DP_relative(exp)			\
   1059   ((exp).X_op == O_subtract			\
   1060    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$global$") == 0)
   1061 
   1062 #define is_SB_relative(exp)			\
   1063   ((exp).X_op == O_subtract			\
   1064    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$segrel$") == 0)
   1065 
   1066 #define is_PC_relative(exp)			\
   1067   ((exp).X_op == O_subtract			\
   1068    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$PIC_pcrel$0") == 0)
   1069 
   1070 #define is_tls_gdidx(exp)			\
   1071   ((exp).X_op == O_subtract			\
   1072    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_gdidx$") == 0)
   1073 
   1074 #define is_tls_ldidx(exp)			\
   1075   ((exp).X_op == O_subtract			\
   1076    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ldidx$") == 0)
   1077 
   1078 #define is_tls_dtpoff(exp)			\
   1079   ((exp).X_op == O_subtract			\
   1080    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_dtpoff$") == 0)
   1081 
   1082 #define is_tls_ieoff(exp)			\
   1083   ((exp).X_op == O_subtract			\
   1084    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ieoff$") == 0)
   1085 
   1086 #define is_tls_leoff(exp)			\
   1087   ((exp).X_op == O_subtract			\
   1088    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_leoff$") == 0)
   1089 
   1090 /* We need some complex handling for stabs (sym1 - sym2).  Luckily, we'll
   1091    always be able to reduce the expression to a constant, so we don't
   1092    need real complex handling yet.  */
   1093 #define is_complex(exp)				\
   1094   ((exp).X_op != O_constant && (exp).X_op != O_symbol)
   1095 
   1096 /* Actual functions to implement the PA specific code for the assembler.  */
   1097 
   1098 /* Called before writing the object file.  Make sure entry/exit and
   1099    proc/procend pairs match.  */
   1100 
   1101 void
   1102 pa_check_eof (void)
   1103 {
   1104   if (within_entry_exit)
   1105     as_fatal (_("Missing .exit\n"));
   1106 
   1107   if (within_procedure)
   1108     as_fatal (_("Missing .procend\n"));
   1109 }
   1110 
   1111 /* Returns a pointer to the label_symbol_struct for the current space.
   1112    or NULL if no label_symbol_struct exists for the current space.  */
   1113 
   1114 static label_symbol_struct *
   1115 pa_get_label (void)
   1116 {
   1117   label_symbol_struct *label_chain;
   1118 
   1119   for (label_chain = label_symbols_rootp;
   1120        label_chain;
   1121        label_chain = label_chain->lss_next)
   1122     {
   1123 #ifdef OBJ_SOM
   1124     if (current_space == label_chain->lss_space && label_chain->lss_label)
   1125       return label_chain;
   1126 #endif
   1127 #ifdef OBJ_ELF
   1128     if (now_seg == label_chain->lss_segment && label_chain->lss_label)
   1129       return label_chain;
   1130 #endif
   1131     }
   1132 
   1133   return NULL;
   1134 }
   1135 
   1136 /* Defines a label for the current space.  If one is already defined,
   1137    this function will replace it with the new label.  */
   1138 
   1139 void
   1140 pa_define_label (symbolS *symbol)
   1141 {
   1142   label_symbol_struct *label_chain = pa_get_label ();
   1143 
   1144   if (label_chain)
   1145     label_chain->lss_label = symbol;
   1146   else
   1147     {
   1148       /* Create a new label entry and add it to the head of the chain.  */
   1149       label_chain = xmalloc (sizeof (label_symbol_struct));
   1150       label_chain->lss_label = symbol;
   1151 #ifdef OBJ_SOM
   1152       label_chain->lss_space = current_space;
   1153 #endif
   1154 #ifdef OBJ_ELF
   1155       label_chain->lss_segment = now_seg;
   1156 #endif
   1157       label_chain->lss_next = NULL;
   1158 
   1159       if (label_symbols_rootp)
   1160 	label_chain->lss_next = label_symbols_rootp;
   1161 
   1162       label_symbols_rootp = label_chain;
   1163     }
   1164 
   1165 #ifdef OBJ_ELF
   1166   dwarf2_emit_label (symbol);
   1167 #endif
   1168 }
   1169 
   1170 /* Removes a label definition for the current space.
   1171    If there is no label_symbol_struct entry, then no action is taken.  */
   1172 
   1173 static void
   1174 pa_undefine_label (void)
   1175 {
   1176   label_symbol_struct *label_chain;
   1177   label_symbol_struct *prev_label_chain = NULL;
   1178 
   1179   for (label_chain = label_symbols_rootp;
   1180        label_chain;
   1181        label_chain = label_chain->lss_next)
   1182     {
   1183       if (1
   1184 #ifdef OBJ_SOM
   1185 	  && current_space == label_chain->lss_space && label_chain->lss_label
   1186 #endif
   1187 #ifdef OBJ_ELF
   1188 	  && now_seg == label_chain->lss_segment && label_chain->lss_label
   1189 #endif
   1190 	  )
   1191 	{
   1192 	  /* Remove the label from the chain and free its memory.  */
   1193 	  if (prev_label_chain)
   1194 	    prev_label_chain->lss_next = label_chain->lss_next;
   1195 	  else
   1196 	    label_symbols_rootp = label_chain->lss_next;
   1197 
   1198 	  free (label_chain);
   1199 	  break;
   1200 	}
   1201       prev_label_chain = label_chain;
   1202     }
   1203 }
   1204 
   1205 /* An HPPA-specific version of fix_new.  This is required because the HPPA
   1206    code needs to keep track of some extra stuff.  Each call to fix_new_hppa
   1207    results in the creation of an instance of an hppa_fix_struct.  An
   1208    hppa_fix_struct stores the extra information along with a pointer to the
   1209    original fixS.  This is attached to the original fixup via the
   1210    tc_fix_data field.  */
   1211 
   1212 static void
   1213 fix_new_hppa (fragS *frag,
   1214 	      int where,
   1215 	      int size,
   1216 	      symbolS *add_symbol,
   1217 	      offsetT offset,
   1218 	      expressionS *exp,
   1219 	      int pcrel,
   1220 	      bfd_reloc_code_real_type r_type,
   1221 	      enum hppa_reloc_field_selector_type_alt r_field,
   1222 	      int r_format,
   1223 	      unsigned int arg_reloc,
   1224 	      int unwind_bits ATTRIBUTE_UNUSED)
   1225 {
   1226   fixS *new_fix;
   1227   struct hppa_fix_struct *hppa_fix = obstack_alloc (&notes, sizeof (struct hppa_fix_struct));
   1228 
   1229   if (exp != NULL)
   1230     new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
   1231   else
   1232     new_fix = fix_new (frag, where, size, add_symbol, offset, pcrel, r_type);
   1233   new_fix->tc_fix_data = (void *) hppa_fix;
   1234   hppa_fix->fx_r_type = r_type;
   1235   hppa_fix->fx_r_field = r_field;
   1236   hppa_fix->fx_r_format = r_format;
   1237   hppa_fix->fx_arg_reloc = arg_reloc;
   1238   hppa_fix->segment = now_seg;
   1239 #ifdef OBJ_SOM
   1240   if (r_type == R_ENTRY || r_type == R_EXIT)
   1241     new_fix->fx_offset = unwind_bits;
   1242 #endif
   1243 
   1244   /* foo-$global$ is used to access non-automatic storage.  $global$
   1245      is really just a marker and has served its purpose, so eliminate
   1246      it now so as not to confuse write.c.  Ditto for $PIC_pcrel$0.  */
   1247   if (new_fix->fx_subsy
   1248       && (strcmp (S_GET_NAME (new_fix->fx_subsy), "$global$") == 0
   1249 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$segrel$") == 0
   1250 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$PIC_pcrel$0") == 0
   1251 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_gdidx$") == 0
   1252 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_ldidx$") == 0
   1253 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_dtpoff$") == 0
   1254 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_ieoff$") == 0
   1255 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_leoff$") == 0))
   1256     new_fix->fx_subsy = NULL;
   1257 }
   1258 
   1259 /* This fix_new is called by cons via TC_CONS_FIX_NEW.
   1260    hppa_field_selector is set by the parse_cons_expression_hppa.  */
   1261 
   1262 void
   1263 cons_fix_new_hppa (fragS *frag, int where, int size, expressionS *exp,
   1264 		   int hppa_field_selector)
   1265 {
   1266   unsigned int rel_type;
   1267 
   1268   /* Get a base relocation type.  */
   1269   if (is_DP_relative (*exp))
   1270     rel_type = R_HPPA_GOTOFF;
   1271   else if (is_PC_relative (*exp))
   1272     rel_type = R_HPPA_PCREL_CALL;
   1273 #ifdef OBJ_ELF
   1274   else if (is_SB_relative (*exp))
   1275     rel_type = R_PARISC_SEGREL32;
   1276   else if (is_tls_gdidx (*exp))
   1277     rel_type = R_PARISC_TLS_GD21L;
   1278   else if (is_tls_ldidx (*exp))
   1279     rel_type = R_PARISC_TLS_LDM21L;
   1280   else if (is_tls_dtpoff (*exp))
   1281     rel_type = R_PARISC_TLS_LDO21L;
   1282   else if (is_tls_ieoff (*exp))
   1283     rel_type = R_PARISC_TLS_IE21L;
   1284   else if (is_tls_leoff (*exp))
   1285     rel_type = R_PARISC_TLS_LE21L;
   1286 #endif
   1287   else if (is_complex (*exp))
   1288     rel_type = R_HPPA_COMPLEX;
   1289   else
   1290     rel_type = R_HPPA;
   1291 
   1292   if (hppa_field_selector != e_psel && hppa_field_selector != e_fsel)
   1293     {
   1294       as_warn (_("Invalid field selector.  Assuming F%%."));
   1295       hppa_field_selector = e_fsel;
   1296     }
   1297 
   1298   fix_new_hppa (frag, where, size,
   1299 		(symbolS *) NULL, (offsetT) 0, exp, 0, rel_type,
   1300 		hppa_field_selector, size * 8, 0, 0);
   1301 }
   1302 
   1303 /* Mark (via expr_end) the end of an expression (I think).  FIXME.  */
   1304 
   1305 static void
   1306 get_expression (char *str)
   1307 {
   1308   char *save_in;
   1309   asection *seg;
   1310 
   1311   save_in = input_line_pointer;
   1312   input_line_pointer = str;
   1313   seg = expression (&the_insn.exp);
   1314   if (!(seg == absolute_section
   1315 	|| seg == undefined_section
   1316 	|| SEG_NORMAL (seg)))
   1317     {
   1318       as_warn (_("Bad segment in expression."));
   1319       expr_end = input_line_pointer;
   1320       input_line_pointer = save_in;
   1321       return;
   1322     }
   1323   expr_end = input_line_pointer;
   1324   input_line_pointer = save_in;
   1325 }
   1326 
   1327 /* Parse a PA nullification completer (,n).  Return nonzero if the
   1328    completer was found; return zero if no completer was found.  */
   1329 
   1330 static int
   1331 pa_parse_nullif (char **s)
   1332 {
   1333   int nullif;
   1334 
   1335   nullif = 0;
   1336   if (**s == ',')
   1337     {
   1338       *s = *s + 1;
   1339       if (strncasecmp (*s, "n", 1) == 0)
   1340 	nullif = 1;
   1341       else
   1342 	{
   1343 	  as_bad (_("Invalid Nullification: (%c)"), **s);
   1344 	  nullif = 0;
   1345 	}
   1346       *s = *s + 1;
   1347     }
   1348 
   1349   return nullif;
   1350 }
   1351 
   1352 char *
   1353 md_atof (int type, char *litP, int *sizeP)
   1354 {
   1355   return ieee_md_atof (type, litP, sizeP, TRUE);
   1356 }
   1357 
   1358 /* Write out big-endian.  */
   1359 
   1360 void
   1361 md_number_to_chars (char *buf, valueT val, int n)
   1362 {
   1363   number_to_chars_bigendian (buf, val, n);
   1364 }
   1365 
   1366 /* Translate internal representation of relocation info to BFD target
   1367    format.  */
   1368 
   1369 arelent **
   1370 tc_gen_reloc (asection *section, fixS *fixp)
   1371 {
   1372   arelent *reloc;
   1373   struct hppa_fix_struct *hppa_fixp;
   1374   static arelent *no_relocs = NULL;
   1375   arelent **relocs;
   1376   reloc_type **codes;
   1377   reloc_type code;
   1378   int n_relocs;
   1379   int i;
   1380 
   1381   hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data;
   1382   if (fixp->fx_addsy == 0)
   1383     return &no_relocs;
   1384 
   1385   gas_assert (hppa_fixp != 0);
   1386   gas_assert (section != 0);
   1387 
   1388   reloc = xmalloc (sizeof (arelent));
   1389 
   1390   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1391   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1392 
   1393   /* Allow fixup_segment to recognize hand-written pc-relative relocations.
   1394      When we went through cons_fix_new_hppa, we classified them as complex.  */
   1395   /* ??? It might be better to hide this +8 stuff in tc_cfi_emit_pcrel_expr,
   1396      undefine DIFF_EXPR_OK, and let these sorts of complex expressions fail
   1397      when R_HPPA_COMPLEX == R_PARISC_UNIMPLEMENTED.  */
   1398   if (fixp->fx_r_type == (bfd_reloc_code_real_type) R_HPPA_COMPLEX
   1399       && fixp->fx_pcrel)
   1400     {
   1401       fixp->fx_r_type = R_HPPA_PCREL_CALL;
   1402       fixp->fx_offset += 8;
   1403     }
   1404 
   1405   codes = hppa_gen_reloc_type (stdoutput,
   1406 			       fixp->fx_r_type,
   1407 			       hppa_fixp->fx_r_format,
   1408 			       hppa_fixp->fx_r_field,
   1409 			       fixp->fx_subsy != NULL,
   1410 			       symbol_get_bfdsym (fixp->fx_addsy));
   1411 
   1412   if (codes == NULL)
   1413     {
   1414       as_bad_where (fixp->fx_file, fixp->fx_line, _("Cannot handle fixup"));
   1415       abort ();
   1416     }
   1417 
   1418   for (n_relocs = 0; codes[n_relocs]; n_relocs++)
   1419     ;
   1420 
   1421   relocs = xmalloc (sizeof (arelent *) * n_relocs + 1);
   1422   reloc = xmalloc (sizeof (arelent) * n_relocs);
   1423   for (i = 0; i < n_relocs; i++)
   1424     relocs[i] = &reloc[i];
   1425 
   1426   relocs[n_relocs] = NULL;
   1427 
   1428 #ifdef OBJ_ELF
   1429   switch (fixp->fx_r_type)
   1430     {
   1431     default:
   1432       gas_assert (n_relocs == 1);
   1433 
   1434       code = *codes[0];
   1435 
   1436       /* Now, do any processing that is dependent on the relocation type.  */
   1437       switch (code)
   1438 	{
   1439 	case R_PARISC_DLTREL21L:
   1440 	case R_PARISC_DLTREL14R:
   1441 	case R_PARISC_DLTREL14F:
   1442 	case R_PARISC_PLABEL32:
   1443 	case R_PARISC_PLABEL21L:
   1444 	case R_PARISC_PLABEL14R:
   1445 	  /* For plabel relocations, the addend of the
   1446 	     relocation should be either 0 (no static link) or 2
   1447 	     (static link required).  This adjustment is done in
   1448 	     bfd/elf32-hppa.c:elf32_hppa_relocate_section.
   1449 
   1450 	     We also slam a zero addend into the DLT relative relocs;
   1451 	     it doesn't make a lot of sense to use any addend since
   1452 	     it gets you a different (eg unknown) DLT entry.  */
   1453 	  reloc->addend = 0;
   1454 	  break;
   1455 
   1456 #ifdef ELF_ARG_RELOC
   1457 	case R_PARISC_PCREL17R:
   1458 	case R_PARISC_PCREL17F:
   1459 	case R_PARISC_PCREL17C:
   1460 	case R_PARISC_DIR17R:
   1461 	case R_PARISC_DIR17F:
   1462 	case R_PARISC_PCREL21L:
   1463 	case R_PARISC_DIR21L:
   1464 	  reloc->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc,
   1465 					 fixp->fx_offset);
   1466 	  break;
   1467 #endif
   1468 
   1469 	case R_PARISC_DIR32:
   1470 	  /* Facilitate hand-crafted unwind info.  */
   1471 	  if (strcmp (section->name, UNWIND_SECTION_NAME) == 0)
   1472 	    code = R_PARISC_SEGREL32;
   1473 	  /* Fall thru */
   1474 
   1475 	default:
   1476 	  reloc->addend = fixp->fx_offset;
   1477 	  break;
   1478 	}
   1479 
   1480       reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1481       *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1482       reloc->howto = bfd_reloc_type_lookup (stdoutput,
   1483 					    (bfd_reloc_code_real_type) code);
   1484       reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1485 
   1486       gas_assert (reloc->howto && (unsigned int) code == reloc->howto->type);
   1487       break;
   1488     }
   1489 #else /* OBJ_SOM */
   1490 
   1491   /* Walk over reach relocation returned by the BFD backend.  */
   1492   for (i = 0; i < n_relocs; i++)
   1493     {
   1494       code = *codes[i];
   1495 
   1496       relocs[i]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1497       *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1498       relocs[i]->howto =
   1499 	bfd_reloc_type_lookup (stdoutput,
   1500 			       (bfd_reloc_code_real_type) code);
   1501       relocs[i]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1502 
   1503       switch (code)
   1504 	{
   1505 	case R_COMP2:
   1506 	  /* The only time we ever use a R_COMP2 fixup is for the difference
   1507 	     of two symbols.  With that in mind we fill in all four
   1508 	     relocs now and break out of the loop.  */
   1509 	  gas_assert (i == 1);
   1510 	  relocs[0]->sym_ptr_ptr
   1511 	    = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
   1512 	  relocs[0]->howto
   1513 	    = bfd_reloc_type_lookup (stdoutput,
   1514 				     (bfd_reloc_code_real_type) *codes[0]);
   1515 	  relocs[0]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1516 	  relocs[0]->addend = 0;
   1517 	  relocs[1]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1518 	  *relocs[1]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1519 	  relocs[1]->howto
   1520 	    = bfd_reloc_type_lookup (stdoutput,
   1521 				     (bfd_reloc_code_real_type) *codes[1]);
   1522 	  relocs[1]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1523 	  relocs[1]->addend = 0;
   1524 	  relocs[2]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1525 	  *relocs[2]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy);
   1526 	  relocs[2]->howto
   1527 	    = bfd_reloc_type_lookup (stdoutput,
   1528 				     (bfd_reloc_code_real_type) *codes[2]);
   1529 	  relocs[2]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1530 	  relocs[2]->addend = 0;
   1531 	  relocs[3]->sym_ptr_ptr
   1532 	    = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
   1533 	  relocs[3]->howto
   1534 	    = bfd_reloc_type_lookup (stdoutput,
   1535 				     (bfd_reloc_code_real_type) *codes[3]);
   1536 	  relocs[3]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1537 	  relocs[3]->addend = 0;
   1538 	  relocs[4]->sym_ptr_ptr
   1539 	    = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
   1540 	  relocs[4]->howto
   1541 	    = bfd_reloc_type_lookup (stdoutput,
   1542 				     (bfd_reloc_code_real_type) *codes[4]);
   1543 	  relocs[4]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1544 	  relocs[4]->addend = 0;
   1545 	  goto done;
   1546 	case R_PCREL_CALL:
   1547 	case R_ABS_CALL:
   1548 	  relocs[i]->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc, 0);
   1549 	  break;
   1550 
   1551 	case R_DLT_REL:
   1552 	case R_DATA_PLABEL:
   1553 	case R_CODE_PLABEL:
   1554 	  /* For plabel relocations, the addend of the
   1555 	     relocation should be either 0 (no static link) or 2
   1556 	     (static link required).
   1557 
   1558 	     FIXME: We always assume no static link!
   1559 
   1560 	     We also slam a zero addend into the DLT relative relocs;
   1561 	     it doesn't make a lot of sense to use any addend since
   1562 	     it gets you a different (eg unknown) DLT entry.  */
   1563 	  relocs[i]->addend = 0;
   1564 	  break;
   1565 
   1566 	case R_N_MODE:
   1567 	case R_S_MODE:
   1568 	case R_D_MODE:
   1569 	case R_R_MODE:
   1570 	case R_FSEL:
   1571 	case R_LSEL:
   1572 	case R_RSEL:
   1573 	case R_BEGIN_BRTAB:
   1574 	case R_END_BRTAB:
   1575 	case R_BEGIN_TRY:
   1576 	case R_N0SEL:
   1577 	case R_N1SEL:
   1578 	  /* There is no symbol or addend associated with these fixups.  */
   1579 	  relocs[i]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1580 	  *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
   1581 	  relocs[i]->addend = 0;
   1582 	  break;
   1583 
   1584 	case R_END_TRY:
   1585 	case R_ENTRY:
   1586 	case R_EXIT:
   1587 	  /* There is no symbol associated with these fixups.  */
   1588 	  relocs[i]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1589 	  *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
   1590 	  relocs[i]->addend = fixp->fx_offset;
   1591 	  break;
   1592 
   1593 	default:
   1594 	  relocs[i]->addend = fixp->fx_offset;
   1595 	}
   1596     }
   1597 
   1598  done:
   1599 #endif
   1600 
   1601   return relocs;
   1602 }
   1603 
   1604 /* Process any machine dependent frag types.  */
   1605 
   1606 void
   1607 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
   1608 		 asection *sec ATTRIBUTE_UNUSED,
   1609 		 fragS *fragP)
   1610 {
   1611   unsigned int address;
   1612 
   1613   if (fragP->fr_type == rs_machine_dependent)
   1614     {
   1615       switch ((int) fragP->fr_subtype)
   1616 	{
   1617 	case 0:
   1618 	  fragP->fr_type = rs_fill;
   1619 	  know (fragP->fr_var == 1);
   1620 	  know (fragP->fr_next);
   1621 	  address = fragP->fr_address + fragP->fr_fix;
   1622 	  if (address % fragP->fr_offset)
   1623 	    {
   1624 	      fragP->fr_offset =
   1625 		fragP->fr_next->fr_address
   1626 		- fragP->fr_address
   1627 		- fragP->fr_fix;
   1628 	    }
   1629 	  else
   1630 	    fragP->fr_offset = 0;
   1631 	  break;
   1632 	}
   1633     }
   1634 }
   1635 
   1636 /* Round up a section size to the appropriate boundary.  */
   1637 
   1638 valueT
   1639 md_section_align (asection *segment, valueT size)
   1640 {
   1641   int align = bfd_get_section_alignment (stdoutput, segment);
   1642   int align2 = (1 << align) - 1;
   1643 
   1644   return (size + align2) & ~align2;
   1645 }
   1646 
   1647 /* Return the approximate size of a frag before relaxation has occurred.  */
   1648 
   1649 int
   1650 md_estimate_size_before_relax (fragS *fragP, asection *segment ATTRIBUTE_UNUSED)
   1651 {
   1652   int size;
   1653 
   1654   size = 0;
   1655 
   1656   while ((fragP->fr_fix + size) % fragP->fr_offset)
   1657     size++;
   1658 
   1659   return size;
   1660 }
   1661 
   1662 #ifdef OBJ_ELF
   1664 # ifdef WARN_COMMENTS
   1665 const char *md_shortopts = "Vc";
   1666 # else
   1667 const char *md_shortopts = "V";
   1668 # endif
   1669 #else
   1670 # ifdef WARN_COMMENTS
   1671 const char *md_shortopts = "c";
   1672 # else
   1673 const char *md_shortopts = "";
   1674 # endif
   1675 #endif
   1676 
   1677 struct option md_longopts[] =
   1678 {
   1679 #ifdef WARN_COMMENTS
   1680   {"warn-comment", no_argument, NULL, 'c'},
   1681 #endif
   1682   {NULL, no_argument, NULL, 0}
   1683 };
   1684 size_t md_longopts_size = sizeof (md_longopts);
   1685 
   1686 int
   1687 md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
   1688 {
   1689   switch (c)
   1690     {
   1691     default:
   1692       return 0;
   1693 
   1694 #ifdef OBJ_ELF
   1695     case 'V':
   1696       print_version_id ();
   1697       break;
   1698 #endif
   1699 #ifdef WARN_COMMENTS
   1700     case 'c':
   1701       warn_comment = 1;
   1702       break;
   1703 #endif
   1704     }
   1705 
   1706   return 1;
   1707 }
   1708 
   1709 void
   1710 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
   1711 {
   1712 #ifdef OBJ_ELF
   1713   fprintf (stream, _("\
   1714   -Q                      ignored\n"));
   1715 #endif
   1716 #ifdef WARN_COMMENTS
   1717   fprintf (stream, _("\
   1718   -c                      print a warning if a comment is found\n"));
   1719 #endif
   1720 }
   1721 
   1722 /* We have no need to default values of symbols.  */
   1724 
   1725 symbolS *
   1726 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
   1727 {
   1728   return NULL;
   1729 }
   1730 
   1731 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
   1732 #define nonzero_dibits(x) \
   1733   ((x) | (((x) & 0x55555555) << 1) | (((x) & 0xAAAAAAAA) >> 1))
   1734 #define arg_reloc_stub_needed(CALLER, CALLEE) \
   1735   (((CALLER) ^ (CALLEE)) & nonzero_dibits (CALLER) & nonzero_dibits (CALLEE))
   1736 #else
   1737 #define arg_reloc_stub_needed(CALLER, CALLEE) 0
   1738 #endif
   1739 
   1740 /* Apply a fixup to an instruction.  */
   1741 
   1742 void
   1743 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
   1744 {
   1745   char *fixpos;
   1746   struct hppa_fix_struct *hppa_fixP;
   1747   offsetT new_val;
   1748   int insn, val, fmt;
   1749 
   1750   /* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can
   1751      never be "applied" (they are just markers).  Likewise for
   1752      R_HPPA_BEGIN_BRTAB and R_HPPA_END_BRTAB.  */
   1753 #ifdef OBJ_SOM
   1754   if (fixP->fx_r_type == R_HPPA_ENTRY
   1755       || fixP->fx_r_type == R_HPPA_EXIT
   1756       || fixP->fx_r_type == R_HPPA_BEGIN_BRTAB
   1757       || fixP->fx_r_type == R_HPPA_END_BRTAB
   1758       || fixP->fx_r_type == R_HPPA_BEGIN_TRY)
   1759     return;
   1760 
   1761   /* Disgusting.  We must set fx_offset ourselves -- R_HPPA_END_TRY
   1762      fixups are considered not adjustable, which in turn causes
   1763      adjust_reloc_syms to not set fx_offset.  Ugh.  */
   1764   if (fixP->fx_r_type == R_HPPA_END_TRY)
   1765     {
   1766       fixP->fx_offset = * valP;
   1767       return;
   1768     }
   1769 #endif
   1770 #ifdef OBJ_ELF
   1771   if (fixP->fx_r_type == (int) R_PARISC_GNU_VTENTRY
   1772       || fixP->fx_r_type == (int) R_PARISC_GNU_VTINHERIT)
   1773     return;
   1774 #endif
   1775 
   1776   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
   1777     fixP->fx_done = 1;
   1778 
   1779   /* There should be a HPPA specific fixup associated with the GAS fixup.  */
   1780   hppa_fixP = (struct hppa_fix_struct *) fixP->tc_fix_data;
   1781   if (hppa_fixP == NULL)
   1782     {
   1783       as_bad_where (fixP->fx_file, fixP->fx_line,
   1784 		    _("no hppa_fixup entry for fixup type 0x%x"),
   1785 		    fixP->fx_r_type);
   1786       return;
   1787     }
   1788 
   1789   fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
   1790 
   1791   if (fixP->fx_size != 4 || hppa_fixP->fx_r_format == 32)
   1792     {
   1793       /* Handle constant output. */
   1794       number_to_chars_bigendian (fixpos, *valP, fixP->fx_size);
   1795       return;
   1796     }
   1797 
   1798   insn = bfd_get_32 (stdoutput, fixpos);
   1799   fmt = bfd_hppa_insn2fmt (stdoutput, insn);
   1800 
   1801   /* If there is a symbol associated with this fixup, then it's something
   1802      which will need a SOM relocation (except for some PC-relative relocs).
   1803      In such cases we should treat the "val" or "addend" as zero since it
   1804      will be added in as needed from fx_offset in tc_gen_reloc.  */
   1805   if ((fixP->fx_addsy != NULL
   1806        || fixP->fx_r_type == (int) R_HPPA_NONE)
   1807 #ifdef OBJ_SOM
   1808       && fmt != 32
   1809 #endif
   1810       )
   1811     new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0);
   1812 #ifdef OBJ_SOM
   1813   /* These field selectors imply that we do not want an addend.  */
   1814   else if (hppa_fixP->fx_r_field == e_psel
   1815 	   || hppa_fixP->fx_r_field == e_rpsel
   1816 	   || hppa_fixP->fx_r_field == e_lpsel
   1817 	   || hppa_fixP->fx_r_field == e_tsel
   1818 	   || hppa_fixP->fx_r_field == e_rtsel
   1819 	   || hppa_fixP->fx_r_field == e_ltsel)
   1820     new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0);
   1821 #endif
   1822   else
   1823     new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field);
   1824 
   1825   /* Handle pc-relative exceptions from above.  */
   1826   if ((fmt == 12 || fmt == 17 || fmt == 22)
   1827       && fixP->fx_addsy
   1828       && fixP->fx_pcrel
   1829       && !arg_reloc_stub_needed (symbol_arg_reloc_info (fixP->fx_addsy),
   1830 				 hppa_fixP->fx_arg_reloc)
   1831 #ifdef OBJ_ELF
   1832       && (* valP - 8 + 8192 < 16384
   1833 	  || (fmt == 17 && * valP - 8 + 262144 < 524288)
   1834 	  || (fmt == 22 && * valP - 8 + 8388608 < 16777216))
   1835 #endif
   1836 #ifdef OBJ_SOM
   1837       && (* valP - 8 + 262144 < 524288
   1838 	  || (fmt == 22 && * valP - 8 + 8388608 < 16777216))
   1839 #endif
   1840       && !S_IS_EXTERNAL (fixP->fx_addsy)
   1841       && !S_IS_WEAK (fixP->fx_addsy)
   1842       && S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment
   1843       && !(fixP->fx_subsy
   1844 	   && S_GET_SEGMENT (fixP->fx_subsy) != hppa_fixP->segment))
   1845     {
   1846       new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field);
   1847     }
   1848 
   1849   switch (fmt)
   1850     {
   1851     case 10:
   1852       CHECK_FIELD_WHERE (new_val, 8191, -8192,
   1853 			 fixP->fx_file, fixP->fx_line);
   1854       val = new_val;
   1855 
   1856       insn = (insn & ~ 0x3ff1) | (((val & 0x1ff8) << 1)
   1857 				  | ((val & 0x2000) >> 13));
   1858       break;
   1859     case -11:
   1860       CHECK_FIELD_WHERE (new_val, 8191, -8192,
   1861 			 fixP->fx_file, fixP->fx_line);
   1862       val = new_val;
   1863 
   1864       insn = (insn & ~ 0x3ff9) | (((val & 0x1ffc) << 1)
   1865 				  | ((val & 0x2000) >> 13));
   1866       break;
   1867       /* Handle all opcodes with the 'j' operand type.  */
   1868     case 14:
   1869       CHECK_FIELD_WHERE (new_val, 8191, -8192,
   1870 			 fixP->fx_file, fixP->fx_line);
   1871       val = new_val;
   1872 
   1873       insn = ((insn & ~ 0x3fff) | low_sign_unext (val, 14));
   1874       break;
   1875 
   1876       /* Handle all opcodes with the 'k' operand type.  */
   1877     case 21:
   1878       CHECK_FIELD_WHERE (new_val, 1048575, -1048576,
   1879 			 fixP->fx_file, fixP->fx_line);
   1880       val = new_val;
   1881 
   1882       insn = (insn & ~ 0x1fffff) | re_assemble_21 (val);
   1883       break;
   1884 
   1885       /* Handle all the opcodes with the 'i' operand type.  */
   1886     case 11:
   1887       CHECK_FIELD_WHERE (new_val, 1023, -1024,
   1888 			 fixP->fx_file, fixP->fx_line);
   1889       val = new_val;
   1890 
   1891       insn = (insn & ~ 0x7ff) | low_sign_unext (val, 11);
   1892       break;
   1893 
   1894       /* Handle all the opcodes with the 'w' operand type.  */
   1895     case 12:
   1896       CHECK_FIELD_WHERE (new_val - 8, 8191, -8192,
   1897 			 fixP->fx_file, fixP->fx_line);
   1898       val = new_val - 8;
   1899 
   1900       insn = (insn & ~ 0x1ffd) | re_assemble_12 (val >> 2);
   1901       break;
   1902 
   1903       /* Handle some of the opcodes with the 'W' operand type.  */
   1904     case 17:
   1905       {
   1906 	offsetT distance = * valP;
   1907 
   1908 	/* If this is an absolute branch (ie no link) with an out of
   1909 	   range target, then we want to complain.  */
   1910 	if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL
   1911 	    && (insn & 0xffe00000) == 0xe8000000)
   1912 	  CHECK_FIELD_WHERE (distance - 8, 262143, -262144,
   1913 			     fixP->fx_file, fixP->fx_line);
   1914 
   1915 	CHECK_FIELD_WHERE (new_val - 8, 262143, -262144,
   1916 			   fixP->fx_file, fixP->fx_line);
   1917 	val = new_val - 8;
   1918 
   1919 	insn = (insn & ~ 0x1f1ffd) | re_assemble_17 (val >> 2);
   1920 	break;
   1921       }
   1922 
   1923     case 22:
   1924       {
   1925 	offsetT distance = * valP;
   1926 
   1927 	/* If this is an absolute branch (ie no link) with an out of
   1928 	   range target, then we want to complain.  */
   1929 	if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL
   1930 	    && (insn & 0xffe00000) == 0xe8000000)
   1931 	  CHECK_FIELD_WHERE (distance - 8, 8388607, -8388608,
   1932 			     fixP->fx_file, fixP->fx_line);
   1933 
   1934 	CHECK_FIELD_WHERE (new_val - 8, 8388607, -8388608,
   1935 			   fixP->fx_file, fixP->fx_line);
   1936 	val = new_val - 8;
   1937 
   1938 	insn = (insn & ~ 0x3ff1ffd) | re_assemble_22 (val >> 2);
   1939 	break;
   1940       }
   1941 
   1942     case -10:
   1943       val = new_val;
   1944       insn = (insn & ~ 0xfff1) | re_assemble_16 (val & -8);
   1945       break;
   1946 
   1947     case -16:
   1948       val = new_val;
   1949       insn = (insn & ~ 0xfff9) | re_assemble_16 (val & -4);
   1950       break;
   1951 
   1952     case 16:
   1953       val = new_val;
   1954       insn = (insn & ~ 0xffff) | re_assemble_16 (val);
   1955       break;
   1956 
   1957     case 32:
   1958       insn = new_val;
   1959       break;
   1960 
   1961     default:
   1962       as_bad_where (fixP->fx_file, fixP->fx_line,
   1963 		    _("Unknown relocation encountered in md_apply_fix."));
   1964       return;
   1965     }
   1966 
   1967 #ifdef OBJ_ELF
   1968   switch (fixP->fx_r_type)
   1969     {
   1970       case R_PARISC_TLS_GD21L:
   1971       case R_PARISC_TLS_GD14R:
   1972       case R_PARISC_TLS_LDM21L:
   1973       case R_PARISC_TLS_LDM14R:
   1974       case R_PARISC_TLS_LE21L:
   1975       case R_PARISC_TLS_LE14R:
   1976       case R_PARISC_TLS_IE21L:
   1977       case R_PARISC_TLS_IE14R:
   1978 	if (fixP->fx_addsy)
   1979 	  S_SET_THREAD_LOCAL (fixP->fx_addsy);
   1980 	break;
   1981       default:
   1982 	break;
   1983     }
   1984 #endif
   1985 
   1986   /* Insert the relocation.  */
   1987   bfd_put_32 (stdoutput, insn, fixpos);
   1988 }
   1989 
   1990 /* Exactly what point is a PC-relative offset relative TO?
   1991    On the PA, they're relative to the address of the offset.  */
   1992 
   1993 long
   1994 md_pcrel_from (fixS *fixP)
   1995 {
   1996   return fixP->fx_where + fixP->fx_frag->fr_address;
   1997 }
   1998 
   1999 /* Return nonzero if the input line pointer is at the end of
   2000    a statement.  */
   2001 
   2002 static int
   2003 is_end_of_statement (void)
   2004 {
   2005   return ((*input_line_pointer == '\n')
   2006 	  || (*input_line_pointer == ';')
   2007 	  || (*input_line_pointer == '!'));
   2008 }
   2009 
   2010 #define REG_NAME_CNT	(sizeof (pre_defined_registers) / sizeof (struct pd_reg))
   2011 
   2012 /* Given NAME, find the register number associated with that name, return
   2013    the integer value associated with the given name or -1 on failure.  */
   2014 
   2015 static int
   2016 reg_name_search (char *name)
   2017 {
   2018   int middle, low, high;
   2019   int cmp;
   2020 
   2021   low = 0;
   2022   high = REG_NAME_CNT - 1;
   2023 
   2024   do
   2025     {
   2026       middle = (low + high) / 2;
   2027       cmp = strcasecmp (name, pre_defined_registers[middle].name);
   2028       if (cmp < 0)
   2029 	high = middle - 1;
   2030       else if (cmp > 0)
   2031 	low = middle + 1;
   2032       else
   2033 	return pre_defined_registers[middle].value;
   2034     }
   2035   while (low <= high);
   2036 
   2037   return -1;
   2038 }
   2039 
   2040 /* Read a number from S.  The number might come in one of many forms,
   2041    the most common will be a hex or decimal constant, but it could be
   2042    a pre-defined register (Yuk!), or an absolute symbol.
   2043 
   2044    Return 1 on success or 0 on failure.  If STRICT, then a missing
   2045    register prefix will cause a failure.  The number itself is
   2046    returned in `pa_number'.
   2047 
   2048    IS_FLOAT indicates that a PA-89 FP register number should be
   2049    parsed;  A `l' or `r' suffix is checked for if but 2 of IS_FLOAT is
   2050    not set.
   2051 
   2052    pa_parse_number can not handle negative constants and will fail
   2053    horribly if it is passed such a constant.  */
   2054 
   2055 static int
   2056 pa_parse_number (char **s, int is_float)
   2057 {
   2058   int num;
   2059   char *name;
   2060   char c;
   2061   symbolS *sym;
   2062   int status;
   2063   char *p = *s;
   2064   bfd_boolean have_prefix;
   2065 
   2066   /* Skip whitespace before the number.  */
   2067   while (*p == ' ' || *p == '\t')
   2068     p = p + 1;
   2069 
   2070   pa_number = -1;
   2071   have_prefix = 0;
   2072   num = 0;
   2073   if (!strict && ISDIGIT (*p))
   2074     {
   2075       /* Looks like a number.  */
   2076 
   2077       if (*p == '0' && (*(p + 1) == 'x' || *(p + 1) == 'X'))
   2078 	{
   2079 	  /* The number is specified in hex.  */
   2080 	  p += 2;
   2081 	  while (ISDIGIT (*p) || ((*p >= 'a') && (*p <= 'f'))
   2082 		 || ((*p >= 'A') && (*p <= 'F')))
   2083 	    {
   2084 	      if (ISDIGIT (*p))
   2085 		num = num * 16 + *p - '0';
   2086 	      else if (*p >= 'a' && *p <= 'f')
   2087 		num = num * 16 + *p - 'a' + 10;
   2088 	      else
   2089 		num = num * 16 + *p - 'A' + 10;
   2090 	      ++p;
   2091 	    }
   2092 	}
   2093       else
   2094 	{
   2095 	  /* The number is specified in decimal.  */
   2096 	  while (ISDIGIT (*p))
   2097 	    {
   2098 	      num = num * 10 + *p - '0';
   2099 	      ++p;
   2100 	    }
   2101 	}
   2102 
   2103       pa_number = num;
   2104 
   2105       /* Check for a `l' or `r' suffix.  */
   2106       if (is_float)
   2107 	{
   2108 	  pa_number += FP_REG_BASE;
   2109 	  if (! (is_float & 2))
   2110 	    {
   2111 	      if (IS_R_SELECT (p))
   2112 		{
   2113 		  pa_number += FP_REG_RSEL;
   2114 		  ++p;
   2115 		}
   2116 	      else if (IS_L_SELECT (p))
   2117 		{
   2118 		  ++p;
   2119 		}
   2120 	    }
   2121 	}
   2122     }
   2123   else if (*p == '%')
   2124     {
   2125       /* The number might be a predefined register.  */
   2126       have_prefix = 1;
   2127       name = p;
   2128       p++;
   2129       c = *p;
   2130       /* Tege hack: Special case for general registers as the general
   2131 	 code makes a binary search with case translation, and is VERY
   2132 	 slow.  */
   2133       if (c == 'r')
   2134 	{
   2135 	  p++;
   2136 	  if (*p == 'e' && *(p + 1) == 't'
   2137 	      && (*(p + 2) == '0' || *(p + 2) == '1'))
   2138 	    {
   2139 	      p += 2;
   2140 	      num = *p - '0' + 28;
   2141 	      p++;
   2142 	    }
   2143 	  else if (*p == 'p')
   2144 	    {
   2145 	      num = 2;
   2146 	      p++;
   2147 	    }
   2148 	  else if (!ISDIGIT (*p))
   2149 	    {
   2150 	      if (print_errors)
   2151 		as_bad (_("Undefined register: '%s'."), name);
   2152 	      num = -1;
   2153 	    }
   2154 	  else
   2155 	    {
   2156 	      do
   2157 		num = num * 10 + *p++ - '0';
   2158 	      while (ISDIGIT (*p));
   2159 	    }
   2160 	}
   2161       else
   2162 	{
   2163 	  /* Do a normal register search.  */
   2164 	  while (is_part_of_name (c))
   2165 	    {
   2166 	      p = p + 1;
   2167 	      c = *p;
   2168 	    }
   2169 	  *p = 0;
   2170 	  status = reg_name_search (name);
   2171 	  if (status >= 0)
   2172 	    num = status;
   2173 	  else
   2174 	    {
   2175 	      if (print_errors)
   2176 		as_bad (_("Undefined register: '%s'."), name);
   2177 	      num = -1;
   2178 	    }
   2179 	  *p = c;
   2180 	}
   2181 
   2182       pa_number = num;
   2183     }
   2184   else
   2185     {
   2186       /* And finally, it could be a symbol in the absolute section which
   2187 	 is effectively a constant, or a register alias symbol.  */
   2188       name = p;
   2189       c = *p;
   2190       while (is_part_of_name (c))
   2191 	{
   2192 	  p = p + 1;
   2193 	  c = *p;
   2194 	}
   2195       *p = 0;
   2196       if ((sym = symbol_find (name)) != NULL)
   2197 	{
   2198 	  if (S_GET_SEGMENT (sym) == reg_section)
   2199 	    {
   2200 	      num = S_GET_VALUE (sym);
   2201 	      /* Well, we don't really have one, but we do have a
   2202 		 register, so...  */
   2203 	      have_prefix = TRUE;
   2204 	    }
   2205 	  else if (S_GET_SEGMENT (sym) == bfd_abs_section_ptr)
   2206 	    num = S_GET_VALUE (sym);
   2207 	  else if (!strict)
   2208 	    {
   2209 	      if (print_errors)
   2210 		as_bad (_("Non-absolute symbol: '%s'."), name);
   2211 	      num = -1;
   2212 	    }
   2213 	}
   2214       else if (!strict)
   2215 	{
   2216 	  /* There is where we'd come for an undefined symbol
   2217 	     or for an empty string.  For an empty string we
   2218 	     will return zero.  That's a concession made for
   2219 	     compatibility with the braindamaged HP assemblers.  */
   2220 	  if (*name == 0)
   2221 	    num = 0;
   2222 	  else
   2223 	    {
   2224 	      if (print_errors)
   2225 		as_bad (_("Undefined absolute constant: '%s'."), name);
   2226 	      num = -1;
   2227 	    }
   2228 	}
   2229       *p = c;
   2230 
   2231       pa_number = num;
   2232     }
   2233 
   2234   if (!strict || have_prefix)
   2235     {
   2236       *s = p;
   2237       return 1;
   2238     }
   2239   return 0;
   2240 }
   2241 
   2242 /* Return nonzero if the given INSN and L/R information will require
   2243    a new PA-1.1 opcode.  */
   2244 
   2245 static int
   2246 need_pa11_opcode (void)
   2247 {
   2248   if ((pa_number & FP_REG_RSEL) != 0
   2249       && !(the_insn.fpof1 == DBL && the_insn.fpof2 == DBL))
   2250     {
   2251       /* If this instruction is specific to a particular architecture,
   2252 	 then set a new architecture.  */
   2253       if (bfd_get_mach (stdoutput) < pa11)
   2254 	{
   2255 	  if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, pa11))
   2256 	    as_warn (_("could not update architecture and machine"));
   2257 	}
   2258       return TRUE;
   2259     }
   2260   else
   2261     return FALSE;
   2262 }
   2263 
   2264 /* Parse a condition for a fcmp instruction.  Return the numerical
   2265    code associated with the condition.  */
   2266 
   2267 static int
   2268 pa_parse_fp_cmp_cond (char **s)
   2269 {
   2270   int cond, i;
   2271 
   2272   cond = 0;
   2273 
   2274   for (i = 0; i < 32; i++)
   2275     {
   2276       if (strncasecmp (*s, fp_cond_map[i].string,
   2277 		       strlen (fp_cond_map[i].string)) == 0)
   2278 	{
   2279 	  cond = fp_cond_map[i].cond;
   2280 	  *s += strlen (fp_cond_map[i].string);
   2281 	  /* If not a complete match, back up the input string and
   2282 	     report an error.  */
   2283 	  if (**s != ' ' && **s != '\t')
   2284 	    {
   2285 	      *s -= strlen (fp_cond_map[i].string);
   2286 	      break;
   2287 	    }
   2288 	  while (**s == ' ' || **s == '\t')
   2289 	    *s = *s + 1;
   2290 	  return cond;
   2291 	}
   2292     }
   2293 
   2294   as_bad (_("Invalid FP Compare Condition: %s"), *s);
   2295 
   2296   /* Advance over the bogus completer.  */
   2297   while (**s != ',' && **s != ' ' && **s != '\t')
   2298     *s += 1;
   2299 
   2300   return 0;
   2301 }
   2302 
   2303 /* Parse a graphics test complete for ftest.  */
   2304 
   2305 static int
   2306 pa_parse_ftest_gfx_completer (char **s)
   2307 {
   2308   int value;
   2309 
   2310   value = 0;
   2311   if (strncasecmp (*s, "acc8", 4) == 0)
   2312     {
   2313       value = 5;
   2314       *s += 4;
   2315     }
   2316   else if (strncasecmp (*s, "acc6", 4) == 0)
   2317     {
   2318       value = 9;
   2319       *s += 4;
   2320     }
   2321   else if (strncasecmp (*s, "acc4", 4) == 0)
   2322     {
   2323       value = 13;
   2324       *s += 4;
   2325     }
   2326   else if (strncasecmp (*s, "acc2", 4) == 0)
   2327     {
   2328       value = 17;
   2329       *s += 4;
   2330     }
   2331   else if (strncasecmp (*s, "acc", 3) == 0)
   2332     {
   2333       value = 1;
   2334       *s += 3;
   2335     }
   2336   else if (strncasecmp (*s, "rej8", 4) == 0)
   2337     {
   2338       value = 6;
   2339       *s += 4;
   2340     }
   2341   else if (strncasecmp (*s, "rej", 3) == 0)
   2342     {
   2343       value = 2;
   2344       *s += 3;
   2345     }
   2346   else
   2347     {
   2348       value = 0;
   2349       as_bad (_("Invalid FTEST completer: %s"), *s);
   2350     }
   2351 
   2352   return value;
   2353 }
   2354 
   2355 /* Parse an FP operand format completer returning the completer
   2356    type.  */
   2357 
   2358 static fp_operand_format
   2359 pa_parse_fp_cnv_format (char **s)
   2360 {
   2361   int format;
   2362 
   2363   format = SGL;
   2364   if (**s == ',')
   2365     {
   2366       *s += 1;
   2367       if (strncasecmp (*s, "sgl", 3) == 0)
   2368 	{
   2369 	  format = SGL;
   2370 	  *s += 4;
   2371 	}
   2372       else if (strncasecmp (*s, "dbl", 3) == 0)
   2373 	{
   2374 	  format = DBL;
   2375 	  *s += 4;
   2376 	}
   2377       else if (strncasecmp (*s, "quad", 4) == 0)
   2378 	{
   2379 	  format = QUAD;
   2380 	  *s += 5;
   2381 	}
   2382       else if (strncasecmp (*s, "w", 1) == 0)
   2383 	{
   2384 	  format = W;
   2385 	  *s += 2;
   2386 	}
   2387       else if (strncasecmp (*s, "uw", 2) == 0)
   2388 	{
   2389 	  format = UW;
   2390 	  *s += 3;
   2391 	}
   2392       else if (strncasecmp (*s, "dw", 2) == 0)
   2393 	{
   2394 	  format = DW;
   2395 	  *s += 3;
   2396 	}
   2397       else if (strncasecmp (*s, "udw", 3) == 0)
   2398 	{
   2399 	  format = UDW;
   2400 	  *s += 4;
   2401 	}
   2402       else if (strncasecmp (*s, "qw", 2) == 0)
   2403 	{
   2404 	  format = QW;
   2405 	  *s += 3;
   2406 	}
   2407       else if (strncasecmp (*s, "uqw", 3) == 0)
   2408 	{
   2409 	  format = UQW;
   2410 	  *s += 4;
   2411 	}
   2412       else
   2413 	{
   2414 	  format = ILLEGAL_FMT;
   2415 	  as_bad (_("Invalid FP Operand Format: %3s"), *s);
   2416 	}
   2417     }
   2418 
   2419   return format;
   2420 }
   2421 
   2422 /* Parse an FP operand format completer returning the completer
   2423    type.  */
   2424 
   2425 static fp_operand_format
   2426 pa_parse_fp_format (char **s)
   2427 {
   2428   int format;
   2429 
   2430   format = SGL;
   2431   if (**s == ',')
   2432     {
   2433       *s += 1;
   2434       if (strncasecmp (*s, "sgl", 3) == 0)
   2435 	{
   2436 	  format = SGL;
   2437 	  *s += 4;
   2438 	}
   2439       else if (strncasecmp (*s, "dbl", 3) == 0)
   2440 	{
   2441 	  format = DBL;
   2442 	  *s += 4;
   2443 	}
   2444       else if (strncasecmp (*s, "quad", 4) == 0)
   2445 	{
   2446 	  format = QUAD;
   2447 	  *s += 5;
   2448 	}
   2449       else
   2450 	{
   2451 	  format = ILLEGAL_FMT;
   2452 	  as_bad (_("Invalid FP Operand Format: %3s"), *s);
   2453 	}
   2454     }
   2455 
   2456   return format;
   2457 }
   2458 
   2459 /* Convert from a selector string into a selector type.  */
   2460 
   2461 static int
   2462 pa_chk_field_selector (char **str)
   2463 {
   2464   int middle, low, high;
   2465   int cmp;
   2466   char name[4];
   2467 
   2468   /* Read past any whitespace.  */
   2469   /* FIXME: should we read past newlines and formfeeds??? */
   2470   while (**str == ' ' || **str == '\t' || **str == '\n' || **str == '\f')
   2471     *str = *str + 1;
   2472 
   2473   if ((*str)[1] == '\'' || (*str)[1] == '%')
   2474     name[0] = TOLOWER ((*str)[0]),
   2475     name[1] = 0;
   2476   else if ((*str)[2] == '\'' || (*str)[2] == '%')
   2477     name[0] = TOLOWER ((*str)[0]),
   2478     name[1] = TOLOWER ((*str)[1]),
   2479     name[2] = 0;
   2480   else if ((*str)[3] == '\'' || (*str)[3] == '%')
   2481     name[0] = TOLOWER ((*str)[0]),
   2482     name[1] = TOLOWER ((*str)[1]),
   2483     name[2] = TOLOWER ((*str)[2]),
   2484     name[3] = 0;
   2485   else
   2486     return e_fsel;
   2487 
   2488   low = 0;
   2489   high = sizeof (selector_table) / sizeof (struct selector_entry) - 1;
   2490 
   2491   do
   2492     {
   2493       middle = (low + high) / 2;
   2494       cmp = strcmp (name, selector_table[middle].prefix);
   2495       if (cmp < 0)
   2496 	high = middle - 1;
   2497       else if (cmp > 0)
   2498 	low = middle + 1;
   2499       else
   2500 	{
   2501 	  *str += strlen (name) + 1;
   2502 #ifndef OBJ_SOM
   2503 	  if (selector_table[middle].field_selector == e_nsel)
   2504 	    return e_fsel;
   2505 #endif
   2506 	  return selector_table[middle].field_selector;
   2507 	}
   2508     }
   2509   while (low <= high);
   2510 
   2511   return e_fsel;
   2512 }
   2513 
   2514 /* Parse a .byte, .word, .long expression for the HPPA.  Called by
   2515    cons via the TC_PARSE_CONS_EXPRESSION macro.  */
   2516 
   2517 int
   2518 parse_cons_expression_hppa (expressionS *exp)
   2519 {
   2520   int hppa_field_selector = pa_chk_field_selector (&input_line_pointer);
   2521   expression (exp);
   2522   return hppa_field_selector;
   2523 }
   2524 
   2525 /* Evaluate an absolute expression EXP which may be modified by
   2526    the selector FIELD_SELECTOR.  Return the value of the expression.  */
   2527 static int
   2528 evaluate_absolute (struct pa_it *insn)
   2529 {
   2530   offsetT value;
   2531   expressionS exp;
   2532   int field_selector = insn->field_selector;
   2533 
   2534   exp = insn->exp;
   2535   value = exp.X_add_number;
   2536 
   2537   return hppa_field_adjust (0, value, field_selector);
   2538 }
   2539 
   2540 /* Mark (via expr_end) the end of an absolute expression.  FIXME.  */
   2541 
   2542 static int
   2543 pa_get_absolute_expression (struct pa_it *insn, char **strp)
   2544 {
   2545   char *save_in;
   2546 
   2547   insn->field_selector = pa_chk_field_selector (strp);
   2548   save_in = input_line_pointer;
   2549   input_line_pointer = *strp;
   2550   expression (&insn->exp);
   2551   expr_end = input_line_pointer;
   2552   input_line_pointer = save_in;
   2553   if (insn->exp.X_op != O_constant)
   2554     {
   2555       /* We have a non-match in strict mode.  */
   2556       if (!strict)
   2557 	as_bad (_("Bad segment (should be absolute)."));
   2558       return 0;
   2559     }
   2560   return evaluate_absolute (insn);
   2561 }
   2562 
   2563 /* Get an absolute number.  The input string is terminated at the
   2564    first whitespace character.  */
   2565 
   2566 static int
   2567 pa_get_number (struct pa_it *insn, char **strp)
   2568 {
   2569   char *save_in;
   2570   char *s, c;
   2571   int result;
   2572 
   2573   save_in = input_line_pointer;
   2574   input_line_pointer = *strp;
   2575 
   2576   /* The PA assembly syntax is ambiguous in a variety of ways.  Consider
   2577      this string "4 %r5"  Is that the number 4 followed by the register
   2578      r5, or is that 4 MOD r5?  This situation occurs for example in the
   2579      coprocessor load and store instructions.  Previously, calling
   2580      pa_get_absolute_expression directly results in r5 being entered
   2581      in the symbol table.
   2582 
   2583      So, when looking for an absolute number, we cut off the input string
   2584      at the first whitespace character.  Thus, expressions should generally
   2585      contain no whitespace.  */
   2586 
   2587   s = *strp;
   2588   while (*s != ',' && *s != ' ' && *s != '\t')
   2589     s++;
   2590 
   2591   c = *s;
   2592   *s = 0;
   2593 
   2594   result = pa_get_absolute_expression (insn, strp);
   2595 
   2596   input_line_pointer = save_in;
   2597   *s = c;
   2598   return result;
   2599 }
   2600 
   2601 /* Given an argument location specification return the associated
   2602    argument location number.  */
   2603 
   2604 static unsigned int
   2605 pa_build_arg_reloc (char *type_name)
   2606 {
   2607 
   2608   if (strncasecmp (type_name, "no", 2) == 0)
   2609     return 0;
   2610   if (strncasecmp (type_name, "gr", 2) == 0)
   2611     return 1;
   2612   else if (strncasecmp (type_name, "fr", 2) == 0)
   2613     return 2;
   2614   else if (strncasecmp (type_name, "fu", 2) == 0)
   2615     return 3;
   2616   else
   2617     as_bad (_("Invalid argument location: %s\n"), type_name);
   2618 
   2619   return 0;
   2620 }
   2621 
   2622 /* Encode and return an argument relocation specification for
   2623    the given register in the location specified by arg_reloc.  */
   2624 
   2625 static unsigned int
   2626 pa_align_arg_reloc (unsigned int reg, unsigned int arg_reloc)
   2627 {
   2628   unsigned int new_reloc;
   2629 
   2630   new_reloc = arg_reloc;
   2631   switch (reg)
   2632     {
   2633     case 0:
   2634       new_reloc <<= 8;
   2635       break;
   2636     case 1:
   2637       new_reloc <<= 6;
   2638       break;
   2639     case 2:
   2640       new_reloc <<= 4;
   2641       break;
   2642     case 3:
   2643       new_reloc <<= 2;
   2644       break;
   2645     default:
   2646       as_bad (_("Invalid argument description: %d"), reg);
   2647     }
   2648 
   2649   return new_reloc;
   2650 }
   2651 
   2652 /* Parse a non-negated compare/subtract completer returning the
   2653    number (for encoding in instructions) of the given completer.  */
   2654 
   2655 static int
   2656 pa_parse_nonneg_cmpsub_cmpltr (char **s)
   2657 {
   2658   int cmpltr;
   2659   char *name = *s + 1;
   2660   char c;
   2661   char *save_s = *s;
   2662   int nullify = 0;
   2663 
   2664   cmpltr = 0;
   2665   if (**s == ',')
   2666     {
   2667       *s += 1;
   2668       while (**s != ',' && **s != ' ' && **s != '\t')
   2669 	*s += 1;
   2670       c = **s;
   2671       **s = 0x00;
   2672 
   2673       if (strcmp (name, "=") == 0)
   2674 	{
   2675 	  cmpltr = 1;
   2676 	}
   2677       else if (strcmp (name, "<") == 0)
   2678 	{
   2679 	  cmpltr = 2;
   2680 	}
   2681       else if (strcmp (name, "<=") == 0)
   2682 	{
   2683 	  cmpltr = 3;
   2684 	}
   2685       else if (strcmp (name, "<<") == 0)
   2686 	{
   2687 	  cmpltr = 4;
   2688 	}
   2689       else if (strcmp (name, "<<=") == 0)
   2690 	{
   2691 	  cmpltr = 5;
   2692 	}
   2693       else if (strcasecmp (name, "sv") == 0)
   2694 	{
   2695 	  cmpltr = 6;
   2696 	}
   2697       else if (strcasecmp (name, "od") == 0)
   2698 	{
   2699 	  cmpltr = 7;
   2700 	}
   2701       /* If we have something like addb,n then there is no condition
   2702 	 completer.  */
   2703       else if (strcasecmp (name, "n") == 0)
   2704 	{
   2705 	  cmpltr = 0;
   2706 	  nullify = 1;
   2707 	}
   2708       else
   2709 	{
   2710 	  cmpltr = -1;
   2711 	}
   2712       **s = c;
   2713     }
   2714 
   2715   /* Reset pointers if this was really a ,n for a branch instruction.  */
   2716   if (nullify)
   2717     *s = save_s;
   2718 
   2719   return cmpltr;
   2720 }
   2721 
   2722 /* Parse a negated compare/subtract completer returning the
   2723    number (for encoding in instructions) of the given completer.  */
   2724 
   2725 static int
   2726 pa_parse_neg_cmpsub_cmpltr (char **s)
   2727 {
   2728   int cmpltr;
   2729   char *name = *s + 1;
   2730   char c;
   2731   char *save_s = *s;
   2732   int nullify = 0;
   2733 
   2734   cmpltr = 0;
   2735   if (**s == ',')
   2736     {
   2737       *s += 1;
   2738       while (**s != ',' && **s != ' ' && **s != '\t')
   2739 	*s += 1;
   2740       c = **s;
   2741       **s = 0x00;
   2742 
   2743       if (strcasecmp (name, "tr") == 0)
   2744 	{
   2745 	  cmpltr = 0;
   2746 	}
   2747       else if (strcmp (name, "<>") == 0)
   2748 	{
   2749 	  cmpltr = 1;
   2750 	}
   2751       else if (strcmp (name, ">=") == 0)
   2752 	{
   2753 	  cmpltr = 2;
   2754 	}
   2755       else if (strcmp (name, ">") == 0)
   2756 	{
   2757 	  cmpltr = 3;
   2758 	}
   2759       else if (strcmp (name, ">>=") == 0)
   2760 	{
   2761 	  cmpltr = 4;
   2762 	}
   2763       else if (strcmp (name, ">>") == 0)
   2764 	{
   2765 	  cmpltr = 5;
   2766 	}
   2767       else if (strcasecmp (name, "nsv") == 0)
   2768 	{
   2769 	  cmpltr = 6;
   2770 	}
   2771       else if (strcasecmp (name, "ev") == 0)
   2772 	{
   2773 	  cmpltr = 7;
   2774 	}
   2775       /* If we have something like addb,n then there is no condition
   2776 	 completer.  */
   2777       else if (strcasecmp (name, "n") == 0)
   2778 	{
   2779 	  cmpltr = 0;
   2780 	  nullify = 1;
   2781 	}
   2782       else
   2783 	{
   2784 	  cmpltr = -1;
   2785 	}
   2786       **s = c;
   2787     }
   2788 
   2789   /* Reset pointers if this was really a ,n for a branch instruction.  */
   2790   if (nullify)
   2791     *s = save_s;
   2792 
   2793   return cmpltr;
   2794 }
   2795 
   2796 /* Parse a 64 bit compare and branch completer returning the number (for
   2797    encoding in instructions) of the given completer.
   2798 
   2799    Nonnegated comparisons are returned as 0-7, negated comparisons are
   2800    returned as 8-15.  */
   2801 
   2802 static int
   2803 pa_parse_cmpb_64_cmpltr (char **s)
   2804 {
   2805   int cmpltr;
   2806   char *name = *s + 1;
   2807   char c;
   2808 
   2809   cmpltr = -1;
   2810   if (**s == ',')
   2811     {
   2812       *s += 1;
   2813       while (**s != ',' && **s != ' ' && **s != '\t')
   2814 	*s += 1;
   2815       c = **s;
   2816       **s = 0x00;
   2817 
   2818       if (strcmp (name, "*") == 0)
   2819 	{
   2820 	  cmpltr = 0;
   2821 	}
   2822       else if (strcmp (name, "*=") == 0)
   2823 	{
   2824 	  cmpltr = 1;
   2825 	}
   2826       else if (strcmp (name, "*<") == 0)
   2827 	{
   2828 	  cmpltr = 2;
   2829 	}
   2830       else if (strcmp (name, "*<=") == 0)
   2831 	{
   2832 	  cmpltr = 3;
   2833 	}
   2834       else if (strcmp (name, "*<<") == 0)
   2835 	{
   2836 	  cmpltr = 4;
   2837 	}
   2838       else if (strcmp (name, "*<<=") == 0)
   2839 	{
   2840 	  cmpltr = 5;
   2841 	}
   2842       else if (strcasecmp (name, "*sv") == 0)
   2843 	{
   2844 	  cmpltr = 6;
   2845 	}
   2846       else if (strcasecmp (name, "*od") == 0)
   2847 	{
   2848 	  cmpltr = 7;
   2849 	}
   2850       else if (strcasecmp (name, "*tr") == 0)
   2851 	{
   2852 	  cmpltr = 8;
   2853 	}
   2854       else if (strcmp (name, "*<>") == 0)
   2855 	{
   2856 	  cmpltr = 9;
   2857 	}
   2858       else if (strcmp (name, "*>=") == 0)
   2859 	{
   2860 	  cmpltr = 10;
   2861 	}
   2862       else if (strcmp (name, "*>") == 0)
   2863 	{
   2864 	  cmpltr = 11;
   2865 	}
   2866       else if (strcmp (name, "*>>=") == 0)
   2867 	{
   2868 	  cmpltr = 12;
   2869 	}
   2870       else if (strcmp (name, "*>>") == 0)
   2871 	{
   2872 	  cmpltr = 13;
   2873 	}
   2874       else if (strcasecmp (name, "*nsv") == 0)
   2875 	{
   2876 	  cmpltr = 14;
   2877 	}
   2878       else if (strcasecmp (name, "*ev") == 0)
   2879 	{
   2880 	  cmpltr = 15;
   2881 	}
   2882       else
   2883 	{
   2884 	  cmpltr = -1;
   2885 	}
   2886       **s = c;
   2887     }
   2888 
   2889   return cmpltr;
   2890 }
   2891 
   2892 /* Parse a 64 bit compare immediate and branch completer returning the number
   2893    (for encoding in instructions) of the given completer.  */
   2894 
   2895 static int
   2896 pa_parse_cmpib_64_cmpltr (char **s)
   2897 {
   2898   int cmpltr;
   2899   char *name = *s + 1;
   2900   char c;
   2901 
   2902   cmpltr = -1;
   2903   if (**s == ',')
   2904     {
   2905       *s += 1;
   2906       while (**s != ',' && **s != ' ' && **s != '\t')
   2907 	*s += 1;
   2908       c = **s;
   2909       **s = 0x00;
   2910 
   2911       if (strcmp (name, "*<<") == 0)
   2912 	{
   2913 	  cmpltr = 0;
   2914 	}
   2915       else if (strcmp (name, "*=") == 0)
   2916 	{
   2917 	  cmpltr = 1;
   2918 	}
   2919       else if (strcmp (name, "*<") == 0)
   2920 	{
   2921 	  cmpltr = 2;
   2922 	}
   2923       else if (strcmp (name, "*<=") == 0)
   2924 	{
   2925 	  cmpltr = 3;
   2926 	}
   2927       else if (strcmp (name, "*>>=") == 0)
   2928 	{
   2929 	  cmpltr = 4;
   2930 	}
   2931       else if (strcmp (name, "*<>") == 0)
   2932 	{
   2933 	  cmpltr = 5;
   2934 	}
   2935       else if (strcasecmp (name, "*>=") == 0)
   2936 	{
   2937 	  cmpltr = 6;
   2938 	}
   2939       else if (strcasecmp (name, "*>") == 0)
   2940 	{
   2941 	  cmpltr = 7;
   2942 	}
   2943       else
   2944 	{
   2945 	  cmpltr = -1;
   2946 	}
   2947       **s = c;
   2948     }
   2949 
   2950   return cmpltr;
   2951 }
   2952 
   2953 /* Parse a non-negated addition completer returning the number
   2954    (for encoding in instructions) of the given completer.  */
   2955 
   2956 static int
   2957 pa_parse_nonneg_add_cmpltr (char **s)
   2958 {
   2959   int cmpltr;
   2960   char *name = *s + 1;
   2961   char c;
   2962   char *save_s = *s;
   2963   int nullify = 0;
   2964 
   2965   cmpltr = 0;
   2966   if (**s == ',')
   2967     {
   2968       *s += 1;
   2969       while (**s != ',' && **s != ' ' && **s != '\t')
   2970 	*s += 1;
   2971       c = **s;
   2972       **s = 0x00;
   2973       if (strcmp (name, "=") == 0)
   2974 	{
   2975 	  cmpltr = 1;
   2976 	}
   2977       else if (strcmp (name, "<") == 0)
   2978 	{
   2979 	  cmpltr = 2;
   2980 	}
   2981       else if (strcmp (name, "<=") == 0)
   2982 	{
   2983 	  cmpltr = 3;
   2984 	}
   2985       else if (strcasecmp (name, "nuv") == 0)
   2986 	{
   2987 	  cmpltr = 4;
   2988 	}
   2989       else if (strcasecmp (name, "znv") == 0)
   2990 	{
   2991 	  cmpltr = 5;
   2992 	}
   2993       else if (strcasecmp (name, "sv") == 0)
   2994 	{
   2995 	  cmpltr = 6;
   2996 	}
   2997       else if (strcasecmp (name, "od") == 0)
   2998 	{
   2999 	  cmpltr = 7;
   3000 	}
   3001       /* If we have something like addb,n then there is no condition
   3002 	 completer.  */
   3003       else if (strcasecmp (name, "n") == 0)
   3004 	{
   3005 	  cmpltr = 0;
   3006 	  nullify = 1;
   3007 	}
   3008       else
   3009 	{
   3010 	  cmpltr = -1;
   3011 	}
   3012       **s = c;
   3013     }
   3014 
   3015   /* Reset pointers if this was really a ,n for a branch instruction.  */
   3016   if (nullify)
   3017     *s = save_s;
   3018 
   3019   return cmpltr;
   3020 }
   3021 
   3022 /* Parse a negated addition completer returning the number
   3023    (for encoding in instructions) of the given completer.  */
   3024 
   3025 static int
   3026 pa_parse_neg_add_cmpltr (char **s)
   3027 {
   3028   int cmpltr;
   3029   char *name = *s + 1;
   3030   char c;
   3031   char *save_s = *s;
   3032   int nullify = 0;
   3033 
   3034   cmpltr = 0;
   3035   if (**s == ',')
   3036     {
   3037       *s += 1;
   3038       while (**s != ',' && **s != ' ' && **s != '\t')
   3039 	*s += 1;
   3040       c = **s;
   3041       **s = 0x00;
   3042       if (strcasecmp (name, "tr") == 0)
   3043 	{
   3044 	  cmpltr = 0;
   3045 	}
   3046       else if (strcmp (name, "<>") == 0)
   3047 	{
   3048 	  cmpltr = 1;
   3049 	}
   3050       else if (strcmp (name, ">=") == 0)
   3051 	{
   3052 	  cmpltr = 2;
   3053 	}
   3054       else if (strcmp (name, ">") == 0)
   3055 	{
   3056 	  cmpltr = 3;
   3057 	}
   3058       else if (strcasecmp (name, "uv") == 0)
   3059 	{
   3060 	  cmpltr = 4;
   3061 	}
   3062       else if (strcasecmp (name, "vnz") == 0)
   3063 	{
   3064 	  cmpltr = 5;
   3065 	}
   3066       else if (strcasecmp (name, "nsv") == 0)
   3067 	{
   3068 	  cmpltr = 6;
   3069 	}
   3070       else if (strcasecmp (name, "ev") == 0)
   3071 	{
   3072 	  cmpltr = 7;
   3073 	}
   3074       /* If we have something like addb,n then there is no condition
   3075 	 completer.  */
   3076       else if (strcasecmp (name, "n") == 0)
   3077 	{
   3078 	  cmpltr = 0;
   3079 	  nullify = 1;
   3080 	}
   3081       else
   3082 	{
   3083 	  cmpltr = -1;
   3084 	}
   3085       **s = c;
   3086     }
   3087 
   3088   /* Reset pointers if this was really a ,n for a branch instruction.  */
   3089   if (nullify)
   3090     *s = save_s;
   3091 
   3092   return cmpltr;
   3093 }
   3094 
   3095 /* Parse a 64 bit wide mode add and branch completer returning the number (for
   3096    encoding in instructions) of the given completer.  */
   3097 
   3098 static int
   3099 pa_parse_addb_64_cmpltr (char **s)
   3100 {
   3101   int cmpltr;
   3102   char *name = *s + 1;
   3103   char c;
   3104   char *save_s = *s;
   3105   int nullify = 0;
   3106 
   3107   cmpltr = 0;
   3108   if (**s == ',')
   3109     {
   3110       *s += 1;
   3111       while (**s != ',' && **s != ' ' && **s != '\t')
   3112 	*s += 1;
   3113       c = **s;
   3114       **s = 0x00;
   3115       if (strcmp (name, "=") == 0)
   3116 	{
   3117 	  cmpltr = 1;
   3118 	}
   3119       else if (strcmp (name, "<") == 0)
   3120 	{
   3121 	  cmpltr = 2;
   3122 	}
   3123       else if (strcmp (name, "<=") == 0)
   3124 	{
   3125 	  cmpltr = 3;
   3126 	}
   3127       else if (strcasecmp (name, "nuv") == 0)
   3128 	{
   3129 	  cmpltr = 4;
   3130 	}
   3131       else if (strcasecmp (name, "*=") == 0)
   3132 	{
   3133 	  cmpltr = 5;
   3134 	}
   3135       else if (strcasecmp (name, "*<") == 0)
   3136 	{
   3137 	  cmpltr = 6;
   3138 	}
   3139       else if (strcasecmp (name, "*<=") == 0)
   3140 	{
   3141 	  cmpltr = 7;
   3142 	}
   3143       else if (strcmp (name, "tr") == 0)
   3144 	{
   3145 	  cmpltr = 8;
   3146 	}
   3147       else if (strcmp (name, "<>") == 0)
   3148 	{
   3149 	  cmpltr = 9;
   3150 	}
   3151       else if (strcmp (name, ">=") == 0)
   3152 	{
   3153 	  cmpltr = 10;
   3154 	}
   3155       else if (strcmp (name, ">") == 0)
   3156 	{
   3157 	  cmpltr = 11;
   3158 	}
   3159       else if (strcasecmp (name, "uv") == 0)
   3160 	{
   3161 	  cmpltr = 12;
   3162 	}
   3163       else if (strcasecmp (name, "*<>") == 0)
   3164 	{
   3165 	  cmpltr = 13;
   3166 	}
   3167       else if (strcasecmp (name, "*>=") == 0)
   3168 	{
   3169 	  cmpltr = 14;
   3170 	}
   3171       else if (strcasecmp (name, "*>") == 0)
   3172 	{
   3173 	  cmpltr = 15;
   3174 	}
   3175       /* If we have something like addb,n then there is no condition
   3176 	 completer.  */
   3177       else if (strcasecmp (name, "n") == 0)
   3178 	{
   3179 	  cmpltr = 0;
   3180 	  nullify = 1;
   3181 	}
   3182       else
   3183 	{
   3184 	  cmpltr = -1;
   3185 	}
   3186       **s = c;
   3187     }
   3188 
   3189   /* Reset pointers if this was really a ,n for a branch instruction.  */
   3190   if (nullify)
   3191     *s = save_s;
   3192 
   3193   return cmpltr;
   3194 }
   3195 
   3196 /* Do the real work for assembling a single instruction.  Store results
   3197    into the global "the_insn" variable.  */
   3198 
   3199 static void
   3200 pa_ip (char *str)
   3201 {
   3202   char *error_message = "";
   3203   char *s, c, *argstart, *name, *save_s;
   3204   const char *args;
   3205   int match = FALSE;
   3206   int comma = 0;
   3207   int cmpltr, nullif, flag, cond, need_cond, num;
   3208   int immediate_check = 0, pos = -1, len = -1;
   3209   unsigned long opcode;
   3210   struct pa_opcode *insn;
   3211 
   3212 #ifdef OBJ_SOM
   3213   /* We must have a valid space and subspace.  */
   3214   pa_check_current_space_and_subspace ();
   3215 #endif
   3216 
   3217   /* Convert everything up to the first whitespace character into lower
   3218      case.  */
   3219   for (s = str; *s != ' ' && *s != '\t' && *s != '\n' && *s != '\0'; s++)
   3220     *s = TOLOWER (*s);
   3221 
   3222   /* Skip to something interesting.  */
   3223   for (s = str;
   3224        ISUPPER (*s) || ISLOWER (*s) || (*s >= '0' && *s <= '3');
   3225        ++s)
   3226     ;
   3227 
   3228   switch (*s)
   3229     {
   3230 
   3231     case '\0':
   3232       break;
   3233 
   3234     case ',':
   3235       comma = 1;
   3236 
   3237       /*FALLTHROUGH */
   3238 
   3239     case ' ':
   3240       *s++ = '\0';
   3241       break;
   3242 
   3243     default:
   3244       as_bad (_("Unknown opcode: `%s'"), str);
   3245       return;
   3246     }
   3247 
   3248   /* Look up the opcode in the hash table.  */
   3249   if ((insn = (struct pa_opcode *) hash_find (op_hash, str)) == NULL)
   3250     {
   3251       as_bad (_("Unknown opcode: `%s'"), str);
   3252       return;
   3253     }
   3254 
   3255   if (comma)
   3256     *--s = ',';
   3257 
   3258   /* Mark the location where arguments for the instruction start, then
   3259      start processing them.  */
   3260   argstart = s;
   3261   for (;;)
   3262     {
   3263       /* Do some initialization.  */
   3264       opcode = insn->match;
   3265       strict = (insn->flags & FLAG_STRICT);
   3266       memset (&the_insn, 0, sizeof (the_insn));
   3267       need_cond = 1;
   3268 
   3269       the_insn.reloc = R_HPPA_NONE;
   3270 
   3271       if (insn->arch >= pa20
   3272 	  && bfd_get_mach (stdoutput) < insn->arch)
   3273 	goto failed;
   3274 
   3275       /* Build the opcode, checking as we go to make
   3276 	 sure that the operands match.  */
   3277       for (args = insn->args;; ++args)
   3278 	{
   3279 	  /* Absorb white space in instruction.  */
   3280 	  while (*s == ' ' || *s == '\t')
   3281 	    s++;
   3282 
   3283 	  switch (*args)
   3284 	    {
   3285 	    /* End of arguments.  */
   3286 	    case '\0':
   3287 	      if (*s == '\0')
   3288 		match = TRUE;
   3289 	      break;
   3290 
   3291 	    case '+':
   3292 	      if (*s == '+')
   3293 		{
   3294 		  ++s;
   3295 		  continue;
   3296 		}
   3297 	      if (*s == '-')
   3298 		continue;
   3299 	      break;
   3300 
   3301 	    /* These must match exactly.  */
   3302 	    case '(':
   3303 	    case ')':
   3304 	    case ',':
   3305 	    case ' ':
   3306 	      if (*s++ == *args)
   3307 		continue;
   3308 	      break;
   3309 
   3310 	    /* Handle a 5 bit register or control register field at 10.  */
   3311 	    case 'b':
   3312 	    case '^':
   3313 	      if (!pa_parse_number (&s, 0))
   3314 		break;
   3315 	      num = pa_number;
   3316 	      CHECK_FIELD (num, 31, 0, 0);
   3317 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   3318 
   3319 	    /* Handle %sar or %cr11.  No bits get set, we just verify that it
   3320 	       is there.  */
   3321 	    case '!':
   3322 	      /* Skip whitespace before register.  */
   3323 	      while (*s == ' ' || *s == '\t')
   3324 		s = s + 1;
   3325 
   3326 	      if (!strncasecmp (s, "%sar", 4))
   3327 		{
   3328 		  s += 4;
   3329 		  continue;
   3330 		}
   3331 	      else if (!strncasecmp (s, "%cr11", 5))
   3332 		{
   3333 		  s += 5;
   3334 		  continue;
   3335 		}
   3336 	      break;
   3337 
   3338 	    /* Handle a 5 bit register field at 15.  */
   3339 	    case 'x':
   3340 	      if (!pa_parse_number (&s, 0))
   3341 		break;
   3342 	      num = pa_number;
   3343 	      CHECK_FIELD (num, 31, 0, 0);
   3344 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3345 
   3346 	    /* Handle a 5 bit register field at 31.  */
   3347 	    case 't':
   3348 	      if (!pa_parse_number (&s, 0))
   3349 		break;
   3350 	      num = pa_number;
   3351 	      CHECK_FIELD (num, 31, 0, 0);
   3352 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   3353 
   3354 	    /* Handle a 5 bit register field at 10 and 15.  */
   3355 	    case 'a':
   3356 	      if (!pa_parse_number (&s, 0))
   3357 		break;
   3358 	      num = pa_number;
   3359 	      CHECK_FIELD (num, 31, 0, 0);
   3360 	      opcode |= num << 16;
   3361 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   3362 
   3363 	    /* Handle a 5 bit field length at 31.  */
   3364 	    case 'T':
   3365 	      num = pa_get_absolute_expression (&the_insn, &s);
   3366 	      if (strict && the_insn.exp.X_op != O_constant)
   3367 		break;
   3368 	      s = expr_end;
   3369 	      CHECK_FIELD (num, 32, 1, 0);
   3370 	      SAVE_IMMEDIATE(num);
   3371 	      INSERT_FIELD_AND_CONTINUE (opcode, 32 - num, 0);
   3372 
   3373 	    /* Handle a 5 bit immediate at 15.  */
   3374 	    case '5':
   3375 	      num = pa_get_absolute_expression (&the_insn, &s);
   3376 	      if (strict && the_insn.exp.X_op != O_constant)
   3377 		break;
   3378 	      s = expr_end;
   3379 	      /* When in strict mode, we want to just reject this
   3380 		 match instead of giving an out of range error.  */
   3381 	      CHECK_FIELD (num, 15, -16, strict);
   3382 	      num = low_sign_unext (num, 5);
   3383 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3384 
   3385 	    /* Handle a 5 bit immediate at 31.  */
   3386 	    case 'V':
   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 	      /* When in strict mode, we want to just reject this
   3392 		 match instead of giving an out of range error.  */
   3393 	      CHECK_FIELD (num, 15, -16, strict);
   3394 	      num = low_sign_unext (num, 5);
   3395 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   3396 
   3397 	    /* Handle an unsigned 5 bit immediate at 31.  */
   3398 	    case 'r':
   3399 	      num = pa_get_absolute_expression (&the_insn, &s);
   3400 	      if (strict && the_insn.exp.X_op != O_constant)
   3401 		break;
   3402 	      s = expr_end;
   3403 	      CHECK_FIELD (num, 31, 0, strict);
   3404 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   3405 
   3406 	    /* Handle an unsigned 5 bit immediate at 15.  */
   3407 	    case 'R':
   3408 	      num = pa_get_absolute_expression (&the_insn, &s);
   3409 	      if (strict && the_insn.exp.X_op != O_constant)
   3410 		break;
   3411 	      s = expr_end;
   3412 	      CHECK_FIELD (num, 31, 0, strict);
   3413 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3414 
   3415 	    /* Handle an unsigned 10 bit immediate at 15.  */
   3416 	    case 'U':
   3417 	      num = pa_get_absolute_expression (&the_insn, &s);
   3418 	      if (strict && the_insn.exp.X_op != O_constant)
   3419 		break;
   3420 	      s = expr_end;
   3421 	      CHECK_FIELD (num, 1023, 0, strict);
   3422 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3423 
   3424 	    /* Handle a 2 bit space identifier at 17.  */
   3425 	    case 's':
   3426 	      if (!pa_parse_number (&s, 0))
   3427 		break;
   3428 	      num = pa_number;
   3429 	      CHECK_FIELD (num, 3, 0, 1);
   3430 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 14);
   3431 
   3432 	    /* Handle a 3 bit space identifier at 18.  */
   3433 	    case 'S':
   3434 	      if (!pa_parse_number (&s, 0))
   3435 		break;
   3436 	      num = pa_number;
   3437 	      CHECK_FIELD (num, 7, 0, 1);
   3438 	      opcode |= re_assemble_3 (num);
   3439 	      continue;
   3440 
   3441 	    /* Handle all completers.  */
   3442 	    case 'c':
   3443 	      switch (*++args)
   3444 		{
   3445 
   3446 		/* Handle a completer for an indexing load or store.  */
   3447 		case 'X':
   3448 		case 'x':
   3449 		  {
   3450 		    int uu = 0;
   3451 		    int m = 0;
   3452 		    int i = 0;
   3453 		    while (*s == ',' && i < 2)
   3454 		      {
   3455 			s++;
   3456 			if (strncasecmp (s, "sm", 2) == 0)
   3457 			  {
   3458 			    uu = 1;
   3459 			    m = 1;
   3460 			    s++;
   3461 			    i++;
   3462 			  }
   3463 			else if (strncasecmp (s, "m", 1) == 0)
   3464 			  m = 1;
   3465 			else if ((strncasecmp (s, "s ", 2) == 0)
   3466 				 || (strncasecmp (s, "s,", 2) == 0))
   3467 			  uu = 1;
   3468 			else if (strict)
   3469 			  {
   3470 			    /* This is a match failure.  */
   3471 			    s--;
   3472 			    break;
   3473 			  }
   3474 			else
   3475 			  as_bad (_("Invalid Indexed Load Completer."));
   3476 			s++;
   3477 			i++;
   3478 		      }
   3479 		    if (i > 2)
   3480 		      as_bad (_("Invalid Indexed Load Completer Syntax."));
   3481 		    opcode |= m << 5;
   3482 		    INSERT_FIELD_AND_CONTINUE (opcode, uu, 13);
   3483 		  }
   3484 
   3485 		/* Handle a short load/store completer.  */
   3486 		case 'M':
   3487 		case 'm':
   3488 		case 'q':
   3489 		case 'J':
   3490 		case 'e':
   3491 		  {
   3492 		    int a = 0;
   3493 		    int m = 0;
   3494 		    if (*s == ',')
   3495 		      {
   3496 			s++;
   3497 			if (strncasecmp (s, "ma", 2) == 0)
   3498 			  {
   3499 			    a = 0;
   3500 			    m = 1;
   3501 			    s += 2;
   3502 			  }
   3503 			else if (strncasecmp (s, "mb", 2) == 0)
   3504 			  {
   3505 			    a = 1;
   3506 			    m = 1;
   3507 			    s += 2;
   3508 			  }
   3509 			else if (strict)
   3510 			  /* This is a match failure.  */
   3511 			  s--;
   3512 			else
   3513 			  {
   3514 			    as_bad (_("Invalid Short Load/Store Completer."));
   3515 			    s += 2;
   3516 			  }
   3517 		      }
   3518 		    /* If we did not get a ma/mb completer, then we do not
   3519 		       consider this a positive match for 'ce'.  */
   3520 		    else if (*args == 'e')
   3521 		      break;
   3522 
   3523 		   /* 'J', 'm', 'M' and 'q' are the same, except for where they
   3524 		       encode the before/after field.  */
   3525 		   if (*args == 'm' || *args == 'M')
   3526 		      {
   3527 			opcode |= m << 5;
   3528 			INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
   3529 		      }
   3530 		    else if (*args == 'q')
   3531 		      {
   3532 			opcode |= m << 3;
   3533 			INSERT_FIELD_AND_CONTINUE (opcode, a, 2);
   3534 		      }
   3535 		    else if (*args == 'J')
   3536 		      {
   3537 			/* M bit is explicit in the major opcode.  */
   3538 			INSERT_FIELD_AND_CONTINUE (opcode, a, 2);
   3539 		      }
   3540 		    else if (*args == 'e')
   3541 		      {
   3542 			/* Stash the ma/mb flag temporarily in the
   3543 			   instruction.  We will use (and remove it)
   3544 			   later when handling 'J', 'K', '<' & '>'.  */
   3545 			opcode |= a;
   3546 			continue;
   3547 		      }
   3548 		  }
   3549 
   3550 		/* Handle a stbys completer.  */
   3551 		case 'A':
   3552 		case 's':
   3553 		  {
   3554 		    int a = 0;
   3555 		    int m = 0;
   3556 		    int i = 0;
   3557 		    while (*s == ',' && i < 2)
   3558 		      {
   3559 			s++;
   3560 			if (strncasecmp (s, "m", 1) == 0)
   3561 			  m = 1;
   3562 			else if ((strncasecmp (s, "b ", 2) == 0)
   3563 				 || (strncasecmp (s, "b,", 2) == 0))
   3564 			  a = 0;
   3565 			else if (strncasecmp (s, "e", 1) == 0)
   3566 			  a = 1;
   3567 			/* In strict mode, this is a match failure.  */
   3568 			else if (strict)
   3569 			  {
   3570 			    s--;
   3571 			    break;
   3572 			  }
   3573 			else
   3574 			  as_bad (_("Invalid Store Bytes Short Completer"));
   3575 			s++;
   3576 			i++;
   3577 		      }
   3578 		    if (i > 2)
   3579 		      as_bad (_("Invalid Store Bytes Short Completer"));
   3580 		    opcode |= m << 5;
   3581 		    INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
   3582 		  }
   3583 
   3584 		/* Handle load cache hint completer.  */
   3585 		case 'c':
   3586 		  cmpltr = 0;
   3587 		  if (!strncmp (s, ",sl", 3))
   3588 		    {
   3589 		      s += 3;
   3590 		      cmpltr = 2;
   3591 		    }
   3592 		  INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
   3593 
   3594 		/* Handle store cache hint completer.  */
   3595 		case 'C':
   3596 		  cmpltr = 0;
   3597 		  if (!strncmp (s, ",sl", 3))
   3598 		    {
   3599 		      s += 3;
   3600 		      cmpltr = 2;
   3601 		    }
   3602 		  else if (!strncmp (s, ",bc", 3))
   3603 		    {
   3604 		      s += 3;
   3605 		      cmpltr = 1;
   3606 		    }
   3607 		  INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
   3608 
   3609 		/* Handle load and clear cache hint completer.  */
   3610 		case 'd':
   3611 		  cmpltr = 0;
   3612 		  if (!strncmp (s, ",co", 3))
   3613 		    {
   3614 		      s += 3;
   3615 		      cmpltr = 1;
   3616 		    }
   3617 		  INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
   3618 
   3619 		/* Handle load ordering completer.  */
   3620 		case 'o':
   3621 		  if (strncmp (s, ",o", 2) != 0)
   3622 		    break;
   3623 		  s += 2;
   3624 		  continue;
   3625 
   3626 		/* Handle a branch gate completer.  */
   3627 		case 'g':
   3628 		  if (strncasecmp (s, ",gate", 5) != 0)
   3629 		    break;
   3630 		  s += 5;
   3631 		  continue;
   3632 
   3633 		/* Handle a branch link and push completer.  */
   3634 		case 'p':
   3635 		  if (strncasecmp (s, ",l,push", 7) != 0)
   3636 		    break;
   3637 		  s += 7;
   3638 		  continue;
   3639 
   3640 		/* Handle a branch link completer.  */
   3641 		case 'l':
   3642 		  if (strncasecmp (s, ",l", 2) != 0)
   3643 		    break;
   3644 		  s += 2;
   3645 		  continue;
   3646 
   3647 		/* Handle a branch pop completer.  */
   3648 		case 'P':
   3649 		  if (strncasecmp (s, ",pop", 4) != 0)
   3650 		    break;
   3651 		  s += 4;
   3652 		  continue;
   3653 
   3654 		/* Handle a local processor completer.  */
   3655 		case 'L':
   3656 		  if (strncasecmp (s, ",l", 2) != 0)
   3657 		    break;
   3658 		  s += 2;
   3659 		  continue;
   3660 
   3661 		/* Handle a PROBE read/write completer.  */
   3662 		case 'w':
   3663 		  flag = 0;
   3664 		  if (!strncasecmp (s, ",w", 2))
   3665 		    {
   3666 		      flag = 1;
   3667 		      s += 2;
   3668 		    }
   3669 		  else if (!strncasecmp (s, ",r", 2))
   3670 		    {
   3671 		      flag = 0;
   3672 		      s += 2;
   3673 		    }
   3674 
   3675 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
   3676 
   3677 		/* Handle MFCTL wide completer.  */
   3678 		case 'W':
   3679 		  if (strncasecmp (s, ",w", 2) != 0)
   3680 		    break;
   3681 		  s += 2;
   3682 		  continue;
   3683 
   3684 		/* Handle an RFI restore completer.  */
   3685 		case 'r':
   3686 		  flag = 0;
   3687 		  if (!strncasecmp (s, ",r", 2))
   3688 		    {
   3689 		      flag = 5;
   3690 		      s += 2;
   3691 		    }
   3692 
   3693 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 5);
   3694 
   3695 		/* Handle a system control completer.  */
   3696 		case 'Z':
   3697 		  if (*s == ',' && (*(s + 1) == 'm' || *(s + 1) == 'M'))
   3698 		    {
   3699 		      flag = 1;
   3700 		      s += 2;
   3701 		    }
   3702 		  else
   3703 		    flag = 0;
   3704 
   3705 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 5);
   3706 
   3707 		/* Handle intermediate/final completer for DCOR.  */
   3708 		case 'i':
   3709 		  flag = 0;
   3710 		  if (!strncasecmp (s, ",i", 2))
   3711 		    {
   3712 		      flag = 1;
   3713 		      s += 2;
   3714 		    }
   3715 
   3716 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
   3717 
   3718 		/* Handle zero/sign extension completer.  */
   3719 		case 'z':
   3720 		  flag = 1;
   3721 		  if (!strncasecmp (s, ",z", 2))
   3722 		    {
   3723 		      flag = 0;
   3724 		      s += 2;
   3725 		    }
   3726 
   3727 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 10);
   3728 
   3729 		/* Handle add completer.  */
   3730 		case 'a':
   3731 		  flag = 1;
   3732 		  if (!strncasecmp (s, ",l", 2))
   3733 		    {
   3734 		      flag = 2;
   3735 		      s += 2;
   3736 		    }
   3737 		  else if (!strncasecmp (s, ",tsv", 4))
   3738 		    {
   3739 		      flag = 3;
   3740 		      s += 4;
   3741 		    }
   3742 
   3743 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 10);
   3744 
   3745 		/* Handle 64 bit carry for ADD.  */
   3746 		case 'Y':
   3747 		  flag = 0;
   3748 		  if (!strncasecmp (s, ",dc,tsv", 7) ||
   3749 		      !strncasecmp (s, ",tsv,dc", 7))
   3750 		    {
   3751 		      flag = 1;
   3752 		      s += 7;
   3753 		    }
   3754 		  else if (!strncasecmp (s, ",dc", 3))
   3755 		    {
   3756 		      flag = 0;
   3757 		      s += 3;
   3758 		    }
   3759 		  else
   3760 		    break;
   3761 
   3762 		  /* Condition is not required with "dc".  */
   3763 		  need_cond = 0;
   3764 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3765 
   3766 		/* Handle 32 bit carry for ADD.  */
   3767 		case 'y':
   3768 		  flag = 0;
   3769 		  if (!strncasecmp (s, ",c,tsv", 6) ||
   3770 		      !strncasecmp (s, ",tsv,c", 6))
   3771 		    {
   3772 		      flag = 1;
   3773 		      s += 6;
   3774 		    }
   3775 		  else if (!strncasecmp (s, ",c", 2))
   3776 		    {
   3777 		      flag = 0;
   3778 		      s += 2;
   3779 		    }
   3780 		  else
   3781 		    break;
   3782 
   3783 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3784 
   3785 		/* Handle trap on signed overflow.  */
   3786 		case 'v':
   3787 		  flag = 0;
   3788 		  if (!strncasecmp (s, ",tsv", 4))
   3789 		    {
   3790 		      flag = 1;
   3791 		      s += 4;
   3792 		    }
   3793 
   3794 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3795 
   3796 		/* Handle trap on condition and overflow.  */
   3797 		case 't':
   3798 		  flag = 0;
   3799 		  if (!strncasecmp (s, ",tc,tsv", 7) ||
   3800 		      !strncasecmp (s, ",tsv,tc", 7))
   3801 		    {
   3802 		      flag = 1;
   3803 		      s += 7;
   3804 		    }
   3805 		  else if (!strncasecmp (s, ",tc", 3))
   3806 		    {
   3807 		      flag = 0;
   3808 		      s += 3;
   3809 		    }
   3810 		  else
   3811 		    break;
   3812 
   3813 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3814 
   3815 		/* Handle 64 bit borrow for SUB.  */
   3816 		case 'B':
   3817 		  flag = 0;
   3818 		  if (!strncasecmp (s, ",db,tsv", 7) ||
   3819 		      !strncasecmp (s, ",tsv,db", 7))
   3820 		    {
   3821 		      flag = 1;
   3822 		      s += 7;
   3823 		    }
   3824 		  else if (!strncasecmp (s, ",db", 3))
   3825 		    {
   3826 		      flag = 0;
   3827 		      s += 3;
   3828 		    }
   3829 		  else
   3830 		    break;
   3831 
   3832 		  /* Condition is not required with "db".  */
   3833 		  need_cond = 0;
   3834 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3835 
   3836 		/* Handle 32 bit borrow for SUB.  */
   3837 		case 'b':
   3838 		  flag = 0;
   3839 		  if (!strncasecmp (s, ",b,tsv", 6) ||
   3840 		      !strncasecmp (s, ",tsv,b", 6))
   3841 		    {
   3842 		      flag = 1;
   3843 		      s += 6;
   3844 		    }
   3845 		  else if (!strncasecmp (s, ",b", 2))
   3846 		    {
   3847 		      flag = 0;
   3848 		      s += 2;
   3849 		    }
   3850 		  else
   3851 		    break;
   3852 
   3853 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3854 
   3855 		/* Handle trap condition completer for UADDCM.  */
   3856 		case 'T':
   3857 		  flag = 0;
   3858 		  if (!strncasecmp (s, ",tc", 3))
   3859 		    {
   3860 		      flag = 1;
   3861 		      s += 3;
   3862 		    }
   3863 
   3864 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
   3865 
   3866 		/* Handle signed/unsigned at 21.  */
   3867 		case 'S':
   3868 		  {
   3869 		    int sign = 1;
   3870 		    if (strncasecmp (s, ",s", 2) == 0)
   3871 		      {
   3872 			sign = 1;
   3873 			s += 2;
   3874 		      }
   3875 		    else if (strncasecmp (s, ",u", 2) == 0)
   3876 		      {
   3877 			sign = 0;
   3878 			s += 2;
   3879 		      }
   3880 
   3881 		    INSERT_FIELD_AND_CONTINUE (opcode, sign, 10);
   3882 		  }
   3883 
   3884 		/* Handle left/right combination at 17:18.  */
   3885 		case 'h':
   3886 		  if (*s++ == ',')
   3887 		    {
   3888 		      int lr = 0;
   3889 		      if (*s == 'r')
   3890 			lr = 2;
   3891 		      else if (*s == 'l')
   3892 			lr = 0;
   3893 		      else
   3894 			as_bad (_("Invalid left/right combination completer"));
   3895 
   3896 		      s++;
   3897 		      INSERT_FIELD_AND_CONTINUE (opcode, lr, 13);
   3898 		    }
   3899 		  else
   3900 		    as_bad (_("Invalid left/right combination completer"));
   3901 		  break;
   3902 
   3903 		/* Handle saturation at 24:25.  */
   3904 		case 'H':
   3905 		  {
   3906 		    int sat = 3;
   3907 		    if (strncasecmp (s, ",ss", 3) == 0)
   3908 		      {
   3909 			sat = 1;
   3910 			s += 3;
   3911 		      }
   3912 		    else if (strncasecmp (s, ",us", 3) == 0)
   3913 		      {
   3914 			sat = 0;
   3915 			s += 3;
   3916 		      }
   3917 
   3918 		    INSERT_FIELD_AND_CONTINUE (opcode, sat, 6);
   3919 		  }
   3920 
   3921 		/* Handle permutation completer.  */
   3922 		case '*':
   3923 		  if (*s++ == ',')
   3924 		    {
   3925 		      int permloc[4];
   3926 		      int perm = 0;
   3927 		      int i = 0;
   3928 		      permloc[0] = 13;
   3929 		      permloc[1] = 10;
   3930 		      permloc[2] = 8;
   3931 		      permloc[3] = 6;
   3932 		      for (; i < 4; i++)
   3933 			{
   3934 			  switch (*s++)
   3935 			    {
   3936 			    case '0':
   3937 			      perm = 0;
   3938 			      break;
   3939 			    case '1':
   3940 			      perm = 1;
   3941 			      break;
   3942 			    case '2':
   3943 			      perm = 2;
   3944 			      break;
   3945 			    case '3':
   3946 			      perm = 3;
   3947 			      break;
   3948 			    default:
   3949 			      as_bad (_("Invalid permutation completer"));
   3950 			    }
   3951 			  opcode |= perm << permloc[i];
   3952 			}
   3953 		      continue;
   3954 		    }
   3955 		  else
   3956 		    as_bad (_("Invalid permutation completer"));
   3957 		  break;
   3958 
   3959 		default:
   3960 		  abort ();
   3961 		}
   3962 	      break;
   3963 
   3964 	    /* Handle all conditions.  */
   3965 	    case '?':
   3966 	      {
   3967 		args++;
   3968 		switch (*args)
   3969 		  {
   3970 		  /* Handle FP compare conditions.  */
   3971 		  case 'f':
   3972 		    cond = pa_parse_fp_cmp_cond (&s);
   3973 		    INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
   3974 
   3975 		  /* Handle an add condition.  */
   3976 		  case 'A':
   3977 		  case 'a':
   3978 		    cmpltr = 0;
   3979 		    flag = 0;
   3980 		    if (*s == ',')
   3981 		      {
   3982 			s++;
   3983 
   3984 			/* 64 bit conditions.  */
   3985 			if (*args == 'A')
   3986 			  {
   3987 			    if (*s == '*')
   3988 			      s++;
   3989 			    else
   3990 			      break;
   3991 			  }
   3992 			else if (*s == '*')
   3993 			  break;
   3994 
   3995 			name = s;
   3996 			while (*s != ',' && *s != ' ' && *s != '\t')
   3997 			  s += 1;
   3998 			c = *s;
   3999 			*s = 0x00;
   4000 			if (strcmp (name, "=") == 0)
   4001 			  cmpltr = 1;
   4002 			else if (strcmp (name, "<") == 0)
   4003 			  cmpltr = 2;
   4004 			else if (strcmp (name, "<=") == 0)
   4005 			  cmpltr = 3;
   4006 			else if (strcasecmp (name, "nuv") == 0)
   4007 			  cmpltr = 4;
   4008 			else if (strcasecmp (name, "znv") == 0)
   4009 			  cmpltr = 5;
   4010 			else if (strcasecmp (name, "sv") == 0)
   4011 			  cmpltr = 6;
   4012 			else if (strcasecmp (name, "od") == 0)
   4013 			  cmpltr = 7;
   4014 			else if (strcasecmp (name, "tr") == 0)
   4015 			  {
   4016 			    cmpltr = 0;
   4017 			    flag = 1;
   4018 			  }
   4019 			else if (strcmp (name, "<>") == 0)
   4020 			  {
   4021 			    cmpltr = 1;
   4022 			    flag = 1;
   4023 			  }
   4024 			else if (strcmp (name, ">=") == 0)
   4025 			  {
   4026 			    cmpltr = 2;
   4027 			    flag = 1;
   4028 			  }
   4029 			else if (strcmp (name, ">") == 0)
   4030 			  {
   4031 			    cmpltr = 3;
   4032 			    flag = 1;
   4033 			  }
   4034 			else if (strcasecmp (name, "uv") == 0)
   4035 			  {
   4036 			    cmpltr = 4;
   4037 			    flag = 1;
   4038 			  }
   4039 			else if (strcasecmp (name, "vnz") == 0)
   4040 			  {
   4041 			    cmpltr = 5;
   4042 			    flag = 1;
   4043 			  }
   4044 			else if (strcasecmp (name, "nsv") == 0)
   4045 			  {
   4046 			    cmpltr = 6;
   4047 			    flag = 1;
   4048 			  }
   4049 			else if (strcasecmp (name, "ev") == 0)
   4050 			  {
   4051 			    cmpltr = 7;
   4052 			    flag = 1;
   4053 			  }
   4054 			/* ",*" is a valid condition.  */
   4055 			else if (*args == 'a' || *name)
   4056 			  as_bad (_("Invalid Add Condition: %s"), name);
   4057 			*s = c;
   4058 		      }
   4059 		    /* Except with "dc", we have a match failure with
   4060 		       'A' if we don't have a doubleword condition.  */
   4061 		    else if (*args == 'A' && need_cond)
   4062 		      break;
   4063 
   4064 		    opcode |= cmpltr << 13;
   4065 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4066 
   4067 		  /* Handle non-negated add and branch condition.  */
   4068 		  case 'd':
   4069 		    cmpltr = pa_parse_nonneg_add_cmpltr (&s);
   4070 		    if (cmpltr < 0)
   4071 		      {
   4072 			as_bad (_("Invalid Add and Branch Condition"));
   4073 			cmpltr = 0;
   4074 		      }
   4075 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4076 
   4077 		  /* Handle 64 bit wide-mode add and branch condition.  */
   4078 		  case 'W':
   4079 		    cmpltr = pa_parse_addb_64_cmpltr (&s);
   4080 		    if (cmpltr < 0)
   4081 		      {
   4082 			as_bad (_("Invalid Add and Branch Condition"));
   4083 			cmpltr = 0;
   4084 		      }
   4085 		    else
   4086 		      {
   4087 			/* Negated condition requires an opcode change.  */
   4088 			opcode |= (cmpltr & 8) << 24;
   4089 		      }
   4090 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
   4091 
   4092 		  /* Handle a negated or non-negated add and branch
   4093 		     condition.  */
   4094 		  case '@':
   4095 		    save_s = s;
   4096 		    cmpltr = pa_parse_nonneg_add_cmpltr (&s);
   4097 		    if (cmpltr < 0)
   4098 		      {
   4099 			s = save_s;
   4100 			cmpltr = pa_parse_neg_add_cmpltr (&s);
   4101 			if (cmpltr < 0)
   4102 			  {
   4103 			    as_bad (_("Invalid Compare/Subtract Condition"));
   4104 			    cmpltr = 0;
   4105 			  }
   4106 			else
   4107 			  {
   4108 			    /* Negated condition requires an opcode change.  */
   4109 			    opcode |= 1 << 27;
   4110 			  }
   4111 		      }
   4112 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4113 
   4114 		  /* Handle branch on bit conditions.  */
   4115 		  case 'B':
   4116 		  case 'b':
   4117 		    cmpltr = 0;
   4118 		    if (*s == ',')
   4119 		      {
   4120 			s++;
   4121 
   4122 			if (*args == 'B')
   4123 			  {
   4124 			    if (*s == '*')
   4125 			      s++;
   4126 			    else
   4127 			      break;
   4128 			  }
   4129 			else if (*s == '*')
   4130 			  break;
   4131 
   4132 			if (strncmp (s, "<", 1) == 0)
   4133 			  {
   4134 			    cmpltr = 0;
   4135 			    s++;
   4136 			  }
   4137 			else if (strncmp (s, ">=", 2) == 0)
   4138 			  {
   4139 			    cmpltr = 1;
   4140 			    s += 2;
   4141 			  }
   4142 			else
   4143 			  as_bad (_("Invalid Branch On Bit Condition: %c"), *s);
   4144 		      }
   4145 		    else
   4146 		      as_bad (_("Missing Branch On Bit Condition"));
   4147 
   4148 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15);
   4149 
   4150 		  /* Handle a compare/subtract condition.  */
   4151 		  case 'S':
   4152 		  case 's':
   4153 		    cmpltr = 0;
   4154 		    flag = 0;
   4155 		    if (*s == ',')
   4156 		      {
   4157 			s++;
   4158 
   4159 			/* 64 bit conditions.  */
   4160 			if (*args == 'S')
   4161 			  {
   4162 			    if (*s == '*')
   4163 			      s++;
   4164 			    else
   4165 			      break;
   4166 			  }
   4167 			else if (*s == '*')
   4168 			  break;
   4169 
   4170 			name = s;
   4171 			while (*s != ',' && *s != ' ' && *s != '\t')
   4172 			  s += 1;
   4173 			c = *s;
   4174 			*s = 0x00;
   4175 			if (strcmp (name, "=") == 0)
   4176 			  cmpltr = 1;
   4177 			else if (strcmp (name, "<") == 0)
   4178 			  cmpltr = 2;
   4179 			else if (strcmp (name, "<=") == 0)
   4180 			  cmpltr = 3;
   4181 			else if (strcasecmp (name, "<<") == 0)
   4182 			  cmpltr = 4;
   4183 			else if (strcasecmp (name, "<<=") == 0)
   4184 			  cmpltr = 5;
   4185 			else if (strcasecmp (name, "sv") == 0)
   4186 			  cmpltr = 6;
   4187 			else if (strcasecmp (name, "od") == 0)
   4188 			  cmpltr = 7;
   4189 			else if (strcasecmp (name, "tr") == 0)
   4190 			  {
   4191 			    cmpltr = 0;
   4192 			    flag = 1;
   4193 			  }
   4194 			else if (strcmp (name, "<>") == 0)
   4195 			  {
   4196 			    cmpltr = 1;
   4197 			    flag = 1;
   4198 			  }
   4199 			else if (strcmp (name, ">=") == 0)
   4200 			  {
   4201 			    cmpltr = 2;
   4202 			    flag = 1;
   4203 			  }
   4204 			else if (strcmp (name, ">") == 0)
   4205 			  {
   4206 			    cmpltr = 3;
   4207 			    flag = 1;
   4208 			  }
   4209 			else if (strcasecmp (name, ">>=") == 0)
   4210 			  {
   4211 			    cmpltr = 4;
   4212 			    flag = 1;
   4213 			  }
   4214 			else if (strcasecmp (name, ">>") == 0)
   4215 			  {
   4216 			    cmpltr = 5;
   4217 			    flag = 1;
   4218 			  }
   4219 			else if (strcasecmp (name, "nsv") == 0)
   4220 			  {
   4221 			    cmpltr = 6;
   4222 			    flag = 1;
   4223 			  }
   4224 			else if (strcasecmp (name, "ev") == 0)
   4225 			  {
   4226 			    cmpltr = 7;
   4227 			    flag = 1;
   4228 			  }
   4229 			/* ",*" is a valid condition.  */
   4230 			else if (*args != 'S' || *name)
   4231 			  as_bad (_("Invalid Compare/Subtract Condition: %s"),
   4232 				  name);
   4233 			*s = c;
   4234 		      }
   4235 		    /* Except with "db", we have a match failure with
   4236 		       'S' if we don't have a doubleword condition.  */
   4237 		    else if (*args == 'S' && need_cond)
   4238 		      break;
   4239 
   4240 		    opcode |= cmpltr << 13;
   4241 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4242 
   4243 		  /* Handle a non-negated compare condition.  */
   4244 		  case 't':
   4245 		    cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s);
   4246 		    if (cmpltr < 0)
   4247 		      {
   4248 			as_bad (_("Invalid Compare/Subtract Condition"));
   4249 			cmpltr = 0;
   4250 		      }
   4251 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4252 
   4253 		  /* Handle a 32 bit compare and branch condition.  */
   4254 		  case 'n':
   4255 		    save_s = s;
   4256 		    cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s);
   4257 		    if (cmpltr < 0)
   4258 		      {
   4259 			s = save_s;
   4260 			cmpltr = pa_parse_neg_cmpsub_cmpltr (&s);
   4261 			if (cmpltr < 0)
   4262 			  {
   4263 			    as_bad (_("Invalid Compare and Branch Condition"));
   4264 			    cmpltr = 0;
   4265 			  }
   4266 			else
   4267 			  {
   4268 			    /* Negated condition requires an opcode change.  */
   4269 			    opcode |= 1 << 27;
   4270 			  }
   4271 		      }
   4272 
   4273 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4274 
   4275 		  /* Handle a 64 bit compare and branch condition.  */
   4276 		  case 'N':
   4277 		    cmpltr = pa_parse_cmpb_64_cmpltr (&s);
   4278 		    if (cmpltr >= 0)
   4279 		      {
   4280 			/* Negated condition requires an opcode change.  */
   4281 			opcode |= (cmpltr & 8) << 26;
   4282 		      }
   4283 		    else
   4284 		      /* Not a 64 bit cond.  Give 32 bit a chance.  */
   4285 		      break;
   4286 
   4287 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
   4288 
   4289 		  /* Handle a 64 bit cmpib condition.  */
   4290 		  case 'Q':
   4291 		    cmpltr = pa_parse_cmpib_64_cmpltr (&s);
   4292 		    if (cmpltr < 0)
   4293 		      /* Not a 64 bit cond.  Give 32 bit a chance.  */
   4294 		      break;
   4295 
   4296 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4297 
   4298 		  /* Handle a logical instruction condition.  */
   4299 		  case 'L':
   4300 		  case 'l':
   4301 		    cmpltr = 0;
   4302 		    flag = 0;
   4303 		    if (*s == ',')
   4304 		      {
   4305 			s++;
   4306 
   4307 			/* 64 bit conditions.  */
   4308 			if (*args == 'L')
   4309 			  {
   4310 			    if (*s == '*')
   4311 			      s++;
   4312 			    else
   4313 			      break;
   4314 			  }
   4315 			else if (*s == '*')
   4316 			  break;
   4317 
   4318 			name = s;
   4319 			while (*s != ',' && *s != ' ' && *s != '\t')
   4320 			  s += 1;
   4321 			c = *s;
   4322 			*s = 0x00;
   4323 
   4324 			if (strcmp (name, "=") == 0)
   4325 			  cmpltr = 1;
   4326 			else if (strcmp (name, "<") == 0)
   4327 			  cmpltr = 2;
   4328 			else if (strcmp (name, "<=") == 0)
   4329 			  cmpltr = 3;
   4330 			else if (strcasecmp (name, "od") == 0)
   4331 			  cmpltr = 7;
   4332 			else if (strcasecmp (name, "tr") == 0)
   4333 			  {
   4334 			    cmpltr = 0;
   4335 			    flag = 1;
   4336 			  }
   4337 			else if (strcmp (name, "<>") == 0)
   4338 			  {
   4339 			    cmpltr = 1;
   4340 			    flag = 1;
   4341 			  }
   4342 			else if (strcmp (name, ">=") == 0)
   4343 			  {
   4344 			    cmpltr = 2;
   4345 			    flag = 1;
   4346 			  }
   4347 			else if (strcmp (name, ">") == 0)
   4348 			  {
   4349 			    cmpltr = 3;
   4350 			    flag = 1;
   4351 			  }
   4352 			else if (strcasecmp (name, "ev") == 0)
   4353 			  {
   4354 			    cmpltr = 7;
   4355 			    flag = 1;
   4356 			  }
   4357 			/* ",*" is a valid condition.  */
   4358 			else if (*args != 'L' || *name)
   4359 			  as_bad (_("Invalid Logical Instruction Condition."));
   4360 			*s = c;
   4361 		      }
   4362 		    /* 32-bit is default for no condition.  */
   4363 		    else if (*args == 'L')
   4364 		      break;
   4365 
   4366 		    opcode |= cmpltr << 13;
   4367 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4368 
   4369 		  /* Handle a shift/extract/deposit condition.  */
   4370 		  case 'X':
   4371 		  case 'x':
   4372 		  case 'y':
   4373 		    cmpltr = 0;
   4374 		    /* Check immediate values in shift/extract/deposit
   4375 		     * instructions if they will give undefined behaviour.  */
   4376 		    immediate_check = 1;
   4377 		    if (*s == ',')
   4378 		      {
   4379 			save_s = s++;
   4380 
   4381 			/* 64 bit conditions.  */
   4382 			if (*args == 'X')
   4383 			  {
   4384 			    if (*s == '*')
   4385 			      s++;
   4386 			    else
   4387 			      break;
   4388 			  }
   4389 			else if (*s == '*')
   4390 			  break;
   4391 
   4392 			name = s;
   4393 			while (*s != ',' && *s != ' ' && *s != '\t')
   4394 			  s += 1;
   4395 			c = *s;
   4396 			*s = 0x00;
   4397 			if (strcmp (name, "=") == 0)
   4398 			  cmpltr = 1;
   4399 			else if (strcmp (name, "<") == 0)
   4400 			  cmpltr = 2;
   4401 			else if (strcasecmp (name, "od") == 0)
   4402 			  cmpltr = 3;
   4403 			else if (strcasecmp (name, "tr") == 0)
   4404 			  cmpltr = 4;
   4405 			else if (strcmp (name, "<>") == 0)
   4406 			  cmpltr = 5;
   4407 			else if (strcmp (name, ">=") == 0)
   4408 			  cmpltr = 6;
   4409 			else if (strcasecmp (name, "ev") == 0)
   4410 			  cmpltr = 7;
   4411 			/* Handle movb,n.  Put things back the way they were.
   4412 			   This includes moving s back to where it started.  */
   4413 			else if (strcasecmp (name, "n") == 0 && *args == 'y')
   4414 			  {
   4415 			    *s = c;
   4416 			    s = save_s;
   4417 			    continue;
   4418 			  }
   4419 			/* ",*" is a valid condition.  */
   4420 			else if (*args != 'X' || *name)
   4421 			  as_bad (_("Invalid Shift/Extract/Deposit Condition."));
   4422 			*s = c;
   4423 		      }
   4424 
   4425 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4426 
   4427 		  /* Handle a unit instruction condition.  */
   4428 		  case 'U':
   4429 		  case 'u':
   4430 		    cmpltr = 0;
   4431 		    flag = 0;
   4432 		    if (*s == ',')
   4433 		      {
   4434 			int uxor;
   4435 			s++;
   4436 
   4437 			/* 64 bit conditions.  */
   4438 			if (*args == 'U')
   4439 			  {
   4440 			    if (*s == '*')
   4441 			      s++;
   4442 			    else
   4443 			      break;
   4444 			  }
   4445 			else if (*s == '*')
   4446 			  break;
   4447 
   4448 			/* The uxor instruction only supports unit conditions
   4449 			   not involving carries.  */
   4450 			uxor = (opcode & 0xfc000fc0) == 0x08000380;
   4451 			if (strncasecmp (s, "sbz", 3) == 0)
   4452 			  {
   4453 			    cmpltr = 2;
   4454 			    s += 3;
   4455 			  }
   4456 			else if (strncasecmp (s, "shz", 3) == 0)
   4457 			  {
   4458 			    cmpltr = 3;
   4459 			    s += 3;
   4460 			  }
   4461 			else if (!uxor && strncasecmp (s, "sdc", 3) == 0)
   4462 			  {
   4463 			    cmpltr = 4;
   4464 			    s += 3;
   4465 			  }
   4466 			else if (!uxor && strncasecmp (s, "sbc", 3) == 0)
   4467 			  {
   4468 			    cmpltr = 6;
   4469 			    s += 3;
   4470 			  }
   4471 			else if (!uxor && strncasecmp (s, "shc", 3) == 0)
   4472 			  {
   4473 			    cmpltr = 7;
   4474 			    s += 3;
   4475 			  }
   4476 			else if (strncasecmp (s, "tr", 2) == 0)
   4477 			  {
   4478 			    cmpltr = 0;
   4479 			    flag = 1;
   4480 			    s += 2;
   4481 			  }
   4482 			else if (strncasecmp (s, "nbz", 3) == 0)
   4483 			  {
   4484 			    cmpltr = 2;
   4485 			    flag = 1;
   4486 			    s += 3;
   4487 			  }
   4488 			else if (strncasecmp (s, "nhz", 3) == 0)
   4489 			  {
   4490 			    cmpltr = 3;
   4491 			    flag = 1;
   4492 			    s += 3;
   4493 			  }
   4494 			else if (!uxor && strncasecmp (s, "ndc", 3) == 0)
   4495 			  {
   4496 			    cmpltr = 4;
   4497 			    flag = 1;
   4498 			    s += 3;
   4499 			  }
   4500 			else if (!uxor && strncasecmp (s, "nbc", 3) == 0)
   4501 			  {
   4502 			    cmpltr = 6;
   4503 			    flag = 1;
   4504 			    s += 3;
   4505 			  }
   4506 			else if (!uxor && strncasecmp (s, "nhc", 3) == 0)
   4507 			  {
   4508 			    cmpltr = 7;
   4509 			    flag = 1;
   4510 			    s += 3;
   4511 			  }
   4512 			else if (strncasecmp (s, "swz", 3) == 0)
   4513 			  {
   4514 			    cmpltr = 1;
   4515 			    flag = 0;
   4516 			    s += 3;
   4517 			  }
   4518 			else if (!uxor && strncasecmp (s, "swc", 3) == 0)
   4519 			  {
   4520 			    cmpltr = 5;
   4521 			    flag = 0;
   4522 			    s += 3;
   4523 			  }
   4524 			else if (strncasecmp (s, "nwz", 3) == 0)
   4525 			  {
   4526 			    cmpltr = 1;
   4527 			    flag = 1;
   4528 			    s += 3;
   4529 			  }
   4530 			else if (!uxor && strncasecmp (s, "nwc", 3) == 0)
   4531 			  {
   4532 			    cmpltr = 5;
   4533 			    flag = 1;
   4534 			    s += 3;
   4535 			  }
   4536 			/* ",*" is a valid condition.  */
   4537 			else if (*args != 'U' || (*s != ' ' && *s != '\t'))
   4538 			  as_bad (_("Invalid Unit Instruction Condition."));
   4539 		      }
   4540 		    /* 32-bit is default for no condition.  */
   4541 		    else if (*args == 'U')
   4542 		      break;
   4543 
   4544 		    opcode |= cmpltr << 13;
   4545 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4546 
   4547 		  default:
   4548 		    abort ();
   4549 		  }
   4550 		break;
   4551 	      }
   4552 
   4553 	    /* Handle a nullification completer for branch instructions.  */
   4554 	    case 'n':
   4555 	      nullif = pa_parse_nullif (&s);
   4556 	      INSERT_FIELD_AND_CONTINUE (opcode, nullif, 1);
   4557 
   4558 	    /* Handle a nullification completer for copr and spop insns.  */
   4559 	    case 'N':
   4560 	      nullif = pa_parse_nullif (&s);
   4561 	      INSERT_FIELD_AND_CONTINUE (opcode, nullif, 5);
   4562 
   4563 	    /* Handle ,%r2 completer for new syntax branches.  */
   4564 	    case 'L':
   4565 	      if (*s == ',' && strncasecmp (s + 1, "%r2", 3) == 0)
   4566 		s += 4;
   4567 	      else if (*s == ',' && strncasecmp (s + 1, "%rp", 3) == 0)
   4568 		s += 4;
   4569 	      else
   4570 		break;
   4571 	      continue;
   4572 
   4573 	    /* Handle 3 bit entry into the fp compare array.   Valid values
   4574 	       are 0..6 inclusive.  */
   4575 	    case 'h':
   4576 	      get_expression (s);
   4577 	      s = expr_end;
   4578 	      if (the_insn.exp.X_op == O_constant)
   4579 		{
   4580 		  num = evaluate_absolute (&the_insn);
   4581 		  CHECK_FIELD (num, 6, 0, 0);
   4582 		  num++;
   4583 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
   4584 		}
   4585 	      else
   4586 		break;
   4587 
   4588 	    /* Handle 3 bit entry into the fp compare array.   Valid values
   4589 	       are 0..6 inclusive.  */
   4590 	    case 'm':
   4591 	      get_expression (s);
   4592 	      if (the_insn.exp.X_op == O_constant)
   4593 		{
   4594 		  s = expr_end;
   4595 		  num = evaluate_absolute (&the_insn);
   4596 		  CHECK_FIELD (num, 6, 0, 0);
   4597 		  num = (num + 1) ^ 1;
   4598 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
   4599 		}
   4600 	      else
   4601 		break;
   4602 
   4603 	    /* Handle graphics test completers for ftest */
   4604 	    case '=':
   4605 	      {
   4606 		num = pa_parse_ftest_gfx_completer (&s);
   4607 		INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4608 	      }
   4609 
   4610 	    /* Handle a 11 bit immediate at 31.  */
   4611 	    case 'i':
   4612 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4613 	      get_expression (s);
   4614 	      s = expr_end;
   4615 	      if (the_insn.exp.X_op == O_constant)
   4616 		{
   4617 		  num = evaluate_absolute (&the_insn);
   4618 		  CHECK_FIELD (num, 1023, -1024, 0);
   4619 		  num = low_sign_unext (num, 11);
   4620 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4621 		}
   4622 	      else
   4623 		{
   4624 		  if (is_DP_relative (the_insn.exp))
   4625 		    the_insn.reloc = R_HPPA_GOTOFF;
   4626 		  else if (is_PC_relative (the_insn.exp))
   4627 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4628 #ifdef OBJ_ELF
   4629 		  else if (is_tls_gdidx (the_insn.exp))
   4630 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4631 		  else if (is_tls_ldidx (the_insn.exp))
   4632 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4633 		  else if (is_tls_dtpoff (the_insn.exp))
   4634 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4635 		  else if (is_tls_ieoff (the_insn.exp))
   4636 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4637 		  else if (is_tls_leoff (the_insn.exp))
   4638 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4639 #endif
   4640 		  else
   4641 		    the_insn.reloc = R_HPPA;
   4642 		  the_insn.format = 11;
   4643 		  continue;
   4644 		}
   4645 
   4646 	    /* Handle a 14 bit immediate at 31.  */
   4647 	    case 'J':
   4648 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4649 	      get_expression (s);
   4650 	      s = expr_end;
   4651 	      if (the_insn.exp.X_op == O_constant)
   4652 		{
   4653 		  int mb;
   4654 
   4655 		  /* XXX the completer stored away tidbits of information
   4656 		     for us to extract.  We need a cleaner way to do this.
   4657 		     Now that we have lots of letters again, it would be
   4658 		     good to rethink this.  */
   4659 		  mb = opcode & 1;
   4660 		  opcode -= mb;
   4661 		  num = evaluate_absolute (&the_insn);
   4662 		  if (mb != (num < 0))
   4663 		    break;
   4664 		  CHECK_FIELD (num, 8191, -8192, 0);
   4665 		  num = low_sign_unext (num, 14);
   4666 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4667 		}
   4668 	      break;
   4669 
   4670 	    /* Handle a 14 bit immediate at 31.  */
   4671 	    case 'K':
   4672 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4673 	      get_expression (s);
   4674 	      s = expr_end;
   4675 	      if (the_insn.exp.X_op == O_constant)
   4676 		{
   4677 		  int mb;
   4678 
   4679 		  mb = opcode & 1;
   4680 		  opcode -= mb;
   4681 		  num = evaluate_absolute (&the_insn);
   4682 		  if (mb == (num < 0))
   4683 		    break;
   4684 		  if (num % 4)
   4685 		    break;
   4686 		  CHECK_FIELD (num, 8191, -8192, 0);
   4687 		  num = low_sign_unext (num, 14);
   4688 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4689 		}
   4690 	      break;
   4691 
   4692 	    /* Handle a 16 bit immediate at 31.  */
   4693 	    case '<':
   4694 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4695 	      get_expression (s);
   4696 	      s = expr_end;
   4697 	      if (the_insn.exp.X_op == O_constant)
   4698 		{
   4699 		  int mb;
   4700 
   4701 		  mb = opcode & 1;
   4702 		  opcode -= mb;
   4703 		  num = evaluate_absolute (&the_insn);
   4704 		  if (mb != (num < 0))
   4705 		    break;
   4706 		  CHECK_FIELD (num, 32767, -32768, 0);
   4707 		  num = re_assemble_16 (num);
   4708 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4709 		}
   4710 	      break;
   4711 
   4712 	    /* Handle a 16 bit immediate at 31.  */
   4713 	    case '>':
   4714 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4715 	      get_expression (s);
   4716 	      s = expr_end;
   4717 	      if (the_insn.exp.X_op == O_constant)
   4718 		{
   4719 		  int mb;
   4720 
   4721 		  mb = opcode & 1;
   4722 		  opcode -= mb;
   4723 		  num = evaluate_absolute (&the_insn);
   4724 		  if (mb == (num < 0))
   4725 		    break;
   4726 		  if (num % 4)
   4727 		    break;
   4728 		  CHECK_FIELD (num, 32767, -32768, 0);
   4729 		  num = re_assemble_16 (num);
   4730 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4731 		}
   4732 	      break;
   4733 
   4734 	    /* Handle 14 bit immediate, shifted left three times.  */
   4735 	    case '#':
   4736 	      if (bfd_get_mach (stdoutput) != pa20)
   4737 		break;
   4738 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4739 	      get_expression (s);
   4740 	      s = expr_end;
   4741 	      if (the_insn.exp.X_op == O_constant)
   4742 		{
   4743 		  num = evaluate_absolute (&the_insn);
   4744 		  if (num & 0x7)
   4745 		    break;
   4746 		  CHECK_FIELD (num, 8191, -8192, 0);
   4747 		  if (num < 0)
   4748 		    opcode |= 1;
   4749 		  num &= 0x1fff;
   4750 		  num >>= 3;
   4751 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 4);
   4752 		}
   4753 	      else
   4754 		{
   4755 		  if (is_DP_relative (the_insn.exp))
   4756 		    the_insn.reloc = R_HPPA_GOTOFF;
   4757 		  else if (is_PC_relative (the_insn.exp))
   4758 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4759 #ifdef OBJ_ELF
   4760 		  else if (is_tls_gdidx (the_insn.exp))
   4761 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4762 		  else if (is_tls_ldidx (the_insn.exp))
   4763 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4764 		  else if (is_tls_dtpoff (the_insn.exp))
   4765 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4766 		  else if (is_tls_ieoff (the_insn.exp))
   4767 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4768 		  else if (is_tls_leoff (the_insn.exp))
   4769 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4770 #endif
   4771 		  else
   4772 		    the_insn.reloc = R_HPPA;
   4773 		  the_insn.format = 14;
   4774 		  continue;
   4775 		}
   4776 	      break;
   4777 
   4778 	    /* Handle 14 bit immediate, shifted left twice.  */
   4779 	    case 'd':
   4780 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4781 	      get_expression (s);
   4782 	      s = expr_end;
   4783 	      if (the_insn.exp.X_op == O_constant)
   4784 		{
   4785 		  num = evaluate_absolute (&the_insn);
   4786 		  if (num & 0x3)
   4787 		    break;
   4788 		  CHECK_FIELD (num, 8191, -8192, 0);
   4789 		  if (num < 0)
   4790 		    opcode |= 1;
   4791 		  num &= 0x1fff;
   4792 		  num >>= 2;
   4793 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
   4794 		}
   4795 	      else
   4796 		{
   4797 		  if (is_DP_relative (the_insn.exp))
   4798 		    the_insn.reloc = R_HPPA_GOTOFF;
   4799 		  else if (is_PC_relative (the_insn.exp))
   4800 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4801 #ifdef OBJ_ELF
   4802 		  else if (is_tls_gdidx (the_insn.exp))
   4803 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4804 		  else if (is_tls_ldidx (the_insn.exp))
   4805 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4806 		  else if (is_tls_dtpoff (the_insn.exp))
   4807 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4808 		  else if (is_tls_ieoff (the_insn.exp))
   4809 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4810 		  else if (is_tls_leoff (the_insn.exp))
   4811 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4812 #endif
   4813 		  else
   4814 		    the_insn.reloc = R_HPPA;
   4815 		  the_insn.format = 14;
   4816 		  continue;
   4817 		}
   4818 
   4819 	    /* Handle a 14 bit immediate at 31.  */
   4820 	    case 'j':
   4821 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4822 	      get_expression (s);
   4823 	      s = expr_end;
   4824 	      if (the_insn.exp.X_op == O_constant)
   4825 		{
   4826 		  num = evaluate_absolute (&the_insn);
   4827 		  CHECK_FIELD (num, 8191, -8192, 0);
   4828 		  num = low_sign_unext (num, 14);
   4829 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4830 		}
   4831 	      else
   4832 		{
   4833 		  if (is_DP_relative (the_insn.exp))
   4834 		    the_insn.reloc = R_HPPA_GOTOFF;
   4835 		  else if (is_PC_relative (the_insn.exp))
   4836 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4837 #ifdef OBJ_ELF
   4838 		  else if (is_tls_gdidx (the_insn.exp))
   4839 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4840 		  else if (is_tls_ldidx (the_insn.exp))
   4841 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4842 		  else if (is_tls_dtpoff (the_insn.exp))
   4843 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4844 		  else if (is_tls_ieoff (the_insn.exp))
   4845 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4846 		  else if (is_tls_leoff (the_insn.exp))
   4847 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4848 #endif
   4849 		  else
   4850 		    the_insn.reloc = R_HPPA;
   4851 		  the_insn.format = 14;
   4852 		  continue;
   4853 		}
   4854 
   4855 	    /* Handle a 21 bit immediate at 31.  */
   4856 	    case 'k':
   4857 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4858 	      get_expression (s);
   4859 	      s = expr_end;
   4860 	      if (the_insn.exp.X_op == O_constant)
   4861 		{
   4862 		  num = evaluate_absolute (&the_insn);
   4863 		  CHECK_FIELD (num >> 11, 1048575, -1048576, 0);
   4864 		  opcode |= re_assemble_21 (num);
   4865 		  continue;
   4866 		}
   4867 	      else
   4868 		{
   4869 		  if (is_DP_relative (the_insn.exp))
   4870 		    the_insn.reloc = R_HPPA_GOTOFF;
   4871 		  else if (is_PC_relative (the_insn.exp))
   4872 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4873 #ifdef OBJ_ELF
   4874 		  else if (is_tls_gdidx (the_insn.exp))
   4875 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4876 		  else if (is_tls_ldidx (the_insn.exp))
   4877 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4878 		  else if (is_tls_dtpoff (the_insn.exp))
   4879 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4880 		  else if (is_tls_ieoff (the_insn.exp))
   4881 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4882 		  else if (is_tls_leoff (the_insn.exp))
   4883 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4884 #endif
   4885 		  else
   4886 		    the_insn.reloc = R_HPPA;
   4887 		  the_insn.format = 21;
   4888 		  continue;
   4889 		}
   4890 
   4891 	    /* Handle a 16 bit immediate at 31 (PA 2.0 wide mode only).  */
   4892 	    case 'l':
   4893 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4894 	      get_expression (s);
   4895 	      s = expr_end;
   4896 	      if (the_insn.exp.X_op == O_constant)
   4897 		{
   4898 		  num = evaluate_absolute (&the_insn);
   4899 		  CHECK_FIELD (num, 32767, -32768, 0);
   4900 		  opcode |= re_assemble_16 (num);
   4901 		  continue;
   4902 		}
   4903 	      else
   4904 		{
   4905 		  /* ??? Is this valid for wide mode?  */
   4906 		  if (is_DP_relative (the_insn.exp))
   4907 		    the_insn.reloc = R_HPPA_GOTOFF;
   4908 		  else if (is_PC_relative (the_insn.exp))
   4909 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4910 #ifdef OBJ_ELF
   4911 		  else if (is_tls_gdidx (the_insn.exp))
   4912 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4913 		  else if (is_tls_ldidx (the_insn.exp))
   4914 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4915 		  else if (is_tls_dtpoff (the_insn.exp))
   4916 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4917 		  else if (is_tls_ieoff (the_insn.exp))
   4918 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4919 		  else if (is_tls_leoff (the_insn.exp))
   4920 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4921 #endif
   4922 		  else
   4923 		    the_insn.reloc = R_HPPA;
   4924 		  the_insn.format = 14;
   4925 		  continue;
   4926 		}
   4927 
   4928 	    /* Handle a word-aligned 16-bit imm. at 31 (PA2.0 wide).  */
   4929 	    case 'y':
   4930 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4931 	      get_expression (s);
   4932 	      s = expr_end;
   4933 	      if (the_insn.exp.X_op == O_constant)
   4934 		{
   4935 		  num = evaluate_absolute (&the_insn);
   4936 		  CHECK_FIELD (num, 32767, -32768, 0);
   4937 		  CHECK_ALIGN (num, 4, 0);
   4938 		  opcode |= re_assemble_16 (num);
   4939 		  continue;
   4940 		}
   4941 	      else
   4942 		{
   4943 		  /* ??? Is this valid for wide mode?  */
   4944 		  if (is_DP_relative (the_insn.exp))
   4945 		    the_insn.reloc = R_HPPA_GOTOFF;
   4946 		  else if (is_PC_relative (the_insn.exp))
   4947 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4948 #ifdef OBJ_ELF
   4949 		  else if (is_tls_gdidx (the_insn.exp))
   4950 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4951 		  else if (is_tls_ldidx (the_insn.exp))
   4952 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4953 		  else if (is_tls_dtpoff (the_insn.exp))
   4954 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4955 		  else if (is_tls_ieoff (the_insn.exp))
   4956 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4957 		  else if (is_tls_leoff (the_insn.exp))
   4958 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4959 #endif
   4960 		  else
   4961 		    the_insn.reloc = R_HPPA;
   4962 		  the_insn.format = 14;
   4963 		  continue;
   4964 		}
   4965 
   4966 	    /* Handle a dword-aligned 16-bit imm. at 31 (PA2.0 wide).  */
   4967 	    case '&':
   4968 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4969 	      get_expression (s);
   4970 	      s = expr_end;
   4971 	      if (the_insn.exp.X_op == O_constant)
   4972 		{
   4973 		  num = evaluate_absolute (&the_insn);
   4974 		  CHECK_FIELD (num, 32767, -32768, 0);
   4975 		  CHECK_ALIGN (num, 8, 0);
   4976 		  opcode |= re_assemble_16 (num);
   4977 		  continue;
   4978 		}
   4979 	      else
   4980 		{
   4981 		  /* ??? Is this valid for wide mode?  */
   4982 		  if (is_DP_relative (the_insn.exp))
   4983 		    the_insn.reloc = R_HPPA_GOTOFF;
   4984 		  else if (is_PC_relative (the_insn.exp))
   4985 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4986 #ifdef OBJ_ELF
   4987 		  else if (is_tls_gdidx (the_insn.exp))
   4988 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4989 		  else if (is_tls_ldidx (the_insn.exp))
   4990 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4991 		  else if (is_tls_dtpoff (the_insn.exp))
   4992 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4993 		  else if (is_tls_ieoff (the_insn.exp))
   4994 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4995 		  else if (is_tls_leoff (the_insn.exp))
   4996 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4997 #endif
   4998 		  else
   4999 		    the_insn.reloc = R_HPPA;
   5000 		  the_insn.format = 14;
   5001 		  continue;
   5002 		}
   5003 
   5004 	    /* Handle a 12 bit branch displacement.  */
   5005 	    case 'w':
   5006 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5007 	      get_expression (s);
   5008 	      s = expr_end;
   5009 	      the_insn.pcrel = 1;
   5010 	      if (!the_insn.exp.X_add_symbol
   5011 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   5012 			      FAKE_LABEL_NAME))
   5013 		{
   5014 		  num = evaluate_absolute (&the_insn);
   5015 		  if (num % 4)
   5016 		    {
   5017 		      as_bad (_("Branch to unaligned address"));
   5018 		      break;
   5019 		    }
   5020 		  if (the_insn.exp.X_add_symbol)
   5021 		    num -= 8;
   5022 		  CHECK_FIELD (num, 8191, -8192, 0);
   5023 		  opcode |= re_assemble_12 (num >> 2);
   5024 		  continue;
   5025 		}
   5026 	      else
   5027 		{
   5028 		  the_insn.reloc = R_HPPA_PCREL_CALL;
   5029 		  the_insn.format = 12;
   5030 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5031 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5032 		  s = expr_end;
   5033 		  continue;
   5034 		}
   5035 
   5036 	    /* Handle a 17 bit branch displacement.  */
   5037 	    case 'W':
   5038 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5039 	      get_expression (s);
   5040 	      s = expr_end;
   5041 	      the_insn.pcrel = 1;
   5042 	      if (!the_insn.exp.X_add_symbol
   5043 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   5044 			      FAKE_LABEL_NAME))
   5045 		{
   5046 		  num = evaluate_absolute (&the_insn);
   5047 		  if (num % 4)
   5048 		    {
   5049 		      as_bad (_("Branch to unaligned address"));
   5050 		      break;
   5051 		    }
   5052 		  if (the_insn.exp.X_add_symbol)
   5053 		    num -= 8;
   5054 		  CHECK_FIELD (num, 262143, -262144, 0);
   5055 		  opcode |= re_assemble_17 (num >> 2);
   5056 		  continue;
   5057 		}
   5058 	      else
   5059 		{
   5060 		  the_insn.reloc = R_HPPA_PCREL_CALL;
   5061 		  the_insn.format = 17;
   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 a 22 bit branch displacement.  */
   5068 	    case 'X':
   5069 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5070 	      get_expression (s);
   5071 	      s = expr_end;
   5072 	      the_insn.pcrel = 1;
   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, 8388607, -8388608, 0);
   5086 		  opcode |= re_assemble_22 (num >> 2);
   5087 		}
   5088 	      else
   5089 		{
   5090 		  the_insn.reloc = R_HPPA_PCREL_CALL;
   5091 		  the_insn.format = 22;
   5092 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5093 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5094 		  continue;
   5095 		}
   5096 
   5097 	    /* Handle an absolute 17 bit branch target.  */
   5098 	    case 'z':
   5099 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5100 	      get_expression (s);
   5101 	      s = expr_end;
   5102 	      the_insn.pcrel = 0;
   5103 	      if (!the_insn.exp.X_add_symbol
   5104 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   5105 			      FAKE_LABEL_NAME))
   5106 		{
   5107 		  num = evaluate_absolute (&the_insn);
   5108 		  if (num % 4)
   5109 		    {
   5110 		      as_bad (_("Branch to unaligned address"));
   5111 		      break;
   5112 		    }
   5113 		  if (the_insn.exp.X_add_symbol)
   5114 		    num -= 8;
   5115 		  CHECK_FIELD (num, 262143, -262144, 0);
   5116 		  opcode |= re_assemble_17 (num >> 2);
   5117 		  continue;
   5118 		}
   5119 	      else
   5120 		{
   5121 		  the_insn.reloc = R_HPPA_ABS_CALL;
   5122 		  the_insn.format = 17;
   5123 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5124 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5125 		  continue;
   5126 		}
   5127 
   5128 	    /* Handle '%r1' implicit operand of addil instruction.  */
   5129 	    case 'Z':
   5130 	      if (*s == ',' && *(s + 1) == '%' && *(s + 3) == '1'
   5131 		  && (*(s + 2) == 'r' || *(s + 2) == 'R'))
   5132 		{
   5133 		  s += 4;
   5134 		  continue;
   5135 		}
   5136 	      else
   5137 		break;
   5138 
   5139 	    /* Handle '%sr0,%r31' implicit operand of be,l instruction.  */
   5140 	    case 'Y':
   5141 	      if (strncasecmp (s, "%sr0,%r31", 9) != 0)
   5142 		break;
   5143 	      s += 9;
   5144 	      continue;
   5145 
   5146 	    /* Handle immediate value of 0 for ordered load/store instructions.  */
   5147 	    case '@':
   5148 	      if (*s != '0')
   5149 		break;
   5150 	      s++;
   5151 	      continue;
   5152 
   5153 	    /* Handle a 2 bit shift count at 25.  */
   5154 	    case '.':
   5155 	      num = pa_get_absolute_expression (&the_insn, &s);
   5156 	      if (strict && the_insn.exp.X_op != O_constant)
   5157 		break;
   5158 	      s = expr_end;
   5159 	      CHECK_FIELD (num, 3, 1, strict);
   5160 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5161 
   5162 	    /* Handle a 4 bit shift count at 25.  */
   5163 	    case '*':
   5164 	      num = pa_get_absolute_expression (&the_insn, &s);
   5165 	      if (strict && the_insn.exp.X_op != O_constant)
   5166 		break;
   5167 	      s = expr_end;
   5168 	      CHECK_FIELD (num, 15, 0, strict);
   5169 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5170 
   5171 	    /* Handle a 5 bit shift count at 26.  */
   5172 	    case 'p':
   5173 	      num = pa_get_absolute_expression (&the_insn, &s);
   5174 	      if (strict && the_insn.exp.X_op != O_constant)
   5175 		break;
   5176 	      s = expr_end;
   5177 	      CHECK_FIELD (num, 31, 0, strict);
   5178 	      SAVE_IMMEDIATE(num);
   5179 	      INSERT_FIELD_AND_CONTINUE (opcode, 31 - num, 5);
   5180 
   5181 	    /* Handle a 6 bit shift count at 20,22:26.  */
   5182 	    case '~':
   5183 	      num = pa_get_absolute_expression (&the_insn, &s);
   5184 	      if (strict && the_insn.exp.X_op != O_constant)
   5185 		break;
   5186 	      s = expr_end;
   5187 	      CHECK_FIELD (num, 63, 0, strict);
   5188 	      SAVE_IMMEDIATE(num);
   5189 	      num = 63 - num;
   5190 	      opcode |= (num & 0x20) << 6;
   5191 	      INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5);
   5192 
   5193 	    /* Handle a 6 bit field length at 23,27:31.  */
   5194 	    case '%':
   5195 	      flag = 0;
   5196 	      num = pa_get_absolute_expression (&the_insn, &s);
   5197 	      if (strict && the_insn.exp.X_op != O_constant)
   5198 		break;
   5199 	      s = expr_end;
   5200 	      CHECK_FIELD (num, 64, 1, strict);
   5201 	      SAVE_IMMEDIATE(num);
   5202 	      num--;
   5203 	      opcode |= (num & 0x20) << 3;
   5204 	      num = 31 - (num & 0x1f);
   5205 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5206 
   5207 	    /* Handle a 6 bit field length at 19,27:31.  */
   5208 	    case '|':
   5209 	      num = pa_get_absolute_expression (&the_insn, &s);
   5210 	      if (strict && the_insn.exp.X_op != O_constant)
   5211 		break;
   5212 	      s = expr_end;
   5213 	      CHECK_FIELD (num, 64, 1, strict);
   5214 	      SAVE_IMMEDIATE(num);
   5215 	      num--;
   5216 	      opcode |= (num & 0x20) << 7;
   5217 	      num = 31 - (num & 0x1f);
   5218 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5219 
   5220 	    /* Handle a 5 bit bit position at 26.  */
   5221 	    case 'P':
   5222 	      num = pa_get_absolute_expression (&the_insn, &s);
   5223 	      if (strict && the_insn.exp.X_op != O_constant)
   5224 		break;
   5225 	      s = expr_end;
   5226 	      CHECK_FIELD (num, 31, 0, strict);
   5227 	      SAVE_IMMEDIATE(num);
   5228 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 5);
   5229 
   5230 	    /* Handle a 6 bit bit position at 20,22:26.  */
   5231 	    case 'q':
   5232 	      num = pa_get_absolute_expression (&the_insn, &s);
   5233 	      if (strict && the_insn.exp.X_op != O_constant)
   5234 		break;
   5235 	      s = expr_end;
   5236 	      CHECK_FIELD (num, 63, 0, strict);
   5237 	      SAVE_IMMEDIATE(num);
   5238 	      opcode |= (num & 0x20) << 6;
   5239 	      INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5);
   5240 
   5241 	    /* Handle a 5 bit immediate at 10 with 'd' as the complement
   5242 	       of the high bit of the immediate.  */
   5243 	    case 'B':
   5244 	      num = pa_get_absolute_expression (&the_insn, &s);
   5245 	      if (strict && the_insn.exp.X_op != O_constant)
   5246 		break;
   5247 	      s = expr_end;
   5248 	      CHECK_FIELD (num, 63, 0, strict);
   5249 	      if (num & 0x20)
   5250 		;
   5251 	      else
   5252 		opcode |= (1 << 13);
   5253 	      INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 21);
   5254 
   5255 	    /* Handle a 5 bit immediate at 10.  */
   5256 	    case 'Q':
   5257 	      num = pa_get_absolute_expression (&the_insn, &s);
   5258 	      if (strict && the_insn.exp.X_op != O_constant)
   5259 		break;
   5260 	      s = expr_end;
   5261 	      CHECK_FIELD (num, 31, 0, strict);
   5262 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   5263 
   5264 	    /* Handle a 9 bit immediate at 28.  */
   5265 	    case '$':
   5266 	      num = pa_get_absolute_expression (&the_insn, &s);
   5267 	      if (strict && the_insn.exp.X_op != O_constant)
   5268 		break;
   5269 	      s = expr_end;
   5270 	      CHECK_FIELD (num, 511, 1, strict);
   5271 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
   5272 
   5273 	    /* Handle a 13 bit immediate at 18.  */
   5274 	    case 'A':
   5275 	      num = pa_get_absolute_expression (&the_insn, &s);
   5276 	      if (strict && the_insn.exp.X_op != O_constant)
   5277 		break;
   5278 	      s = expr_end;
   5279 	      CHECK_FIELD (num, 8191, 0, strict);
   5280 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
   5281 
   5282 	    /* Handle a 26 bit immediate at 31.  */
   5283 	    case 'D':
   5284 	      num = pa_get_absolute_expression (&the_insn, &s);
   5285 	      if (strict && the_insn.exp.X_op != O_constant)
   5286 		break;
   5287 	      s = expr_end;
   5288 	      CHECK_FIELD (num, 67108863, 0, strict);
   5289 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5290 
   5291 	    /* Handle a 3 bit SFU identifier at 25.  */
   5292 	    case 'v':
   5293 	      if (*s++ != ',')
   5294 		as_bad (_("Invalid SFU identifier"));
   5295 	      num = pa_get_number (&the_insn, &s);