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