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