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