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