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