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