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