* remote.c (struct packet_reg): Declare.
[deliverable/binutils-gdb.git] / gas / config / tc-i960.c
CommitLineData
252b5132 1/* tc-i960.c - All the i80960-specific stuff
f7e42eb4
NC
2 Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001
252b5132
RH
4 Free Software Foundation, Inc.
5
6 This file is part of GAS.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
22
92774660 23/* See comment on md_parse_option for 80960-specific invocation options. */
252b5132
RH
24
25/* There are 4 different lengths of (potentially) symbol-based displacements
26 in the 80960 instruction set, each of which could require address fix-ups
27 and (in the case of external symbols) emission of relocation directives:
28
29 32-bit (MEMB)
30 This is a standard length for the base assembler and requires no
31 special action.
32
33 13-bit (COBR)
34 This is a non-standard length, but the base assembler has a
35 hook for bit field address fixups: the fixS structure can
36 point to a descriptor of the field, in which case our
37 md_number_to_field() routine gets called to process it.
38
39 I made the hook a little cleaner by having fix_new() (in the base
40 assembler) return a pointer to the fixS in question. And I made it a
41 little simpler by storing the field size (in this case 13) instead of
42 of a pointer to another structure: 80960 displacements are ALWAYS
43 stored in the low-order bits of a 4-byte word.
44
45 Since the target of a COBR cannot be external, no relocation
46 directives for this size displacement have to be generated.
47 But the base assembler had to be modified to issue error
48 messages if the symbol did turn out to be external.
49
50 24-bit (CTRL)
51 Fixups are handled as for the 13-bit case (except that 24 is stored
52 in the fixS).
53
54 The relocation directive generated is the same as that for the 32-bit
55 displacement, except that it's PC-relative (the 32-bit displacement
56 never is). The i80960 version of the linker needs a mod to
57 distinguish and handle the 24-bit case.
58
59 12-bit (MEMA)
60 MEMA formats are always promoted to MEMB (32-bit) if the displacement
61 is based on a symbol, because it could be relocated at link time.
62 The only time we use the 12-bit format is if an absolute value of
63 less than 4096 is specified, in which case we need neither a fixup nor
64 a relocation directive. */
65
66#include <stdio.h>
252b5132
RH
67
68#include "as.h"
69
3882b010 70#include "safe-ctype.h"
252b5132
RH
71#include "obstack.h"
72
73#include "opcode/i960.h"
74
75#if defined (OBJ_AOUT) || defined (OBJ_BOUT)
76
77#define TC_S_IS_SYSPROC(s) ((1<=S_GET_OTHER(s)) && (S_GET_OTHER(s)<=32))
78#define TC_S_IS_BALNAME(s) (S_GET_OTHER(s) == N_BALNAME)
79#define TC_S_IS_CALLNAME(s) (S_GET_OTHER(s) == N_CALLNAME)
80#define TC_S_IS_BADPROC(s) ((S_GET_OTHER(s) != 0) && !TC_S_IS_CALLNAME(s) && !TC_S_IS_BALNAME(s) && !TC_S_IS_SYSPROC(s))
81
82#define TC_S_SET_SYSPROC(s, p) (S_SET_OTHER((s), (p)+1))
83#define TC_S_GET_SYSPROC(s) (S_GET_OTHER(s)-1)
84
85#define TC_S_FORCE_TO_BALNAME(s) (S_SET_OTHER((s), N_BALNAME))
86#define TC_S_FORCE_TO_CALLNAME(s) (S_SET_OTHER((s), N_CALLNAME))
87#define TC_S_FORCE_TO_SYSPROC(s) {;}
88
89#else /* ! OBJ_A/BOUT */
90#ifdef OBJ_COFF
91
92#define TC_S_IS_SYSPROC(s) (S_GET_STORAGE_CLASS(s) == C_SCALL)
93#define TC_S_IS_BALNAME(s) (SF_GET_BALNAME(s))
94#define TC_S_IS_CALLNAME(s) (SF_GET_CALLNAME(s))
95#define TC_S_IS_BADPROC(s) (TC_S_IS_SYSPROC(s) && TC_S_GET_SYSPROC(s) < 0 && 31 < TC_S_GET_SYSPROC(s))
96
97#define TC_S_SET_SYSPROC(s, p) ((s)->sy_symbol.ost_auxent[1].x_sc.x_stindx = (p))
98#define TC_S_GET_SYSPROC(s) ((s)->sy_symbol.ost_auxent[1].x_sc.x_stindx)
99
100#define TC_S_FORCE_TO_BALNAME(s) (SF_SET_BALNAME(s))
101#define TC_S_FORCE_TO_CALLNAME(s) (SF_SET_CALLNAME(s))
102#define TC_S_FORCE_TO_SYSPROC(s) (S_SET_STORAGE_CLASS((s), C_SCALL))
103
104#else /* ! OBJ_COFF */
bedf545c
ILT
105#ifdef OBJ_ELF
106#define TC_S_IS_SYSPROC(s) 0
107
108#define TC_S_IS_BALNAME(s) 0
109#define TC_S_IS_CALLNAME(s) 0
110#define TC_S_IS_BADPROC(s) 0
111
112#define TC_S_SET_SYSPROC(s, p)
113#define TC_S_GET_SYSPROC(s) 0
114
115#define TC_S_FORCE_TO_BALNAME(s)
116#define TC_S_FORCE_TO_CALLNAME(s)
117#define TC_S_FORCE_TO_SYSPROC(s)
118#else
119 #error COFF, a.out, b.out, and ELF are the only supported formats.
120#endif /* ! OBJ_ELF */
252b5132
RH
121#endif /* ! OBJ_COFF */
122#endif /* ! OBJ_A/BOUT */
123
124extern char *input_line_pointer;
125
126#if !defined (BFD_ASSEMBLER) && !defined (BFD)
127#ifdef OBJ_COFF
128const int md_reloc_size = sizeof (struct reloc);
129#else /* OBJ_COFF */
130const int md_reloc_size = sizeof (struct relocation_info);
131#endif /* OBJ_COFF */
132#endif
133
134/* Local i80960 routines. */
135
136static void brcnt_emit (); /* Emit branch-prediction instrumentation code */
137static char *brlab_next (); /* Return next branch local label */
138void brtab_emit (); /* Emit br-predict instrumentation table */
139static void cobr_fmt (); /* Generate COBR instruction */
140static void ctrl_fmt (); /* Generate CTRL instruction */
141static char *emit (); /* Emit (internally) binary */
142static int get_args (); /* Break arguments out of comma-separated list */
143static void get_cdisp (); /* Handle COBR or CTRL displacement */
144static char *get_ispec (); /* Find index specification string */
145static int get_regnum (); /* Translate text to register number */
146static int i_scan (); /* Lexical scan of instruction source */
147static void mem_fmt (); /* Generate MEMA or MEMB instruction */
148static void mema_to_memb (); /* Convert MEMA instruction to MEMB format */
149static void parse_expr (); /* Parse an expression */
150static int parse_ldconst (); /* Parse and replace a 'ldconst' pseudo-op */
151static void parse_memop (); /* Parse a memory operand */
152static void parse_po (); /* Parse machine-dependent pseudo-op */
153static void parse_regop (); /* Parse a register operand */
154static void reg_fmt (); /* Generate a REG format instruction */
155void reloc_callj (); /* Relocate a 'callj' instruction */
156static void relax_cobr (); /* "De-optimize" cobr into compare/branch */
157static void s_leafproc (); /* Process '.leafproc' pseudo-op */
158static void s_sysproc (); /* Process '.sysproc' pseudo-op */
159static int shift_ok (); /* Will a 'shlo' substiture for a 'ldconst'? */
160static void syntax (); /* Give syntax error */
161static int targ_has_sfr (); /* Target chip supports spec-func register? */
162static int targ_has_iclass (); /* Target chip supports instruction set? */
163
164/* See md_parse_option() for meanings of these options */
165static char norelax; /* True if -norelax switch seen */
166static char instrument_branches; /* True if -b switch seen */
167
168/* Characters that always start a comment.
169 If the pre-processor is disabled, these aren't very useful.
170 */
171const char comment_chars[] = "#";
172
173/* Characters that only start a comment at the beginning of
174 a line. If the line seems to have the form '# 123 filename'
175 .line and .file directives will appear in the pre-processed output.
176
177 Note that input_file.c hand checks for '#' at the beginning of the
178 first line of the input file. This is because the compiler outputs
179 #NO_APP at the beginning of its output.
180 */
181
92774660 182/* Also note that comments started like this one will always work. */
252b5132 183
63a0b638 184const char line_comment_chars[] = "";
252b5132 185
63a0b638 186const char line_separator_chars[] = ";";
252b5132
RH
187
188/* Chars that can be used to separate mant from exp in floating point nums */
189const char EXP_CHARS[] = "eE";
190
191/* Chars that mean this number is a floating point constant,
192 as in 0f12.456 or 0d1.2345e12
193 */
194const char FLT_CHARS[] = "fFdDtT";
195
252b5132
RH
196/* Table used by base assembler to relax addresses based on varying length
197 instructions. The fields are:
198 1) most positive reach of this state,
199 2) most negative reach of this state,
200 3) how many bytes this mode will add to the size of the current frag
201 4) which index into the table to try if we can't fit into this one.
202
203 For i80960, the only application is the (de-)optimization of cobr
204 instructions into separate compare and branch instructions when a 13-bit
205 displacement won't hack it.
206 */
207const relax_typeS md_relax_table[] =
208{
209 {0, 0, 0, 0}, /* State 0 => no more relaxation possible */
210 {4088, -4096, 0, 2}, /* State 1: conditional branch (cobr) */
211 {0x800000 - 8, -0x800000, 4, 0}, /* State 2: compare (reg) & branch (ctrl) */
212};
213
214static void s_endian PARAMS ((int));
215
216/* These are the machine dependent pseudo-ops.
217
218 This table describes all the machine specific pseudo-ops the assembler
219 has to support. The fields are:
220 pseudo-op name without dot
221 function to call to execute this pseudo-op
222 integer arg to pass to the function
223 */
224#define S_LEAFPROC 1
225#define S_SYSPROC 2
226
227const pseudo_typeS md_pseudo_table[] =
228{
229 {"bss", s_lcomm, 1},
230 {"endian", s_endian, 0},
231 {"extended", float_cons, 't'},
232 {"leafproc", parse_po, S_LEAFPROC},
233 {"sysproc", parse_po, S_SYSPROC},
234
235 {"word", cons, 4},
236 {"quad", cons, 16},
237
238 {0, 0, 0}
239};
240\f
241/* Macros to extract info from an 'expressionS' structure 'e' */
242#define adds(e) e.X_add_symbol
243#define offs(e) e.X_add_number
244
252b5132
RH
245/* Branch-prediction bits for CTRL/COBR format opcodes */
246#define BP_MASK 0x00000002 /* Mask for branch-prediction bit */
247#define BP_TAKEN 0x00000000 /* Value to OR in to predict branch */
248#define BP_NOT_TAKEN 0x00000002 /* Value to OR in to predict no branch */
249
252b5132
RH
250/* Some instruction opcodes that we need explicitly */
251#define BE 0x12000000
252#define BG 0x11000000
253#define BGE 0x13000000
254#define BL 0x14000000
255#define BLE 0x16000000
256#define BNE 0x15000000
257#define BNO 0x10000000
258#define BO 0x17000000
259#define CHKBIT 0x5a002700
260#define CMPI 0x5a002080
261#define CMPO 0x5a002000
262
263#define B 0x08000000
264#define BAL 0x0b000000
265#define CALL 0x09000000
266#define CALLS 0x66003800
267#define RET 0x0a000000
268
92774660 269/* These masks are used to build up a set of MEMB mode bits. */
252b5132
RH
270#define A_BIT 0x0400
271#define I_BIT 0x0800
272#define MEMB_BIT 0x1000
273#define D_BIT 0x2000
274
252b5132
RH
275/* Mask for the only mode bit in a MEMA instruction (if set, abase reg is
276 used). */
277#define MEMA_ABASE 0x2000
278
279/* Info from which a MEMA or MEMB format instruction can be generated */
280typedef struct
281 {
282 /* (First) 32 bits of instruction */
283 long opcode;
284 /* 0-(none), 12- or, 32-bit displacement needed */
285 int disp;
286 /* The expression in the source instruction from which the
287 displacement should be determined. */
288 char *e;
289 }
290
291memS;
292
252b5132
RH
293/* The two pieces of info we need to generate a register operand */
294struct regop
295 {
296 int mode; /* 0 =>local/global/spec reg; 1=> literal or fp reg */
297 int special; /* 0 =>not a sfr; 1=> is a sfr (not valid w/mode=0) */
298 int n; /* Register number or literal value */
299 };
300
252b5132
RH
301/* Number and assembler mnemonic for all registers that can appear in
302 operands. */
303static const struct
304 {
305 char *reg_name;
306 int reg_num;
307 }
308regnames[] =
309{
310 { "pfp", 0 },
311 { "sp", 1 },
312 { "rip", 2 },
313 { "r3", 3 },
314 { "r4", 4 },
315 { "r5", 5 },
316 { "r6", 6 },
317 { "r7", 7 },
318 { "r8", 8 },
319 { "r9", 9 },
320 { "r10", 10 },
321 { "r11", 11 },
322 { "r12", 12 },
323 { "r13", 13 },
324 { "r14", 14 },
325 { "r15", 15 },
326 { "g0", 16 },
327 { "g1", 17 },
328 { "g2", 18 },
329 { "g3", 19 },
330 { "g4", 20 },
331 { "g5", 21 },
332 { "g6", 22 },
333 { "g7", 23 },
334 { "g8", 24 },
335 { "g9", 25 },
336 { "g10", 26 },
337 { "g11", 27 },
338 { "g12", 28 },
339 { "g13", 29 },
340 { "g14", 30 },
341 { "fp", 31 },
342
343 /* Numbers for special-function registers are for assembler internal
344 use only: they are scaled back to range [0-31] for binary output. */
345#define SF0 32
346
347 { "sf0", 32 },
348 { "sf1", 33 },
349 { "sf2", 34 },
350 { "sf3", 35 },
351 { "sf4", 36 },
352 { "sf5", 37 },
353 { "sf6", 38 },
354 { "sf7", 39 },
355 { "sf8", 40 },
356 { "sf9", 41 },
357 { "sf10", 42 },
358 { "sf11", 43 },
359 { "sf12", 44 },
360 { "sf13", 45 },
361 { "sf14", 46 },
362 { "sf15", 47 },
363 { "sf16", 48 },
364 { "sf17", 49 },
365 { "sf18", 50 },
366 { "sf19", 51 },
367 { "sf20", 52 },
368 { "sf21", 53 },
369 { "sf22", 54 },
370 { "sf23", 55 },
371 { "sf24", 56 },
372 { "sf25", 57 },
373 { "sf26", 58 },
374 { "sf27", 59 },
375 { "sf28", 60 },
376 { "sf29", 61 },
377 { "sf30", 62 },
378 { "sf31", 63 },
379
380 /* Numbers for floating point registers are for assembler internal
381 use only: they are scaled back to [0-3] for binary output. */
382#define FP0 64
383
384 { "fp0", 64 },
385 { "fp1", 65 },
386 { "fp2", 66 },
387 { "fp3", 67 },
388
389 { NULL, 0 }, /* END OF LIST */
390};
391
392#define IS_RG_REG(n) ((0 <= (n)) && ((n) < SF0))
393#define IS_SF_REG(n) ((SF0 <= (n)) && ((n) < FP0))
394#define IS_FP_REG(n) ((n) >= FP0)
395
396/* Number and assembler mnemonic for all registers that can appear as
397 'abase' (indirect addressing) registers. */
398static const struct
399 {
400 char *areg_name;
401 int areg_num;
402 }
403aregs[] =
404{
405 { "(pfp)", 0 },
406 { "(sp)", 1 },
407 { "(rip)", 2 },
408 { "(r3)", 3 },
409 { "(r4)", 4 },
410 { "(r5)", 5 },
411 { "(r6)", 6 },
412 { "(r7)", 7 },
413 { "(r8)", 8 },
414 { "(r9)", 9 },
415 { "(r10)", 10 },
416 { "(r11)", 11 },
417 { "(r12)", 12 },
418 { "(r13)", 13 },
419 { "(r14)", 14 },
420 { "(r15)", 15 },
421 { "(g0)", 16 },
422 { "(g1)", 17 },
423 { "(g2)", 18 },
424 { "(g3)", 19 },
425 { "(g4)", 20 },
426 { "(g5)", 21 },
427 { "(g6)", 22 },
428 { "(g7)", 23 },
429 { "(g8)", 24 },
430 { "(g9)", 25 },
431 { "(g10)", 26 },
432 { "(g11)", 27 },
433 { "(g12)", 28 },
434 { "(g13)", 29 },
435 { "(g14)", 30 },
436 { "(fp)", 31 },
437
438#define IPREL 32
439 /* For assembler internal use only: this number never appears in binary
440 output. */
441 { "(ip)", IPREL },
442
443 { NULL, 0 }, /* END OF LIST */
444};
445
252b5132
RH
446/* Hash tables */
447static struct hash_control *op_hash; /* Opcode mnemonics */
448static struct hash_control *reg_hash; /* Register name hash table */
449static struct hash_control *areg_hash; /* Abase register hash table */
450
252b5132
RH
451/* Architecture for which we are assembling */
452#define ARCH_ANY 0 /* Default: no architecture checking done */
453#define ARCH_KA 1
454#define ARCH_KB 2
455#define ARCH_MC 3
456#define ARCH_CA 4
457#define ARCH_JX 5
458#define ARCH_HX 6
459int architecture = ARCH_ANY; /* Architecture requested on invocation line */
460int iclasses_seen; /* OR of instruction classes (I_* constants)
461 * for which we've actually assembled
462 * instructions.
463 */
464
252b5132
RH
465/* BRANCH-PREDICTION INSTRUMENTATION
466
467 The following supports generation of branch-prediction instrumentation
468 (turned on by -b switch). The instrumentation collects counts
469 of branches taken/not-taken for later input to a utility that will
470 set the branch prediction bits of the instructions in accordance with
471 the behavior observed. (Note that the KX series does not have
472 brach-prediction.)
473
474 The instrumentation consists of:
475
476 (1) before and after each conditional branch, a call to an external
477 routine that increments and steps over an inline counter. The
478 counter itself, initialized to 0, immediately follows the call
479 instruction. For each branch, the counter following the branch
480 is the number of times the branch was not taken, and the difference
481 between the counters is the number of times it was taken. An
482 example of an instrumented conditional branch:
483
484 call BR_CNT_FUNC
485 .word 0
486 LBRANCH23: be label
487 call BR_CNT_FUNC
488 .word 0
489
490 (2) a table of pointers to the instrumented branches, so that an
491 external postprocessing routine can locate all of the counters.
492 the table begins with a 2-word header: a pointer to the next in
493 a linked list of such tables (initialized to 0); and a count
494 of the number of entries in the table (exclusive of the header.
495
496 Note that input source code is expected to already contain calls
497 an external routine that will link the branch local table into a
498 list of such tables.
499 */
500
501/* Number of branches instrumented so far. Also used to generate
502 unique local labels for each instrumented branch. */
503static int br_cnt;
504
505#define BR_LABEL_BASE "LBRANCH"
506/* Basename of local labels on instrumented branches, to avoid
507 conflict with compiler- generated local labels. */
508
509#define BR_CNT_FUNC "__inc_branch"
510/* Name of the external routine that will increment (and step over) an
511 inline counter. */
512
513#define BR_TAB_NAME "__BRANCH_TABLE__"
514/* Name of the table of pointers to branches. A local (i.e.,
515 non-external) symbol. */
516\f
517/*****************************************************************************
518 md_begin: One-time initialization.
519
520 Set up hash tables.
521
522 *************************************************************************** */
523void
524md_begin ()
525{
526 int i; /* Loop counter */
527 const struct i960_opcode *oP; /* Pointer into opcode table */
528 const char *retval; /* Value returned by hash functions */
529
530 op_hash = hash_new ();
531 reg_hash = hash_new ();
532 areg_hash = hash_new ();
533
534 /* For some reason, the base assembler uses an empty string for "no
535 error message", instead of a NULL pointer. */
536 retval = 0;
537
538 for (oP = i960_opcodes; oP->name && !retval; oP++)
539 retval = hash_insert (op_hash, oP->name, (PTR) oP);
540
541 for (i = 0; regnames[i].reg_name && !retval; i++)
542 retval = hash_insert (reg_hash, regnames[i].reg_name,
543 (char *) &regnames[i].reg_num);
544
545 for (i = 0; aregs[i].areg_name && !retval; i++)
546 retval = hash_insert (areg_hash, aregs[i].areg_name,
547 (char *) &aregs[i].areg_num);
548
549 if (retval)
550 as_fatal (_("Hashing returned \"%s\"."), retval);
551}
552
553/*****************************************************************************
554 md_assemble: Assemble an instruction
555
556 Assumptions about the passed-in text:
557 - all comments, labels removed
558 - text is an instruction
559 - all white space compressed to single blanks
560 - all character constants have been replaced with decimal
561
562 *************************************************************************** */
563void
564md_assemble (textP)
565 char *textP; /* Source text of instruction */
566{
567 /* Parsed instruction text, containing NO whitespace: arg[0]->opcode
568 mnemonic arg[1-3]->operands, with char constants replaced by
569 decimal numbers. */
570 char *args[4];
571
572 int n_ops; /* Number of instruction operands */
573 /* Pointer to instruction description */
574 struct i960_opcode *oP;
575 /* TRUE iff opcode mnemonic included branch-prediction suffix (".f"
576 or ".t"). */
577 int branch_predict;
578 /* Setting of branch-prediction bit(s) to be OR'd into instruction
579 opcode of CTRL/COBR format instructions. */
580 long bp_bits;
581
582 int n; /* Offset of last character in opcode mnemonic */
583
584 const char *bp_error_msg = _("branch prediction invalid on this opcode");
585
252b5132
RH
586 /* Parse instruction into opcode and operands */
587 memset (args, '\0', sizeof (args));
588 n_ops = i_scan (textP, args);
589 if (n_ops == -1)
590 {
591 return; /* Error message already issued */
592 }
593
594 /* Do "macro substitution" (sort of) on 'ldconst' pseudo-instruction */
595 if (!strcmp (args[0], "ldconst"))
596 {
597 n_ops = parse_ldconst (args);
598 if (n_ops == -1)
599 {
600 return;
601 }
602 }
603
252b5132
RH
604 /* Check for branch-prediction suffix on opcode mnemonic, strip it off */
605 n = strlen (args[0]) - 1;
606 branch_predict = 0;
607 bp_bits = 0;
608 if (args[0][n - 1] == '.' && (args[0][n] == 't' || args[0][n] == 'f'))
609 {
610 /* We could check here to see if the target architecture
611 supports branch prediction, but why bother? The bit will
612 just be ignored by processors that don't use it. */
613 branch_predict = 1;
614 bp_bits = (args[0][n] == 't') ? BP_TAKEN : BP_NOT_TAKEN;
615 args[0][n - 1] = '\0'; /* Strip suffix from opcode mnemonic */
616 }
617
618 /* Look up opcode mnemonic in table and check number of operands.
619 Check that opcode is legal for the target architecture. If all
620 looks good, assemble instruction. */
621 oP = (struct i960_opcode *) hash_find (op_hash, args[0]);
622 if (!oP || !targ_has_iclass (oP->iclass))
623 {
624 as_bad (_("invalid opcode, \"%s\"."), args[0]);
625
626 }
627 else if (n_ops != oP->num_ops)
628 {
629 as_bad (_("improper number of operands. expecting %d, got %d"),
630 oP->num_ops, n_ops);
631 }
632 else
633 {
634 switch (oP->format)
635 {
636 case FBRA:
637 case CTRL:
638 ctrl_fmt (args[1], oP->opcode | bp_bits, oP->num_ops);
639 if (oP->format == FBRA)
640 {
641 /* Now generate a 'bno' to same arg */
642 ctrl_fmt (args[1], BNO | bp_bits, 1);
643 }
644 break;
645 case COBR:
646 case COJ:
647 cobr_fmt (args, oP->opcode | bp_bits, oP);
648 break;
649 case REG:
650 if (branch_predict)
651 {
652 as_warn (bp_error_msg);
653 }
654 reg_fmt (args, oP);
655 break;
656 case MEM1:
657 if (args[0][0] == 'c' && args[0][1] == 'a')
658 {
659 if (branch_predict)
660 {
661 as_warn (bp_error_msg);
662 }
663 mem_fmt (args, oP, 1);
664 break;
665 }
666 case MEM2:
667 case MEM4:
668 case MEM8:
669 case MEM12:
670 case MEM16:
671 if (branch_predict)
672 {
673 as_warn (bp_error_msg);
674 }
675 mem_fmt (args, oP, 0);
676 break;
677 case CALLJ:
678 if (branch_predict)
679 {
680 as_warn (bp_error_msg);
681 }
682 /* Output opcode & set up "fixup" (relocation); flag
683 relocation as 'callj' type. */
684 know (oP->num_ops == 1);
685 get_cdisp (args[1], "CTRL", oP->opcode, 24, 0, 1);
686 break;
687 default:
688 BAD_CASE (oP->format);
689 break;
690 }
691 }
692} /* md_assemble() */
693
694/*****************************************************************************
695 md_number_to_chars: convert a number to target byte order
696
697 *************************************************************************** */
698void
699md_number_to_chars (buf, value, n)
700 char *buf;
701 valueT value;
702 int n;
703{
704 number_to_chars_littleendian (buf, value, n);
705}
706
707/*****************************************************************************
708 md_chars_to_number: convert from target byte order to host byte order.
709
710 *************************************************************************** */
711int
712md_chars_to_number (val, n)
713 unsigned char *val; /* Value in target byte order */
714 int n; /* Number of bytes in the input */
715{
716 int retval;
717
718 for (retval = 0; n--;)
719 {
720 retval <<= 8;
721 retval |= val[n];
722 }
723 return retval;
724}
725
252b5132 726#define MAX_LITTLENUMS 6
bc805888 727#define LNUM_SIZE sizeof (LITTLENUM_TYPE)
252b5132
RH
728
729/*****************************************************************************
730 md_atof: convert ascii to floating point
731
732 Turn a string at input_line_pointer into a floating point constant of type
733 'type', and store the appropriate bytes at *litP. The number of LITTLENUMS
734 emitted is returned at 'sizeP'. An error message is returned, or a pointer
735 to an empty message if OK.
736
737 Note we call the i386 floating point routine, rather than complicating
738 things with more files or symbolic links.
739
740 *************************************************************************** */
741char *
742md_atof (type, litP, sizeP)
743 int type;
744 char *litP;
745 int *sizeP;
746{
747 LITTLENUM_TYPE words[MAX_LITTLENUMS];
748 LITTLENUM_TYPE *wordP;
749 int prec;
750 char *t;
751 char *atof_ieee ();
752
753 switch (type)
754 {
755 case 'f':
756 case 'F':
757 prec = 2;
758 break;
759
760 case 'd':
761 case 'D':
762 prec = 4;
763 break;
764
765 case 't':
766 case 'T':
767 prec = 5;
768 type = 'x'; /* That's what atof_ieee() understands */
769 break;
770
771 default:
772 *sizeP = 0;
773 return _("Bad call to md_atof()");
774 }
775
776 t = atof_ieee (input_line_pointer, type, words);
777 if (t)
778 {
779 input_line_pointer = t;
780 }
781
782 *sizeP = prec * LNUM_SIZE;
783
784 /* Output the LITTLENUMs in REVERSE order in accord with i80960
785 word-order. (Dunno why atof_ieee doesn't do it in the right
786 order in the first place -- probably because it's a hack of
787 atof_m68k.) */
788
789 for (wordP = words + prec - 1; prec--;)
790 {
791 md_number_to_chars (litP, (long) (*wordP--), LNUM_SIZE);
792 litP += sizeof (LITTLENUM_TYPE);
793 }
794
795 return 0;
796}
797
252b5132
RH
798/*****************************************************************************
799 md_number_to_imm
800
801 *************************************************************************** */
802void
803md_number_to_imm (buf, val, n)
804 char *buf;
805 long val;
806 int n;
807{
808 md_number_to_chars (buf, val, n);
809}
810
252b5132
RH
811/*****************************************************************************
812 md_number_to_disp
813
814 *************************************************************************** */
815void
816md_number_to_disp (buf, val, n)
817 char *buf;
818 long val;
819 int n;
820{
821 md_number_to_chars (buf, val, n);
822}
823
824/*****************************************************************************
825 md_number_to_field:
826
827 Stick a value (an address fixup) into a bit field of
828 previously-generated instruction.
829
830 *************************************************************************** */
831void
832md_number_to_field (instrP, val, bfixP)
833 char *instrP; /* Pointer to instruction to be fixed */
834 long val; /* Address fixup value */
835 bit_fixS *bfixP; /* Description of bit field to be fixed up */
836{
837 int numbits; /* Length of bit field to be fixed */
838 long instr; /* 32-bit instruction to be fixed-up */
839 long sign; /* 0 or -1, according to sign bit of 'val' */
840
841 /* Convert instruction back to host byte order. */
842 instr = md_chars_to_number (instrP, 4);
843
844 /* Surprise! -- we stored the number of bits to be modified rather
845 than a pointer to a structure. */
846 numbits = (int) bfixP;
847 if (numbits == 1)
848 {
849 /* This is a no-op, stuck here by reloc_callj() */
850 return;
851 }
852
853 know ((numbits == 13) || (numbits == 24));
854
855 /* Propagate sign bit of 'val' for the given number of bits. Result
856 should be all 0 or all 1. */
857 sign = val >> ((int) numbits - 1);
858 if (((val < 0) && (sign != -1))
859 || ((val > 0) && (sign != 0)))
860 {
861 as_bad (_("Fixup of %ld too large for field width of %d"),
862 val, numbits);
863 }
864 else
865 {
866 /* Put bit field into instruction and write back in target
867 * byte order.
868 */
869 val &= ~(-1 << (int) numbits); /* Clear unused sign bits */
870 instr |= val;
871 md_number_to_chars (instrP, instr, 4);
872 }
873} /* md_number_to_field() */
874\f
875
876/*****************************************************************************
877 md_parse_option
878 Invocation line includes a switch not recognized by the base assembler.
879 See if it's a processor-specific option. For the 960, these are:
880
881 -norelax:
882 Conditional branch instructions that require displacements
883 greater than 13 bits (or that have external targets) should
884 generate errors. The default is to replace each such
885 instruction with the corresponding compare (or chkbit) and
886 branch instructions. Note that the Intel "j" cobr directives
887 are ALWAYS "de-optimized" in this way when necessary,
888 regardless of the setting of this option.
889
890 -b:
891 Add code to collect information about branches taken, for
892 later optimization of branch prediction bits by a separate
893 tool. COBR and CNTL format instructions have branch
894 prediction bits (in the CX architecture); if "BR" represents
895 an instruction in one of these classes, the following rep-
896 resents the code generated by the assembler:
897
898 call <increment routine>
899 .word 0 # pre-counter
900 Label: BR
901 call <increment routine>
902 .word 0 # post-counter
903
904 A table of all such "Labels" is also generated.
905
252b5132
RH
906 -AKA, -AKB, -AKC, -ASA, -ASB, -AMC, -ACA:
907 Select the 80960 architecture. Instructions or features not
908 supported by the selected architecture cause fatal errors.
909 The default is to generate code for any instruction or feature
910 that is supported by SOME version of the 960 (even if this
911 means mixing architectures!).
912
913 ****************************************************************************/
914
915CONST char *md_shortopts = "A:b";
916struct option md_longopts[] =
917{
918#define OPTION_LINKRELAX (OPTION_MD_BASE)
919 {"linkrelax", no_argument, NULL, OPTION_LINKRELAX},
920 {"link-relax", no_argument, NULL, OPTION_LINKRELAX},
921#define OPTION_NORELAX (OPTION_MD_BASE + 1)
922 {"norelax", no_argument, NULL, OPTION_NORELAX},
923 {"no-relax", no_argument, NULL, OPTION_NORELAX},
924 {NULL, no_argument, NULL, 0}
925};
926size_t md_longopts_size = sizeof (md_longopts);
927
928struct tabentry
929 {
930 char *flag;
931 int arch;
932 };
933static const struct tabentry arch_tab[] =
934{
935 {"KA", ARCH_KA},
936 {"KB", ARCH_KB},
937 {"SA", ARCH_KA}, /* Synonym for KA */
938 {"SB", ARCH_KB}, /* Synonym for KB */
939 {"KC", ARCH_MC}, /* Synonym for MC */
940 {"MC", ARCH_MC},
941 {"CA", ARCH_CA},
942 {"JX", ARCH_JX},
943 {"HX", ARCH_HX},
944 {NULL, 0}
945};
946
947int
948md_parse_option (c, arg)
949 int c;
950 char *arg;
951{
952 switch (c)
953 {
954 case OPTION_LINKRELAX:
955 linkrelax = 1;
956 flag_keep_locals = 1;
957 break;
958
959 case OPTION_NORELAX:
960 norelax = 1;
961 break;
962
963 case 'b':
964 instrument_branches = 1;
965 break;
966
967 case 'A':
968 {
969 const struct tabentry *tp;
970 char *p = arg;
971
972 for (tp = arch_tab; tp->flag != NULL; tp++)
973 if (!strcmp (p, tp->flag))
974 break;
975
976 if (tp->flag == NULL)
977 {
978 as_bad (_("invalid architecture %s"), p);
979 return 0;
980 }
981 else
982 architecture = tp->arch;
983 }
984 break;
985
986 default:
987 return 0;
988 }
989
990 return 1;
991}
992
993void
994md_show_usage (stream)
995 FILE *stream;
996{
997 int i;
998 fprintf (stream, _("I960 options:\n"));
999 for (i = 0; arch_tab[i].flag; i++)
1000 fprintf (stream, "%s-A%s", i ? " | " : "", arch_tab[i].flag);
1001 fprintf (stream, _("\n\
1002 specify variant of 960 architecture\n\
1003-b add code to collect statistics about branches taken\n\
1004-link-relax preserve individual alignment directives so linker\n\
1005 can do relaxing (b.out format only)\n\
1006-no-relax don't alter compare-and-branch instructions for\n\
1007 long displacements\n"));
1008}
1009\f
1010
252b5132
RH
1011/*****************************************************************************
1012 md_convert_frag:
1013 Called by base assembler after address relaxation is finished: modify
1014 variable fragments according to how much relaxation was done.
1015
1016 If the fragment substate is still 1, a 13-bit displacement was enough
1017 to reach the symbol in question. Set up an address fixup, but otherwise
1018 leave the cobr instruction alone.
1019
1020 If the fragment substate is 2, a 13-bit displacement was not enough.
1021 Replace the cobr with a two instructions (a compare and a branch).
1022
1023 *************************************************************************** */
bedf545c 1024#ifndef BFD_ASSEMBLER
252b5132
RH
1025void
1026md_convert_frag (headers, seg, fragP)
1027 object_headers *headers;
1028 segT seg;
1029 fragS *fragP;
bedf545c
ILT
1030#else
1031void
1032md_convert_frag (abfd, sec, fragP)
1033 bfd *abfd;
1034 segT sec;
1035 fragS *fragP;
1036#endif
252b5132
RH
1037{
1038 fixS *fixP; /* Structure describing needed address fix */
1039
1040 switch (fragP->fr_subtype)
1041 {
1042 case 1:
1043 /* LEAVE SINGLE COBR INSTRUCTION */
1044 fixP = fix_new (fragP,
1045 fragP->fr_opcode - fragP->fr_literal,
1046 4,
1047 fragP->fr_symbol,
1048 fragP->fr_offset,
1049 1,
1050 NO_RELOC);
1051
1052 fixP->fx_bit_fixP = (bit_fixS *) 13; /* size of bit field */
1053 break;
1054 case 2:
1055 /* REPLACE COBR WITH COMPARE/BRANCH INSTRUCTIONS */
1056 relax_cobr (fragP);
1057 break;
1058 default:
1059 BAD_CASE (fragP->fr_subtype);
1060 break;
1061 }
1062}
1063
1064/*****************************************************************************
1065 md_estimate_size_before_relax: How much does it look like *fragP will grow?
1066
1067 Called by base assembler just before address relaxation.
1068 Return the amount by which the fragment will grow.
1069
1070 Any symbol that is now undefined will not become defined; cobr's
1071 based on undefined symbols will have to be replaced with a compare
1072 instruction and a branch instruction, and the code fragment will grow
1073 by 4 bytes.
1074
1075 *************************************************************************** */
1076int
1077md_estimate_size_before_relax (fragP, segment_type)
1078 register fragS *fragP;
1079 register segT segment_type;
1080{
1081 /* If symbol is undefined in this segment, go to "relaxed" state
1082 (compare and branch instructions instead of cobr) right now. */
1083 if (S_GET_SEGMENT (fragP->fr_symbol) != segment_type)
1084 {
1085 relax_cobr (fragP);
1086 return 4;
1087 }
1088 return 0;
1089} /* md_estimate_size_before_relax() */
1090
bedf545c 1091#if defined(OBJ_AOUT) | defined(OBJ_BOUT)
252b5132
RH
1092
1093/*****************************************************************************
1094 md_ri_to_chars:
1095 This routine exists in order to overcome machine byte-order problems
1096 when dealing with bit-field entries in the relocation_info struct.
1097
1098 But relocation info will be used on the host machine only (only
1099 executable code is actually downloaded to the i80960). Therefore,
1100 we leave it in host byte order.
1101
1102 The above comment is no longer true. This routine now really
1103 does do the reordering (Ian Taylor 28 Aug 92).
1104
1105 *************************************************************************** */
bedf545c
ILT
1106
1107static void
252b5132
RH
1108md_ri_to_chars (where, ri)
1109 char *where;
1110 struct relocation_info *ri;
1111{
1112 md_number_to_chars (where, ri->r_address,
1113 sizeof (ri->r_address));
1114 where[4] = ri->r_index & 0x0ff;
1115 where[5] = (ri->r_index >> 8) & 0x0ff;
1116 where[6] = (ri->r_index >> 16) & 0x0ff;
1117 where[7] = ((ri->r_pcrel << 0)
1118 | (ri->r_length << 1)
1119 | (ri->r_extern << 3)
1120 | (ri->r_bsr << 4)
1121 | (ri->r_disp << 5)
1122 | (ri->r_callj << 6));
1123}
1124
bedf545c
ILT
1125#endif /* defined(OBJ_AOUT) | defined(OBJ_BOUT) */
1126
252b5132
RH
1127\f
1128/* FOLLOWING ARE THE LOCAL ROUTINES, IN ALPHABETICAL ORDER */
1129
1130/*****************************************************************************
1131 brcnt_emit: Emit code to increment inline branch counter.
1132
1133 See the comments above the declaration of 'br_cnt' for details on
1134 branch-prediction instrumentation.
1135 *************************************************************************** */
1136static void
1137brcnt_emit ()
1138{
1139 ctrl_fmt (BR_CNT_FUNC, CALL, 1); /* Emit call to "increment" routine */
1140 emit (0); /* Emit inline counter to be incremented */
1141}
1142
1143/*****************************************************************************
1144 brlab_next: generate the next branch local label
1145
1146 See the comments above the declaration of 'br_cnt' for details on
1147 branch-prediction instrumentation.
1148 *************************************************************************** */
1149static char *
1150brlab_next ()
1151{
1152 static char buf[20];
1153
1154 sprintf (buf, "%s%d", BR_LABEL_BASE, br_cnt++);
1155 return buf;
1156}
1157
1158/*****************************************************************************
1159 brtab_emit: generate the fetch-prediction branch table.
1160
1161 See the comments above the declaration of 'br_cnt' for details on
1162 branch-prediction instrumentation.
1163
1164 The code emitted here would be functionally equivalent to the following
1165 example assembler source.
1166
1167 .data
1168 .align 2
1169 BR_TAB_NAME:
1170 .word 0 # link to next table
1171 .word 3 # length of table
1172 .word LBRANCH0 # 1st entry in table proper
1173 .word LBRANCH1
1174 .word LBRANCH2
1175 **************************************************************************** */
1176void
1177brtab_emit ()
1178{
1179 int i;
1180 char buf[20];
1181 char *p; /* Where the binary was output to */
1182 /* Pointer to description of deferred address fixup. */
1183 fixS *fixP;
1184
1185 if (!instrument_branches)
1186 {
1187 return;
1188 }
1189
1190 subseg_set (data_section, 0); /* .data */
1191 frag_align (2, 0, 0); /* .align 2 */
1192 record_alignment (now_seg, 2);
1193 colon (BR_TAB_NAME); /* BR_TAB_NAME: */
1194 emit (0); /* .word 0 #link to next table */
1195 emit (br_cnt); /* .word n #length of table */
1196
1197 for (i = 0; i < br_cnt; i++)
1198 {
1199 sprintf (buf, "%s%d", BR_LABEL_BASE, i);
1200 p = emit (0);
1201 fixP = fix_new (frag_now,
1202 p - frag_now->fr_literal,
1203 4,
1204 symbol_find (buf),
1205 0,
1206 0,
1207 NO_RELOC);
1208 }
1209}
1210
1211/*****************************************************************************
1212 cobr_fmt: generate a COBR-format instruction
1213
1214 *************************************************************************** */
1215static
1216void
1217cobr_fmt (arg, opcode, oP)
1218 /* arg[0]->opcode mnemonic, arg[1-3]->operands (ascii) */
1219 char *arg[];
1220 /* Opcode, with branch-prediction bits already set if necessary. */
1221 long opcode;
1222 /* Pointer to description of instruction. */
1223 struct i960_opcode *oP;
1224{
1225 long instr; /* 32-bit instruction */
1226 struct regop regop; /* Description of register operand */
1227 int n; /* Number of operands */
1228 int var_frag; /* 1 if varying length code fragment should
1229 * be emitted; 0 if an address fix
1230 * should be emitted.
1231 */
1232
1233 instr = opcode;
1234 n = oP->num_ops;
1235
1236 if (n >= 1)
1237 {
1238 /* First operand (if any) of a COBR is always a register
1239 operand. Parse it. */
1240 parse_regop (&regop, arg[1], oP->operand[0]);
1241 instr |= (regop.n << 19) | (regop.mode << 13);
1242 }
1243 if (n >= 2)
1244 {
1245 /* Second operand (if any) of a COBR is always a register
1246 operand. Parse it. */
1247 parse_regop (&regop, arg[2], oP->operand[1]);
1248 instr |= (regop.n << 14) | regop.special;
1249 }
1250
252b5132
RH
1251 if (n < 3)
1252 {
1253 emit (instr);
1254
1255 }
1256 else
1257 {
1258 if (instrument_branches)
1259 {
1260 brcnt_emit ();
1261 colon (brlab_next ());
1262 }
1263
1264 /* A third operand to a COBR is always a displacement. Parse
1265 it; if it's relaxable (a cobr "j" directive, or any cobr
1266 other than bbs/bbc when the "-norelax" option is not in use)
1267 set up a variable code fragment; otherwise set up an address
1268 fix. */
1269 var_frag = !norelax || (oP->format == COJ); /* TRUE or FALSE */
1270 get_cdisp (arg[3], "COBR", instr, 13, var_frag, 0);
1271
1272 if (instrument_branches)
1273 {
1274 brcnt_emit ();
1275 }
1276 }
1277} /* cobr_fmt() */
1278
252b5132
RH
1279/*****************************************************************************
1280 ctrl_fmt: generate a CTRL-format instruction
1281
1282 *************************************************************************** */
1283static
1284void
1285ctrl_fmt (targP, opcode, num_ops)
1286 char *targP; /* Pointer to text of lone operand (if any) */
1287 long opcode; /* Template of instruction */
1288 int num_ops; /* Number of operands */
1289{
1290 int instrument; /* TRUE iff we should add instrumentation to track
1291 * how often the branch is taken
1292 */
1293
252b5132
RH
1294 if (num_ops == 0)
1295 {
1296 emit (opcode); /* Output opcode */
1297 }
1298 else
1299 {
1300
1301 instrument = instrument_branches && (opcode != CALL)
1302 && (opcode != B) && (opcode != RET) && (opcode != BAL);
1303
1304 if (instrument)
1305 {
1306 brcnt_emit ();
1307 colon (brlab_next ());
1308 }
1309
1310 /* The operand MUST be an ip-relative displacment. Parse it
1311 * and set up address fix for the instruction we just output.
1312 */
1313 get_cdisp (targP, "CTRL", opcode, 24, 0, 0);
1314
1315 if (instrument)
1316 {
1317 brcnt_emit ();
1318 }
1319 }
1320
1321}
1322
252b5132
RH
1323/*****************************************************************************
1324 emit: output instruction binary
1325
1326 Output instruction binary, in target byte order, 4 bytes at a time.
1327 Return pointer to where it was placed.
1328
1329 *************************************************************************** */
1330static
1331char *
1332emit (instr)
1333 long instr; /* Word to be output, host byte order */
1334{
1335 char *toP; /* Where to output it */
1336
1337 toP = frag_more (4); /* Allocate storage */
1338 md_number_to_chars (toP, instr, 4); /* Convert to target byte order */
1339 return toP;
1340}
1341
252b5132
RH
1342/*****************************************************************************
1343 get_args: break individual arguments out of comma-separated list
1344
1345 Input assumptions:
1346 - all comments and labels have been removed
1347 - all strings of whitespace have been collapsed to a single blank.
1348 - all character constants ('x') have been replaced with decimal
1349
1350 Output:
1351 args[0] is untouched. args[1] points to first operand, etc. All args:
1352 - are NULL-terminated
1353 - contain no whitespace
1354
1355 Return value:
1356 Number of operands (0,1,2, or 3) or -1 on error.
1357
1358 *************************************************************************** */
1359static int
1360get_args (p, args)
1361 /* Pointer to comma-separated operands; MUCKED BY US */
1362 register char *p;
1363 /* Output arg: pointers to operands placed in args[1-3]. MUST
1364 ACCOMMODATE 4 ENTRIES (args[0-3]). */
1365 char *args[];
1366{
1367 register int n; /* Number of operands */
1368 register char *to;
1369
1370 /* Skip lead white space */
1371 while (*p == ' ')
1372 {
1373 p++;
1374 }
1375
1376 if (*p == '\0')
1377 {
1378 return 0;
1379 }
1380
1381 n = 1;
1382 args[1] = p;
1383
1384 /* Squeze blanks out by moving non-blanks toward start of string.
1385 * Isolate operands, whenever comma is found.
1386 */
1387 to = p;
1388 while (*p != '\0')
1389 {
1390
1391 if (*p == ' '
3882b010
L
1392 && (! ISALNUM (p[1])
1393 || ! ISALNUM (p[-1])))
252b5132
RH
1394 {
1395 p++;
1396
1397 }
1398 else if (*p == ',')
1399 {
1400
1401 /* Start of operand */
1402 if (n == 3)
1403 {
1404 as_bad (_("too many operands"));
1405 return -1;
1406 }
1407 *to++ = '\0'; /* Terminate argument */
1408 args[++n] = to; /* Start next argument */
1409 p++;
1410
1411 }
1412 else
1413 {
1414 *to++ = *p++;
1415 }
1416 }
1417 *to = '\0';
1418 return n;
1419}
1420
252b5132
RH
1421/*****************************************************************************
1422 get_cdisp: handle displacement for a COBR or CTRL instruction.
1423
1424 Parse displacement for a COBR or CTRL instruction.
1425
1426 If successful, output the instruction opcode and set up for it,
1427 depending on the arg 'var_frag', either:
1428 o an address fixup to be done when all symbol values are known, or
1429 o a varying length code fragment, with address fixup info. This
1430 will be done for cobr instructions that may have to be relaxed
1431 in to compare/branch instructions (8 bytes) if the final
1432 address displacement is greater than 13 bits.
1433
1434 ****************************************************************************/
1435static
1436void
1437get_cdisp (dispP, ifmtP, instr, numbits, var_frag, callj)
1438 /* displacement as specified in source instruction */
1439 char *dispP;
1440 /* "COBR" or "CTRL" (for use in error message) */
1441 char *ifmtP;
1442 /* Instruction needing the displacement */
1443 long instr;
1444 /* # bits of displacement (13 for COBR, 24 for CTRL) */
1445 int numbits;
1446 /* 1 if varying length code fragment should be emitted;
1447 * 0 if an address fix should be emitted.
1448 */
1449 int var_frag;
1450 /* 1 if callj relocation should be done; else 0 */
1451 int callj;
1452{
1453 expressionS e; /* Parsed expression */
1454 fixS *fixP; /* Structure describing needed address fix */
1455 char *outP; /* Where instruction binary is output to */
1456
1457 fixP = NULL;
1458
1459 parse_expr (dispP, &e);
1460 switch (e.X_op)
1461 {
1462 case O_illegal:
1463 as_bad (_("expression syntax error"));
1464
1465 case O_symbol:
1466 if (S_GET_SEGMENT (e.X_add_symbol) == now_seg
1467 || S_GET_SEGMENT (e.X_add_symbol) == undefined_section)
1468 {
1469 if (var_frag)
1470 {
1471 outP = frag_more (8); /* Allocate worst-case storage */
1472 md_number_to_chars (outP, instr, 4);
1473 frag_variant (rs_machine_dependent, 4, 4, 1,
1474 adds (e), offs (e), outP);
1475 }
1476 else
1477 {
1478 /* Set up a new fix structure, so address can be updated
1479 * when all symbol values are known.
1480 */
1481 outP = emit (instr);
1482 fixP = fix_new (frag_now,
1483 outP - frag_now->fr_literal,
1484 4,
1485 adds (e),
1486 offs (e),
1487 1,
1488 NO_RELOC);
1489
1490 fixP->fx_tcbit = callj;
1491
1492 /* We want to modify a bit field when the address is
1493 * known. But we don't need all the garbage in the
1494 * bit_fix structure. So we're going to lie and store
1495 * the number of bits affected instead of a pointer.
1496 */
1497 fixP->fx_bit_fixP = (bit_fixS *) numbits;
1498 }
1499 }
1500 else
1501 as_bad (_("attempt to branch into different segment"));
1502 break;
1503
1504 default:
1505 as_bad (_("target of %s instruction must be a label"), ifmtP);
1506 break;
1507 }
1508}
1509
252b5132
RH
1510/*****************************************************************************
1511 get_ispec: parse a memory operand for an index specification
1512
1513 Here, an "index specification" is taken to be anything surrounded
1514 by square brackets and NOT followed by anything else.
1515
1516 If it's found, detach it from the input string, remove the surrounding
1517 square brackets, and return a pointer to it. Otherwise, return NULL.
1518
1519 *************************************************************************** */
1520static
1521char *
1522get_ispec (textP)
1523 /* Pointer to memory operand from source instruction, no white space. */
1524 char *textP;
1525{
1526 /* Points to start of index specification. */
1527 char *start;
1528 /* Points to end of index specification. */
1529 char *end;
1530
1531 /* Find opening square bracket, if any. */
1532 start = strchr (textP, '[');
1533
1534 if (start != NULL)
1535 {
1536
1537 /* Eliminate '[', detach from rest of operand */
1538 *start++ = '\0';
1539
1540 end = strchr (start, ']');
1541
1542 if (end == NULL)
1543 {
1544 as_bad (_("unmatched '['"));
1545
1546 }
1547 else
1548 {
1549 /* Eliminate ']' and make sure it was the last thing
1550 * in the string.
1551 */
1552 *end = '\0';
1553 if (*(end + 1) != '\0')
1554 {
1555 as_bad (_("garbage after index spec ignored"));
1556 }
1557 }
1558 }
1559 return start;
1560}
1561
1562/*****************************************************************************
1563 get_regnum:
1564
1565 Look up a (suspected) register name in the register table and return the
1566 associated register number (or -1 if not found).
1567
1568 *************************************************************************** */
1569static
1570int
1571get_regnum (regname)
1572 char *regname; /* Suspected register name */
1573{
1574 int *rP;
1575
1576 rP = (int *) hash_find (reg_hash, regname);
1577 return (rP == NULL) ? -1 : *rP;
1578}
1579
252b5132
RH
1580/*****************************************************************************
1581 i_scan: perform lexical scan of ascii assembler instruction.
1582
1583 Input assumptions:
1584 - input string is an i80960 instruction (not a pseudo-op)
1585 - all comments and labels have been removed
1586 - all strings of whitespace have been collapsed to a single blank.
1587
1588 Output:
1589 args[0] points to opcode, other entries point to operands. All strings:
1590 - are NULL-terminated
1591 - contain no whitespace
1592 - have character constants ('x') replaced with a decimal number
1593
1594 Return value:
1595 Number of operands (0,1,2, or 3) or -1 on error.
1596
1597 *************************************************************************** */
1598static int
1599i_scan (iP, args)
92774660 1600 /* Pointer to ascii instruction; MUCKED BY US. */
252b5132
RH
1601 register char *iP;
1602 /* Output arg: pointers to opcode and operands placed here. MUST
1603 ACCOMMODATE 4 ENTRIES. */
1604 char *args[];
1605{
1606
1607 /* Isolate opcode */
1608 if (*(iP) == ' ')
1609 {
1610 iP++;
1611 } /* Skip lead space, if any */
1612 args[0] = iP;
1613 for (; *iP != ' '; iP++)
1614 {
1615 if (*iP == '\0')
1616 {
1617 /* There are no operands */
1618 if (args[0] == iP)
1619 {
1620 /* We never moved: there was no opcode either! */
1621 as_bad (_("missing opcode"));
1622 return -1;
1623 }
1624 return 0;
1625 }
1626 }
1627 *iP++ = '\0'; /* Terminate opcode */
1628 return (get_args (iP, args));
1629} /* i_scan() */
1630
252b5132
RH
1631/*****************************************************************************
1632 mem_fmt: generate a MEMA- or MEMB-format instruction
1633
1634 *************************************************************************** */
1635static void
1636mem_fmt (args, oP, callx)
1637 char *args[]; /* args[0]->opcode mnemonic, args[1-3]->operands */
1638 struct i960_opcode *oP; /* Pointer to description of instruction */
1639 int callx; /* Is this a callx opcode */
1640{
1641 int i; /* Loop counter */
1642 struct regop regop; /* Description of register operand */
1643 char opdesc; /* Operand descriptor byte */
1644 memS instr; /* Description of binary to be output */
1645 char *outP; /* Where the binary was output to */
1646 expressionS expr; /* Parsed expression */
1647 /* ->description of deferred address fixup */
1648 fixS *fixP;
1649
1650#ifdef OBJ_COFF
1651 /* COFF support isn't in place yet for callx relaxing. */
1652 callx = 0;
1653#endif
1654
1655 memset (&instr, '\0', sizeof (memS));
1656 instr.opcode = oP->opcode;
1657
92774660 1658 /* Process operands. */
252b5132
RH
1659 for (i = 1; i <= oP->num_ops; i++)
1660 {
1661 opdesc = oP->operand[i - 1];
1662
1663 if (MEMOP (opdesc))
1664 {
1665 parse_memop (&instr, args[i], oP->format);
1666 }
1667 else
1668 {
1669 parse_regop (&regop, args[i], opdesc);
1670 instr.opcode |= regop.n << 19;
1671 }
1672 }
1673
1674 /* Parse the displacement; this must be done before emitting the
1675 opcode, in case it is an expression using `.'. */
1676 parse_expr (instr.e, &expr);
1677
1678 /* Output opcode */
1679 outP = emit (instr.opcode);
1680
1681 if (instr.disp == 0)
1682 {
1683 return;
1684 }
1685
1686 /* Process the displacement */
1687 switch (expr.X_op)
1688 {
1689 case O_illegal:
1690 as_bad (_("expression syntax error"));
1691 break;
1692
1693 case O_constant:
1694 if (instr.disp == 32)
1695 {
1696 (void) emit (offs (expr)); /* Output displacement */
1697 }
1698 else
1699 {
1700 /* 12-bit displacement */
1701 if (offs (expr) & ~0xfff)
1702 {
1703 /* Won't fit in 12 bits: convert already-output
1704 * instruction to MEMB format, output
1705 * displacement.
1706 */
1707 mema_to_memb (outP);
1708 (void) emit (offs (expr));
1709 }
1710 else
1711 {
1712 /* WILL fit in 12 bits: OR into opcode and
1713 * overwrite the binary we already put out
1714 */
1715 instr.opcode |= offs (expr);
1716 md_number_to_chars (outP, instr.opcode, 4);
1717 }
1718 }
1719 break;
1720
1721 default:
1722 if (instr.disp == 12)
1723 {
1724 /* Displacement is dependent on a symbol, whose value
1725 * may change at link time. We HAVE to reserve 32 bits.
1726 * Convert already-output opcode to MEMB format.
1727 */
1728 mema_to_memb (outP);
1729 }
1730
1731 /* Output 0 displacement and set up address fixup for when
1732 * this symbol's value becomes known.
1733 */
1734 outP = emit ((long) 0);
1735 fixP = fix_new_exp (frag_now,
1736 outP - frag_now->fr_literal,
1737 4,
1738 &expr,
1739 0,
1740 NO_RELOC);
1741 /* Steve's linker relaxing hack. Mark this 32-bit relocation as
1742 being in the instruction stream, specifically as part of a callx
1743 instruction. */
1744 fixP->fx_bsr = callx;
1745 break;
1746 }
1747} /* memfmt() */
1748
252b5132
RH
1749/*****************************************************************************
1750 mema_to_memb: convert a MEMA-format opcode to a MEMB-format opcode.
1751
1752 There are 2 possible MEMA formats:
1753 - displacement only
1754 - displacement + abase
1755
1756 They are distinguished by the setting of the MEMA_ABASE bit.
1757
1758 *************************************************************************** */
1759static void
1760mema_to_memb (opcodeP)
1761 char *opcodeP; /* Where to find the opcode, in target byte order */
1762{
1763 long opcode; /* Opcode in host byte order */
1764 long mode; /* Mode bits for MEMB instruction */
1765
1766 opcode = md_chars_to_number (opcodeP, 4);
1767 know (!(opcode & MEMB_BIT));
1768
1769 mode = MEMB_BIT | D_BIT;
1770 if (opcode & MEMA_ABASE)
1771 {
1772 mode |= A_BIT;
1773 }
1774
1775 opcode &= 0xffffc000; /* Clear MEMA offset and mode bits */
1776 opcode |= mode; /* Set MEMB mode bits */
1777
1778 md_number_to_chars (opcodeP, opcode, 4);
1779} /* mema_to_memb() */
1780
252b5132
RH
1781/*****************************************************************************
1782 parse_expr: parse an expression
1783
1784 Use base assembler's expression parser to parse an expression.
1785 It, unfortunately, runs off a global which we have to save/restore
1786 in order to make it work for us.
1787
1788 An empty expression string is treated as an absolute 0.
1789
1790 Sets O_illegal regardless of expression evaluation if entire input
1791 string is not consumed in the evaluation -- tolerate no dangling junk!
1792
1793 *************************************************************************** */
1794static void
1795parse_expr (textP, expP)
1796 char *textP; /* Text of expression to be parsed */
1797 expressionS *expP; /* Where to put the results of parsing */
1798{
1799 char *save_in; /* Save global here */
1800 symbolS *symP;
1801
1802 know (textP);
1803
1804 if (*textP == '\0')
1805 {
1806 /* Treat empty string as absolute 0 */
1807 expP->X_add_symbol = expP->X_op_symbol = NULL;
1808 expP->X_add_number = 0;
1809 expP->X_op = O_constant;
1810 }
1811 else
1812 {
1813 save_in = input_line_pointer; /* Save global */
1814 input_line_pointer = textP; /* Make parser work for us */
1815
1816 (void) expression (expP);
1817 if ((size_t) (input_line_pointer - textP) != strlen (textP))
1818 {
1819 /* Did not consume all of the input */
1820 expP->X_op = O_illegal;
1821 }
1822 symP = expP->X_add_symbol;
1823 if (symP && (hash_find (reg_hash, S_GET_NAME (symP))))
1824 {
1825 /* Register name in an expression */
1826 /* FIXME: this isn't much of a check any more. */
1827 expP->X_op = O_illegal;
1828 }
1829
1830 input_line_pointer = save_in; /* Restore global */
1831 }
1832}
1833
252b5132
RH
1834/*****************************************************************************
1835 parse_ldcont:
1836 Parse and replace a 'ldconst' pseudo-instruction with an appropriate
1837 i80960 instruction.
1838
1839 Assumes the input consists of:
1840 arg[0] opcode mnemonic ('ldconst')
1841 arg[1] first operand (constant)
1842 arg[2] name of register to be loaded
1843
1844 Replaces opcode and/or operands as appropriate.
1845
1846 Returns the new number of arguments, or -1 on failure.
1847
1848 *************************************************************************** */
1849static
1850int
1851parse_ldconst (arg)
1852 char *arg[]; /* See above */
1853{
1854 int n; /* Constant to be loaded */
1855 int shift; /* Shift count for "shlo" instruction */
1856 static char buf[5]; /* Literal for first operand */
1857 static char buf2[5]; /* Literal for second operand */
1858 expressionS e; /* Parsed expression */
1859
252b5132
RH
1860 arg[3] = NULL; /* So we can tell at the end if it got used or not */
1861
1862 parse_expr (arg[1], &e);
1863 switch (e.X_op)
1864 {
1865 default:
1866 /* We're dependent on one or more symbols -- use "lda" */
1867 arg[0] = "lda";
1868 break;
1869
1870 case O_constant:
1871 /* Try the following mappings:
1872 * ldconst 0,<reg> ->mov 0,<reg>
1873 * ldconst 31,<reg> ->mov 31,<reg>
1874 * ldconst 32,<reg> ->addo 1,31,<reg>
1875 * ldconst 62,<reg> ->addo 31,31,<reg>
1876 * ldconst 64,<reg> ->shlo 8,3,<reg>
1877 * ldconst -1,<reg> ->subo 1,0,<reg>
1878 * ldconst -31,<reg>->subo 31,0,<reg>
1879 *
1880 * anthing else becomes:
1881 * lda xxx,<reg>
1882 */
1883 n = offs (e);
1884 if ((0 <= n) && (n <= 31))
1885 {
1886 arg[0] = "mov";
1887
1888 }
1889 else if ((-31 <= n) && (n <= -1))
1890 {
1891 arg[0] = "subo";
1892 arg[3] = arg[2];
1893 sprintf (buf, "%d", -n);
1894 arg[1] = buf;
1895 arg[2] = "0";
1896
1897 }
1898 else if ((32 <= n) && (n <= 62))
1899 {
1900 arg[0] = "addo";
1901 arg[3] = arg[2];
1902 arg[1] = "31";
1903 sprintf (buf, "%d", n - 31);
1904 arg[2] = buf;
1905
1906 }
1907 else if ((shift = shift_ok (n)) != 0)
1908 {
1909 arg[0] = "shlo";
1910 arg[3] = arg[2];
1911 sprintf (buf, "%d", shift);
1912 arg[1] = buf;
1913 sprintf (buf2, "%d", n >> shift);
1914 arg[2] = buf2;
1915
1916 }
1917 else
1918 {
1919 arg[0] = "lda";
1920 }
1921 break;
1922
1923 case O_illegal:
1924 as_bad (_("invalid constant"));
1925 return -1;
1926 break;
1927 }
1928 return (arg[3] == 0) ? 2 : 3;
1929}
1930
1931/*****************************************************************************
1932 parse_memop: parse a memory operand
1933
1934 This routine is based on the observation that the 4 mode bits of the
1935 MEMB format, taken individually, have fairly consistent meaning:
1936
1937 M3 (bit 13): 1 if displacement is present (D_BIT)
1938 M2 (bit 12): 1 for MEMB instructions (MEMB_BIT)
1939 M1 (bit 11): 1 if index is present (I_BIT)
1940 M0 (bit 10): 1 if abase is present (A_BIT)
1941
1942 So we parse the memory operand and set bits in the mode as we find
1943 things. Then at the end, if we go to MEMB format, we need only set
1944 the MEMB bit (M2) and our mode is built for us.
1945
1946 Unfortunately, I said "fairly consistent". The exceptions:
1947
1948 DBIA
1949 0100 Would seem illegal, but means "abase-only".
1950
1951 0101 Would seem to mean "abase-only" -- it means IP-relative.
1952 Must be converted to 0100.
1953
1954 0110 Would seem to mean "index-only", but is reserved.
1955 We turn on the D bit and provide a 0 displacement.
1956
1957 The other thing to observe is that we parse from the right, peeling
1958 things * off as we go: first any index spec, then any abase, then
1959 the displacement.
1960
1961 *************************************************************************** */
1962static
1963void
1964parse_memop (memP, argP, optype)
1965 memS *memP; /* Where to put the results */
1966 char *argP; /* Text of the operand to be parsed */
1967 int optype; /* MEM1, MEM2, MEM4, MEM8, MEM12, or MEM16 */
1968{
1969 char *indexP; /* Pointer to index specification with "[]" removed */
1970 char *p; /* Temp char pointer */
1971 char iprel_flag; /* True if this is an IP-relative operand */
1972 int regnum; /* Register number */
1973 /* Scale factor: 1,2,4,8, or 16. Later converted to internal format
1974 (0,1,2,3,4 respectively). */
1975 int scale;
1976 int mode; /* MEMB mode bits */
1977 int *intP; /* Pointer to register number */
1978
1979 /* The following table contains the default scale factors for each
1980 type of memory instruction. It is accessed using (optype-MEM1)
1981 as an index -- thus it assumes the 'optype' constants are
1982 assigned consecutive values, in the order they appear in this
1983 table. */
1984 static const int def_scale[] =
1985 {
1986 1, /* MEM1 */
1987 2, /* MEM2 */
1988 4, /* MEM4 */
1989 8, /* MEM8 */
1990 -1, /* MEM12 -- no valid default */
1991 16 /* MEM16 */
1992 };
1993
252b5132
RH
1994 iprel_flag = mode = 0;
1995
1996 /* Any index present? */
1997 indexP = get_ispec (argP);
1998 if (indexP)
1999 {
2000 p = strchr (indexP, '*');
2001 if (p == NULL)
2002 {
2003 /* No explicit scale -- use default for this instruction
2004 type and assembler mode. */
2005 if (flag_mri)
2006 scale = 1;
2007 else
2008 /* GNU960 compatibility */
2009 scale = def_scale[optype - MEM1];
2010 }
2011 else
2012 {
2013 *p++ = '\0'; /* Eliminate '*' */
2014
2015 /* Now indexP->a '\0'-terminated register name,
2016 * and p->a scale factor.
2017 */
2018
2019 if (!strcmp (p, "16"))
2020 {
2021 scale = 16;
2022 }
2023 else if (strchr ("1248", *p) && (p[1] == '\0'))
2024 {
2025 scale = *p - '0';
2026 }
2027 else
2028 {
2029 scale = -1;
2030 }
2031 }
2032
2033 regnum = get_regnum (indexP); /* Get index reg. # */
2034 if (!IS_RG_REG (regnum))
2035 {
2036 as_bad (_("invalid index register"));
2037 return;
2038 }
2039
2040 /* Convert scale to its binary encoding */
2041 switch (scale)
2042 {
2043 case 1:
2044 scale = 0 << 7;
2045 break;
2046 case 2:
2047 scale = 1 << 7;
2048 break;
2049 case 4:
2050 scale = 2 << 7;
2051 break;
2052 case 8:
2053 scale = 3 << 7;
2054 break;
2055 case 16:
2056 scale = 4 << 7;
2057 break;
2058 default:
2059 as_bad (_("invalid scale factor"));
2060 return;
2061 };
2062
2063 memP->opcode |= scale | regnum; /* Set index bits in opcode */
2064 mode |= I_BIT; /* Found a valid index spec */
2065 }
2066
2067 /* Any abase (Register Indirect) specification present? */
2068 if ((p = strrchr (argP, '(')) != NULL)
2069 {
2070 /* "(" is there -- does it start a legal abase spec? If not, it
2071 could be part of a displacement expression. */
2072 intP = (int *) hash_find (areg_hash, p);
2073 if (intP != NULL)
2074 {
2075 /* Got an abase here */
2076 regnum = *intP;
2077 *p = '\0'; /* discard register spec */
2078 if (regnum == IPREL)
2079 {
2080 /* We have to specialcase ip-rel mode */
2081 iprel_flag = 1;
2082 }
2083 else
2084 {
2085 memP->opcode |= regnum << 14;
2086 mode |= A_BIT;
2087 }
2088 }
2089 }
2090
2091 /* Any expression present? */
2092 memP->e = argP;
2093 if (*argP != '\0')
2094 {
2095 mode |= D_BIT;
2096 }
2097
2098 /* Special-case ip-relative addressing */
2099 if (iprel_flag)
2100 {
2101 if (mode & I_BIT)
2102 {
2103 syntax ();
2104 }
2105 else
2106 {
2107 memP->opcode |= 5 << 10; /* IP-relative mode */
2108 memP->disp = 32;
2109 }
2110 return;
2111 }
2112
2113 /* Handle all other modes */
2114 switch (mode)
2115 {
2116 case D_BIT | A_BIT:
2117 /* Go with MEMA instruction format for now (grow to MEMB later
2118 if 12 bits is not enough for the displacement). MEMA format
2119 has a single mode bit: set it to indicate that abase is
2120 present. */
2121 memP->opcode |= MEMA_ABASE;
2122 memP->disp = 12;
2123 break;
2124
2125 case D_BIT:
2126 /* Go with MEMA instruction format for now (grow to MEMB later
2127 if 12 bits is not enough for the displacement). */
2128 memP->disp = 12;
2129 break;
2130
2131 case A_BIT:
2132 /* For some reason, the bit string for this mode is not
2133 consistent: it should be 0 (exclusive of the MEMB bit), so we
2134 set it "by hand" here. */
2135 memP->opcode |= MEMB_BIT;
2136 break;
2137
2138 case A_BIT | I_BIT:
2139 /* set MEMB bit in mode, and OR in mode bits */
2140 memP->opcode |= mode | MEMB_BIT;
2141 break;
2142
2143 case I_BIT:
2144 /* Treat missing displacement as displacement of 0. */
2145 mode |= D_BIT;
2146 /* Fall into next case. */
2147 case D_BIT | A_BIT | I_BIT:
2148 case D_BIT | I_BIT:
2149 /* set MEMB bit in mode, and OR in mode bits */
2150 memP->opcode |= mode | MEMB_BIT;
2151 memP->disp = 32;
2152 break;
2153
2154 default:
2155 syntax ();
2156 break;
2157 }
2158}
2159
2160/*****************************************************************************
2161 parse_po: parse machine-dependent pseudo-op
2162
2163 This is a top-level routine for machine-dependent pseudo-ops. It slurps
2164 up the rest of the input line, breaks out the individual arguments,
2165 and dispatches them to the correct handler.
2166 *************************************************************************** */
2167static
2168void
2169parse_po (po_num)
2170 int po_num; /* Pseudo-op number: currently S_LEAFPROC or S_SYSPROC */
2171{
2172 /* Pointers operands, with no embedded whitespace.
2173 arg[0] unused, arg[1-3]->operands */
2174 char *args[4];
2175 int n_ops; /* Number of operands */
2176 char *p; /* Pointer to beginning of unparsed argument string */
2177 char eol; /* Character that indicated end of line */
2178
2179 extern char is_end_of_line[];
2180
92774660 2181 /* Advance input pointer to end of line. */
252b5132
RH
2182 p = input_line_pointer;
2183 while (!is_end_of_line[(unsigned char) *input_line_pointer])
2184 {
2185 input_line_pointer++;
2186 }
2187 eol = *input_line_pointer; /* Save end-of-line char */
2188 *input_line_pointer = '\0'; /* Terminate argument list */
2189
2190 /* Parse out operands */
2191 n_ops = get_args (p, args);
2192 if (n_ops == -1)
2193 {
2194 return;
2195 }
2196
2197 /* Dispatch to correct handler */
2198 switch (po_num)
2199 {
2200 case S_SYSPROC:
2201 s_sysproc (n_ops, args);
2202 break;
2203 case S_LEAFPROC:
2204 s_leafproc (n_ops, args);
2205 break;
2206 default:
2207 BAD_CASE (po_num);
2208 break;
2209 }
2210
2211 /* Restore eol, so line numbers get updated correctly. Base
2212 assembler assumes we leave input pointer pointing at char
2213 following the eol. */
2214 *input_line_pointer++ = eol;
2215}
2216
2217/*****************************************************************************
2218 parse_regop: parse a register operand.
2219
2220 In case of illegal operand, issue a message and return some valid
2221 information so instruction processing can continue.
2222 *************************************************************************** */
2223static
2224void
2225parse_regop (regopP, optext, opdesc)
2226 struct regop *regopP; /* Where to put description of register operand */
2227 char *optext; /* Text of operand */
2228 char opdesc; /* Descriptor byte: what's legal for this operand */
2229{
2230 int n; /* Register number */
2231 expressionS e; /* Parsed expression */
2232
2233 /* See if operand is a register */
2234 n = get_regnum (optext);
2235 if (n >= 0)
2236 {
2237 if (IS_RG_REG (n))
2238 {
2239 /* global or local register */
2240 if (!REG_ALIGN (opdesc, n))
2241 {
2242 as_bad (_("unaligned register"));
2243 }
2244 regopP->n = n;
2245 regopP->mode = 0;
2246 regopP->special = 0;
2247 return;
2248 }
2249 else if (IS_FP_REG (n) && FP_OK (opdesc))
2250 {
2251 /* Floating point register, and it's allowed */
2252 regopP->n = n - FP0;
2253 regopP->mode = 1;
2254 regopP->special = 0;
2255 return;
2256 }
2257 else if (IS_SF_REG (n) && SFR_OK (opdesc))
2258 {
2259 /* Special-function register, and it's allowed */
2260 regopP->n = n - SF0;
2261 regopP->mode = 0;
2262 regopP->special = 1;
2263 if (!targ_has_sfr (regopP->n))
2264 {
2265 as_bad (_("no such sfr in this architecture"));
2266 }
2267 return;
2268 }
2269 }
2270 else if (LIT_OK (opdesc))
2271 {
2272 /* How about a literal? */
2273 regopP->mode = 1;
2274 regopP->special = 0;
2275 if (FP_OK (opdesc))
2276 { /* floating point literal acceptable */
2277 /* Skip over 0f, 0d, or 0e prefix */
2278 if ((optext[0] == '0')
2279 && (optext[1] >= 'd')
2280 && (optext[1] <= 'f'))
2281 {
2282 optext += 2;
2283 }
2284
2285 if (!strcmp (optext, "0.0") || !strcmp (optext, "0"))
2286 {
2287 regopP->n = 0x10;
2288 return;
2289 }
2290 if (!strcmp (optext, "1.0") || !strcmp (optext, "1"))
2291 {
2292 regopP->n = 0x16;
2293 return;
2294 }
2295
2296 }
2297 else
2298 { /* fixed point literal acceptable */
2299 parse_expr (optext, &e);
2300 if (e.X_op != O_constant
2301 || (offs (e) < 0) || (offs (e) > 31))
2302 {
2303 as_bad (_("illegal literal"));
2304 offs (e) = 0;
2305 }
2306 regopP->n = offs (e);
2307 return;
2308 }
2309 }
2310
2311 /* Nothing worked */
2312 syntax ();
2313 regopP->mode = 0; /* Register r0 is always a good one */
2314 regopP->n = 0;
2315 regopP->special = 0;
2316} /* parse_regop() */
2317
2318/*****************************************************************************
2319 reg_fmt: generate a REG-format instruction
2320
2321 *************************************************************************** */
2322static void
2323reg_fmt (args, oP)
2324 char *args[]; /* args[0]->opcode mnemonic, args[1-3]->operands */
2325 struct i960_opcode *oP; /* Pointer to description of instruction */
2326{
2327 long instr; /* Binary to be output */
2328 struct regop regop; /* Description of register operand */
2329 int n_ops; /* Number of operands */
2330
252b5132
RH
2331 instr = oP->opcode;
2332 n_ops = oP->num_ops;
2333
2334 if (n_ops >= 1)
2335 {
2336 parse_regop (&regop, args[1], oP->operand[0]);
2337
2338 if ((n_ops == 1) && !(instr & M3))
2339 {
2340 /* 1-operand instruction in which the dst field should
2341 * be used (instead of src1).
2342 */
2343 regop.n <<= 19;
2344 if (regop.special)
2345 {
2346 regop.mode = regop.special;
2347 }
2348 regop.mode <<= 13;
2349 regop.special = 0;
2350 }
2351 else
2352 {
2353 /* regop.n goes in bit 0, needs no shifting */
2354 regop.mode <<= 11;
2355 regop.special <<= 5;
2356 }
2357 instr |= regop.n | regop.mode | regop.special;
2358 }
2359
2360 if (n_ops >= 2)
2361 {
2362 parse_regop (&regop, args[2], oP->operand[1]);
2363
2364 if ((n_ops == 2) && !(instr & M3))
2365 {
2366 /* 2-operand instruction in which the dst field should
2367 * be used instead of src2).
2368 */
2369 regop.n <<= 19;
2370 if (regop.special)
2371 {
2372 regop.mode = regop.special;
2373 }
2374 regop.mode <<= 13;
2375 regop.special = 0;
2376 }
2377 else
2378 {
2379 regop.n <<= 14;
2380 regop.mode <<= 12;
2381 regop.special <<= 6;
2382 }
2383 instr |= regop.n | regop.mode | regop.special;
2384 }
2385 if (n_ops == 3)
2386 {
2387 parse_regop (&regop, args[3], oP->operand[2]);
2388 if (regop.special)
2389 {
2390 regop.mode = regop.special;
2391 }
2392 instr |= (regop.n <<= 19) | (regop.mode <<= 13);
2393 }
2394 emit (instr);
2395}
2396
252b5132
RH
2397/*****************************************************************************
2398 relax_cobr:
2399 Replace cobr instruction in a code fragment with equivalent branch and
2400 compare instructions, so it can reach beyond a 13-bit displacement.
2401 Set up an address fix/relocation for the new branch instruction.
2402
2403 *************************************************************************** */
2404
2405/* This "conditional jump" table maps cobr instructions into
2406 equivalent compare and branch opcodes. */
2407static const
2408struct
2409{
2410 long compare;
2411 long branch;
2412}
2413
2414coj[] =
2415{ /* COBR OPCODE: */
2416 { CHKBIT, BNO }, /* 0x30 - bbc */
2417 { CMPO, BG }, /* 0x31 - cmpobg */
2418 { CMPO, BE }, /* 0x32 - cmpobe */
2419 { CMPO, BGE }, /* 0x33 - cmpobge */
2420 { CMPO, BL }, /* 0x34 - cmpobl */
2421 { CMPO, BNE }, /* 0x35 - cmpobne */
2422 { CMPO, BLE }, /* 0x36 - cmpoble */
2423 { CHKBIT, BO }, /* 0x37 - bbs */
2424 { CMPI, BNO }, /* 0x38 - cmpibno */
2425 { CMPI, BG }, /* 0x39 - cmpibg */
2426 { CMPI, BE }, /* 0x3a - cmpibe */
2427 { CMPI, BGE }, /* 0x3b - cmpibge */
2428 { CMPI, BL }, /* 0x3c - cmpibl */
2429 { CMPI, BNE }, /* 0x3d - cmpibne */
2430 { CMPI, BLE }, /* 0x3e - cmpible */
2431 { CMPI, BO }, /* 0x3f - cmpibo */
2432};
2433
2434static
2435void
2436relax_cobr (fragP)
2437 register fragS *fragP; /* fragP->fr_opcode is assumed to point to
2438 * the cobr instruction, which comes at the
2439 * end of the code fragment.
2440 */
2441{
2442 int opcode, src1, src2, m1, s2;
2443 /* Bit fields from cobr instruction */
2444 long bp_bits; /* Branch prediction bits from cobr instruction */
2445 long instr; /* A single i960 instruction */
2446 /* ->instruction to be replaced */
2447 char *iP;
2448 fixS *fixP; /* Relocation that can be done at assembly time */
2449
2450 /* PICK UP & PARSE COBR INSTRUCTION */
2451 iP = fragP->fr_opcode;
2452 instr = md_chars_to_number (iP, 4);
2453 opcode = ((instr >> 24) & 0xff) - 0x30; /* "-0x30" for table index */
2454 src1 = (instr >> 19) & 0x1f;
2455 m1 = (instr >> 13) & 1;
2456 s2 = instr & 1;
2457 src2 = (instr >> 14) & 0x1f;
2458 bp_bits = instr & BP_MASK;
2459
2460 /* GENERATE AND OUTPUT COMPARE INSTRUCTION */
2461 instr = coj[opcode].compare
2462 | src1 | (m1 << 11) | (s2 << 6) | (src2 << 14);
2463 md_number_to_chars (iP, instr, 4);
2464
2465 /* OUTPUT BRANCH INSTRUCTION */
2466 md_number_to_chars (iP + 4, coj[opcode].branch | bp_bits, 4);
2467
2468 /* SET UP ADDRESS FIXUP/RELOCATION */
2469 fixP = fix_new (fragP,
2470 iP + 4 - fragP->fr_literal,
2471 4,
2472 fragP->fr_symbol,
2473 fragP->fr_offset,
2474 1,
2475 NO_RELOC);
2476
2477 fixP->fx_bit_fixP = (bit_fixS *) 24; /* Store size of bit field */
2478
2479 fragP->fr_fix += 4;
2480 frag_wane (fragP);
2481}
2482
252b5132
RH
2483/*****************************************************************************
2484 reloc_callj: Relocate a 'callj' instruction
2485
2486 This is a "non-(GNU)-standard" machine-dependent hook. The base
2487 assembler calls it when it decides it can relocate an address at
2488 assembly time instead of emitting a relocation directive.
2489
2490 Check to see if the relocation involves a 'callj' instruction to a:
2491 sysproc: Replace the default 'call' instruction with a 'calls'
2492 leafproc: Replace the default 'call' instruction with a 'bal'.
2493 other proc: Do nothing.
2494
2495 See b.out.h for details on the 'n_other' field in a symbol structure.
2496
2497 IMPORTANT!:
2498 Assumes the caller has already figured out, in the case of a leafproc,
2499 to use the 'bal' entry point, and has substituted that symbol into the
2500 passed fixup structure.
2501
2502 *************************************************************************** */
2503void
2504reloc_callj (fixP)
2505 /* Relocation that can be done at assembly time */
2506 fixS *fixP;
2507{
2508 /* Points to the binary for the instruction being relocated. */
2509 char *where;
2510
2511 if (!fixP->fx_tcbit)
2512 {
2513 /* This wasn't a callj instruction in the first place */
2514 return;
2515 }
2516
2517 where = fixP->fx_frag->fr_literal + fixP->fx_where;
2518
2519 if (TC_S_IS_SYSPROC (fixP->fx_addsy))
2520 {
2521 /* Symbol is a .sysproc: replace 'call' with 'calls'. System
2522 procedure number is (other-1). */
2523 md_number_to_chars (where, CALLS | TC_S_GET_SYSPROC (fixP->fx_addsy), 4);
2524
2525 /* Nothing else needs to be done for this instruction. Make
2526 sure 'md_number_to_field()' will perform a no-op. */
2527 fixP->fx_bit_fixP = (bit_fixS *) 1;
2528
2529 }
2530 else if (TC_S_IS_CALLNAME (fixP->fx_addsy))
2531 {
2532 /* Should not happen: see block comment above */
2533 as_fatal (_("Trying to 'bal' to %s"), S_GET_NAME (fixP->fx_addsy));
2534 }
2535 else if (TC_S_IS_BALNAME (fixP->fx_addsy))
2536 {
2537 /* Replace 'call' with 'bal'; both instructions have the same
2538 format, so calling code should complete relocation as if
2539 nothing happened here. */
2540 md_number_to_chars (where, BAL, 4);
2541 }
2542 else if (TC_S_IS_BADPROC (fixP->fx_addsy))
2543 {
2544 as_bad (_("Looks like a proc, but can't tell what kind.\n"));
2545 } /* switch on proc type */
2546
2547 /* else Symbol is neither a sysproc nor a leafproc */
2548}
2549
252b5132
RH
2550/*****************************************************************************
2551 s_leafproc: process .leafproc pseudo-op
2552
2553 .leafproc takes two arguments, the second one is optional:
2554 arg[1]: name of 'call' entry point to leaf procedure
2555 arg[2]: name of 'bal' entry point to leaf procedure
2556
2557 If the two arguments are identical, or if the second one is missing,
2558 the first argument is taken to be the 'bal' entry point.
2559
2560 If there are 2 distinct arguments, we must make sure that the 'bal'
2561 entry point immediately follows the 'call' entry point in the linked
2562 list of symbols.
2563
2564 *************************************************************************** */
2565static void
2566s_leafproc (n_ops, args)
2567 int n_ops; /* Number of operands */
2568 char *args[]; /* args[1]->1st operand, args[2]->2nd operand */
2569{
2570 symbolS *callP; /* Pointer to leafproc 'call' entry point symbol */
2571 symbolS *balP; /* Pointer to leafproc 'bal' entry point symbol */
2572
2573 if ((n_ops != 1) && (n_ops != 2))
2574 {
2575 as_bad (_("should have 1 or 2 operands"));
2576 return;
2577 } /* Check number of arguments */
2578
92774660 2579 /* Find or create symbol for 'call' entry point. */
252b5132
RH
2580 callP = symbol_find_or_make (args[1]);
2581
2582 if (TC_S_IS_CALLNAME (callP))
2583 {
2584 as_warn (_("Redefining leafproc %s"), S_GET_NAME (callP));
2585 } /* is leafproc */
2586
2587 /* If that was the only argument, use it as the 'bal' entry point.
2588 * Otherwise, mark it as the 'call' entry point and find or create
2589 * another symbol for the 'bal' entry point.
2590 */
2591 if ((n_ops == 1) || !strcmp (args[1], args[2]))
2592 {
2593 TC_S_FORCE_TO_BALNAME (callP);
2594
2595 }
2596 else
2597 {
2598 TC_S_FORCE_TO_CALLNAME (callP);
2599
2600 balP = symbol_find_or_make (args[2]);
2601 if (TC_S_IS_CALLNAME (balP))
2602 {
2603 as_warn (_("Redefining leafproc %s"), S_GET_NAME (balP));
2604 }
2605 TC_S_FORCE_TO_BALNAME (balP);
2606
76171f81 2607#ifndef OBJ_ELF
252b5132 2608 tc_set_bal_of_call (callP, balP);
76171f81 2609#endif
252b5132
RH
2610 } /* if only one arg, or the args are the same */
2611}
2612
252b5132
RH
2613/*
2614 s_sysproc: process .sysproc pseudo-op
2615
2616 .sysproc takes two arguments:
2617 arg[1]: name of entry point to system procedure
2618 arg[2]: 'entry_num' (index) of system procedure in the range
2619 [0,31] inclusive.
2620
2621 For [ab].out, we store the 'entrynum' in the 'n_other' field of
2622 the symbol. Since that entry is normally 0, we bias 'entrynum'
2623 by adding 1 to it. It must be unbiased before it is used. */
2624static void
2625s_sysproc (n_ops, args)
2626 int n_ops; /* Number of operands */
2627 char *args[]; /* args[1]->1st operand, args[2]->2nd operand */
2628{
2629 expressionS exp;
2630 symbolS *symP;
2631
2632 if (n_ops != 2)
2633 {
2634 as_bad (_("should have two operands"));
2635 return;
2636 } /* bad arg count */
2637
92774660 2638 /* Parse "entry_num" argument and check it for validity. */
252b5132
RH
2639 parse_expr (args[2], &exp);
2640 if (exp.X_op != O_constant
2641 || (offs (exp) < 0)
2642 || (offs (exp) > 31))
2643 {
2644 as_bad (_("'entry_num' must be absolute number in [0,31]"));
2645 return;
2646 }
2647
2648 /* Find/make symbol and stick entry number (biased by +1) into it */
2649 symP = symbol_find_or_make (args[1]);
2650
2651 if (TC_S_IS_SYSPROC (symP))
2652 {
2653 as_warn (_("Redefining entrynum for sysproc %s"), S_GET_NAME (symP));
2654 } /* redefining */
2655
2656 TC_S_SET_SYSPROC (symP, offs (exp)); /* encode entry number */
2657 TC_S_FORCE_TO_SYSPROC (symP);
2658}
2659
252b5132
RH
2660/*****************************************************************************
2661 shift_ok:
2662 Determine if a "shlo" instruction can be used to implement a "ldconst".
2663 This means that some number X < 32 can be shifted left to produce the
2664 constant of interest.
2665
2666 Return the shift count, or 0 if we can't do it.
2667 Caller calculates X by shifting original constant right 'shift' places.
2668
2669 *************************************************************************** */
2670static
2671int
2672shift_ok (n)
2673 int n; /* The constant of interest */
2674{
2675 int shift; /* The shift count */
2676
2677 if (n <= 0)
2678 {
2679 /* Can't do it for negative numbers */
2680 return 0;
2681 }
2682
2683 /* Shift 'n' right until a 1 is about to be lost */
2684 for (shift = 0; (n & 1) == 0; shift++)
2685 {
2686 n >>= 1;
2687 }
2688
2689 if (n >= 32)
2690 {
2691 return 0;
2692 }
2693 return shift;
2694}
2695
252b5132
RH
2696/* syntax: issue syntax error */
2697
2698static void
2699syntax ()
2700{
2701 as_bad (_("syntax error"));
2702} /* syntax() */
2703
252b5132
RH
2704/* targ_has_sfr:
2705
2706 Return TRUE iff the target architecture supports the specified
2707 special-function register (sfr). */
2708
2709static
2710int
2711targ_has_sfr (n)
2712 int n; /* Number (0-31) of sfr */
2713{
2714 switch (architecture)
2715 {
2716 case ARCH_KA:
2717 case ARCH_KB:
2718 case ARCH_MC:
2719 case ARCH_JX:
2720 return 0;
2721 case ARCH_HX:
2722 return ((0 <= n) && (n <= 4));
2723 case ARCH_CA:
2724 default:
2725 return ((0 <= n) && (n <= 2));
2726 }
2727}
2728
252b5132
RH
2729/* targ_has_iclass:
2730
2731 Return TRUE iff the target architecture supports the indicated
2732 class of instructions. */
2733static
2734int
2735targ_has_iclass (ic)
2736 /* Instruction class; one of:
2737 I_BASE, I_CX, I_DEC, I_KX, I_FP, I_MIL, I_CASIM, I_CX2, I_HX, I_HX2
2738 */
2739 int ic;
2740{
2741 iclasses_seen |= ic;
2742 switch (architecture)
2743 {
2744 case ARCH_KA:
2745 return ic & (I_BASE | I_KX);
2746 case ARCH_KB:
2747 return ic & (I_BASE | I_KX | I_FP | I_DEC);
2748 case ARCH_MC:
2749 return ic & (I_BASE | I_KX | I_FP | I_DEC | I_MIL);
2750 case ARCH_CA:
2751 return ic & (I_BASE | I_CX | I_CX2 | I_CASIM);
2752 case ARCH_JX:
2753 return ic & (I_BASE | I_CX2 | I_JX);
2754 case ARCH_HX:
2755 return ic & (I_BASE | I_CX2 | I_JX | I_HX);
2756 default:
2757 if ((iclasses_seen & (I_KX | I_FP | I_DEC | I_MIL))
2758 && (iclasses_seen & (I_CX | I_CX2)))
2759 {
2760 as_warn (_("architecture of opcode conflicts with that of earlier instruction(s)"));
2761 iclasses_seen &= ~ic;
2762 }
2763 return 1;
2764 }
2765}
2766
2767/* Handle the MRI .endian pseudo-op. */
2768
2769static void
2770s_endian (ignore)
2771 int ignore;
2772{
2773 char *name;
2774 char c;
2775
2776 name = input_line_pointer;
2777 c = get_symbol_end ();
2778 if (strcasecmp (name, "little") == 0)
2779 ;
2780 else if (strcasecmp (name, "big") == 0)
2781 as_bad (_("big endian mode is not supported"));
2782 else
2783 as_warn (_("ignoring unrecognized .endian type `%s'"), name);
2784
2785 *input_line_pointer = c;
2786
2787 demand_empty_rest_of_line ();
2788}
2789
92774660 2790/* We have no need to default values of symbols. */
252b5132 2791
252b5132
RH
2792symbolS *
2793md_undefined_symbol (name)
2794 char *name;
2795{
2796 return 0;
2797}
2798
2799/* Exactly what point is a PC-relative offset relative TO?
2800 On the i960, they're relative to the address of the instruction,
92774660 2801 which we have set up as the address of the fixup too. */
252b5132
RH
2802long
2803md_pcrel_from (fixP)
2804 fixS *fixP;
2805{
2806 return fixP->fx_where + fixP->fx_frag->fr_address;
2807}
2808
bedf545c
ILT
2809#ifdef BFD_ASSEMBLER
2810int
2811md_apply_fix (fixP, valp)
2812 fixS *fixP;
2813 valueT *valp;
2814#else
252b5132
RH
2815void
2816md_apply_fix (fixP, val)
2817 fixS *fixP;
2818 long val;
bedf545c 2819#endif
252b5132 2820{
bedf545c
ILT
2821#ifdef BFD_ASSEMBLER
2822 long val = *valp;
2823#endif
252b5132
RH
2824 char *place = fixP->fx_where + fixP->fx_frag->fr_literal;
2825
2826 if (!fixP->fx_bit_fixP)
2827 {
76171f81 2828#ifndef BFD_ASSEMBLER
252b5132
RH
2829 /* For callx, we always want to write out zero, and emit a
2830 symbolic relocation. */
2831 if (fixP->fx_bsr)
2832 val = 0;
2833
2834 fixP->fx_addnumber = val;
bedf545c
ILT
2835#endif
2836
252b5132
RH
2837 md_number_to_imm (place, val, fixP->fx_size, fixP);
2838 }
2839 else
2840 md_number_to_field (place, val, fixP->fx_bit_fixP);
bedf545c
ILT
2841
2842#ifdef BFD_ASSEMBLER
2843 return 0;
2844#endif
252b5132
RH
2845}
2846
2847#if defined(OBJ_AOUT) | defined(OBJ_BOUT)
2848void
2849tc_bout_fix_to_chars (where, fixP, segment_address_in_file)
2850 char *where;
2851 fixS *fixP;
2852 relax_addressT segment_address_in_file;
2853{
2854 static const unsigned char nbytes_r_length[] = {42, 0, 1, 42, 2};
2855 struct relocation_info ri;
2856 symbolS *symbolP;
2857
2858 memset ((char *) &ri, '\0', sizeof (ri));
2859 symbolP = fixP->fx_addsy;
2860 know (symbolP != 0 || fixP->fx_r_type != NO_RELOC);
2861 ri.r_bsr = fixP->fx_bsr; /*SAC LD RELAX HACK */
2862 /* These two 'cuz of NS32K */
2863 ri.r_callj = fixP->fx_tcbit;
2864 if (fixP->fx_bit_fixP)
2865 ri.r_length = 2;
2866 else
2867 ri.r_length = nbytes_r_length[fixP->fx_size];
2868 ri.r_pcrel = fixP->fx_pcrel;
2869 ri.r_address = fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file;
2870
2871 if (fixP->fx_r_type != NO_RELOC)
2872 {
2873 switch (fixP->fx_r_type)
2874 {
2875 case rs_align:
2876 ri.r_index = -2;
2877 ri.r_pcrel = 1;
2878 ri.r_length = fixP->fx_size - 1;
2879 break;
2880 case rs_org:
2881 ri.r_index = -2;
2882 ri.r_pcrel = 0;
2883 break;
2884 case rs_fill:
2885 ri.r_index = -1;
2886 break;
2887 default:
2888 abort ();
2889 }
2890 ri.r_extern = 0;
2891 }
2892 else if (linkrelax || !S_IS_DEFINED (symbolP) || fixP->fx_bsr)
2893 {
2894 ri.r_extern = 1;
2895 ri.r_index = symbolP->sy_number;
2896 }
2897 else
2898 {
2899 ri.r_extern = 0;
2900 ri.r_index = S_GET_TYPE (symbolP);
2901 }
2902
92774660 2903 /* Output the relocation information in machine-dependent form. */
252b5132
RH
2904 md_ri_to_chars (where, &ri);
2905}
2906
2907#endif /* OBJ_AOUT or OBJ_BOUT */
2908
2909#if defined (OBJ_COFF) && defined (BFD)
2910short
2911tc_coff_fix2rtype (fixP)
2912 fixS *fixP;
2913{
2914 if (fixP->fx_bsr)
2915 abort ();
2916
2917 if (fixP->fx_pcrel == 0 && fixP->fx_size == 4)
2918 return R_RELLONG;
2919
2920 if (fixP->fx_pcrel != 0 && fixP->fx_size == 4)
2921 return R_IPRMED;
2922
2923 abort ();
2924 return 0;
2925}
2926
2927int
2928tc_coff_sizemachdep (frag)
2929 fragS *frag;
2930{
2931 if (frag->fr_next)
2932 return frag->fr_next->fr_address - frag->fr_address;
2933 else
2934 return 0;
2935}
2936#endif
2937
2938/* Align an address by rounding it up to the specified boundary. */
2939valueT
2940md_section_align (seg, addr)
2941 segT seg;
2942 valueT addr; /* Address to be rounded up */
2943{
bedf545c
ILT
2944 int align;
2945#ifdef BFD_ASSEMBLER
2946 align = bfd_get_section_alignment (stdoutput, seg);
2947#else
2948 align = section_alignment[(int) seg];
2949#endif
2950 return (addr + (1 << align) - 1) & (-1 << align);
2951}
252b5132
RH
2952
2953extern int coff_flags;
2954
2955#ifdef OBJ_COFF
2956void
2957tc_headers_hook (headers)
2958 object_headers *headers;
2959{
2960 switch (architecture)
2961 {
2962 case ARCH_KA:
2963 coff_flags |= F_I960KA;
2964 break;
2965
2966 case ARCH_KB:
2967 coff_flags |= F_I960KB;
2968 break;
2969
2970 case ARCH_MC:
2971 coff_flags |= F_I960MC;
2972 break;
2973
2974 case ARCH_CA:
2975 coff_flags |= F_I960CA;
2976 break;
2977
2978 case ARCH_JX:
2979 coff_flags |= F_I960JX;
2980 break;
2981
2982 case ARCH_HX:
2983 coff_flags |= F_I960HX;
2984 break;
2985
2986 default:
2987 if (iclasses_seen == I_BASE)
2988 coff_flags |= F_I960CORE;
2989 else if (iclasses_seen & I_CX)
2990 coff_flags |= F_I960CA;
2991 else if (iclasses_seen & I_HX)
2992 coff_flags |= F_I960HX;
2993 else if (iclasses_seen & I_JX)
2994 coff_flags |= F_I960JX;
2995 else if (iclasses_seen & I_CX2)
2996 coff_flags |= F_I960CA;
2997 else if (iclasses_seen & I_MIL)
2998 coff_flags |= F_I960MC;
2999 else if (iclasses_seen & (I_DEC | I_FP))
3000 coff_flags |= F_I960KB;
3001 else
3002 coff_flags |= F_I960KA;
3003 break;
3004 }
3005
3006 if (flag_readonly_data_in_text)
3007 {
3008 headers->filehdr.f_magic = I960RWMAGIC;
3009 headers->aouthdr.magic = OMAGIC;
3010 }
3011 else
3012 {
3013 headers->filehdr.f_magic = I960ROMAGIC;
3014 headers->aouthdr.magic = NMAGIC;
3015 } /* set magic numbers */
3016}
3017
3018#endif /* OBJ_COFF */
3019
bedf545c
ILT
3020#ifndef BFD_ASSEMBLER
3021
252b5132
RH
3022/* Things going on here:
3023
3024 For bout, We need to assure a couple of simplifying
3025 assumptions about leafprocs for the linker: the leafproc
3026 entry symbols will be defined in the same assembly in
3027 which they're declared with the '.leafproc' directive;
3028 and if a leafproc has both 'call' and 'bal' entry points
3029 they are both global or both local.
3030
3031 For coff, the call symbol has a second aux entry that
3032 contains the bal entry point. The bal symbol becomes a
3033 label.
3034
3035 For coff representation, the call symbol has a second aux entry that
3036 contains the bal entry point. The bal symbol becomes a label. */
3037
3038void
3039tc_crawl_symbol_chain (headers)
3040 object_headers *headers;
3041{
3042 symbolS *symbolP;
3043
3044 for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
3045 {
3046#ifdef OBJ_COFF
3047 if (TC_S_IS_SYSPROC (symbolP))
3048 {
3049 /* second aux entry already contains the sysproc number */
3050 S_SET_NUMBER_AUXILIARY (symbolP, 2);
3051 S_SET_STORAGE_CLASS (symbolP, C_SCALL);
3052 S_SET_DATA_TYPE (symbolP, S_GET_DATA_TYPE (symbolP) | (DT_FCN << N_BTSHFT));
3053 continue;
3054 } /* rewrite sysproc */
3055#endif /* OBJ_COFF */
3056
3057 if (!TC_S_IS_BALNAME (symbolP) && !TC_S_IS_CALLNAME (symbolP))
3058 {
3059 continue;
3060 } /* Not a leafproc symbol */
3061
3062 if (!S_IS_DEFINED (symbolP))
3063 {
3064 as_bad (_("leafproc symbol '%s' undefined"), S_GET_NAME (symbolP));
3065 } /* undefined leaf */
3066
3067 if (TC_S_IS_CALLNAME (symbolP))
3068 {
3069 symbolS *balP = tc_get_bal_of_call (symbolP);
3070 if (S_IS_EXTERNAL (symbolP) != S_IS_EXTERNAL (balP))
3071 {
3072 S_SET_EXTERNAL (symbolP);
3073 S_SET_EXTERNAL (balP);
3074 as_warn (_("Warning: making leafproc entries %s and %s both global\n"),
3075 S_GET_NAME (symbolP), S_GET_NAME (balP));
3076 } /* externality mismatch */
3077 } /* if callname */
3078 } /* walk the symbol chain */
3079}
3080
bedf545c
ILT
3081#endif /* ! BFD_ASSEMBLER */
3082
252b5132
RH
3083/* For aout or bout, the bal immediately follows the call.
3084
3085 For coff, we cheat and store a pointer to the bal symbol in the
3086 second aux entry of the call. */
3087
3088#undef OBJ_ABOUT
3089#ifdef OBJ_AOUT
3090#define OBJ_ABOUT
3091#endif
3092#ifdef OBJ_BOUT
3093#define OBJ_ABOUT
3094#endif
3095
3096void
3097tc_set_bal_of_call (callP, balP)
3098 symbolS *callP;
3099 symbolS *balP;
3100{
3101 know (TC_S_IS_CALLNAME (callP));
3102 know (TC_S_IS_BALNAME (balP));
3103
3104#ifdef OBJ_COFF
3105
3106 callP->sy_tc = balP;
3107 S_SET_NUMBER_AUXILIARY (callP, 2);
3108
3109#else /* ! OBJ_COFF */
3110#ifdef OBJ_ABOUT
3111
3112 /* If the 'bal' entry doesn't immediately follow the 'call'
3113 * symbol, unlink it from the symbol list and re-insert it.
3114 */
3115 if (symbol_next (callP) != balP)
3116 {
3117 symbol_remove (balP, &symbol_rootP, &symbol_lastP);
3118 symbol_append (balP, callP, &symbol_rootP, &symbol_lastP);
3119 } /* if not in order */
3120
3121#else /* ! OBJ_ABOUT */
bedf545c 3122 as_fatal ("Only supported for a.out, b.out, or COFF");
252b5132
RH
3123#endif /* ! OBJ_ABOUT */
3124#endif /* ! OBJ_COFF */
3125}
3126
3127symbolS *
3128tc_get_bal_of_call (callP)
3129 symbolS *callP;
3130{
3131 symbolS *retval;
3132
3133 know (TC_S_IS_CALLNAME (callP));
3134
3135#ifdef OBJ_COFF
3136 retval = callP->sy_tc;
3137#else
3138#ifdef OBJ_ABOUT
3139 retval = symbol_next (callP);
3140#else
bedf545c 3141 as_fatal ("Only supported for a.out, b.out, or COFF");
252b5132
RH
3142#endif /* ! OBJ_ABOUT */
3143#endif /* ! OBJ_COFF */
3144
3145 know (TC_S_IS_BALNAME (retval));
3146 return retval;
3147} /* _tc_get_bal_of_call() */
3148
3149void
3150tc_coff_symbol_emit_hook (symbolP)
3151 symbolS *symbolP;
3152{
3153 if (TC_S_IS_CALLNAME (symbolP))
3154 {
3155#ifdef OBJ_COFF
3156 symbolS *balP = tc_get_bal_of_call (symbolP);
3157
3158#if 0
3159 /* second aux entry contains the bal entry point */
3160 S_SET_NUMBER_AUXILIARY (symbolP, 2);
3161#endif
3162 symbolP->sy_symbol.ost_auxent[1].x_bal.x_balntry = S_GET_VALUE (balP);
3163 if (S_GET_STORAGE_CLASS (symbolP) == C_EXT)
3164 S_SET_STORAGE_CLASS (symbolP, C_LEAFEXT);
3165 else
3166 S_SET_STORAGE_CLASS (symbolP, C_LEAFSTAT);
3167 S_SET_DATA_TYPE (symbolP, S_GET_DATA_TYPE (symbolP) | (DT_FCN << N_BTSHFT));
3168 /* fix up the bal symbol */
3169 S_SET_STORAGE_CLASS (balP, C_LABEL);
3170#endif /* OBJ_COFF */
3171 } /* only on calls */
3172}
3173
3174void
3175i960_handle_align (fragp)
3176 fragS *fragp;
3177{
3178 if (!linkrelax)
3179 return;
3180
3181#ifndef OBJ_BOUT
3182
3183 as_bad (_("option --link-relax is only supported in b.out format"));
3184 linkrelax = 0;
3185 return;
3186
3187#else
3188
3189 /* The text section "ends" with another alignment reloc, to which we
3190 aren't adding padding. */
3191 if (fragp->fr_next == text_last_frag
3192 || fragp->fr_next == data_last_frag)
3193 return;
3194
3195 /* alignment directive */
3196 fix_new (fragp, fragp->fr_fix, fragp->fr_offset, 0, 0, 0,
3197 (int) fragp->fr_type);
3198#endif /* OBJ_BOUT */
3199}
3200
3201int
3202i960_validate_fix (fixP, this_segment_type, add_symbolPP)
3203 fixS *fixP;
3204 segT this_segment_type;
3205 symbolS **add_symbolPP;
3206{
3207#define add_symbolP (*add_symbolPP)
3208 if (fixP->fx_tcbit && TC_S_IS_CALLNAME (add_symbolP))
3209 {
3210 /* Relocation should be done via the associated 'bal'
92774660 3211 entry point symbol. */
252b5132
RH
3212
3213 if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
3214 {
3215 as_bad (_("No 'bal' entry point for leafproc %s"),
3216 S_GET_NAME (add_symbolP));
3217 return 1;
3218 }
3219 fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
3220 }
3221#if 0
3222 /* Still have to work out other conditions for these tests. */
3223 {
3224 if (fixP->fx_tcbit)
3225 {
3226 as_bad (_("callj to difference of two symbols"));
3227 return 1;
3228 }
3229 reloc_callj (fixP);
3230 if ((int) fixP->fx_bit_fixP == 13)
3231 {
3232 /* This is a COBR instruction. They have only a 13-bit
3233 displacement and are only to be used for local branches:
3234 flag as error, don't generate relocation. */
3235 as_bad (_("can't use COBR format with external label"));
92774660 3236 fixP->fx_addsy = NULL; /* No relocations please. */
252b5132
RH
3237 return 1;
3238 }
3239 }
3240#endif
3241#undef add_symbolP
3242 return 0;
3243}
3244
bedf545c
ILT
3245#ifdef BFD_ASSEMBLER
3246
3247/* From cgen.c: */
3248
3249static short
3250tc_bfd_fix2rtype (fixP)
3251 fixS *fixP;
3252{
3253#if 0
3254 if (fixP->fx_bsr)
3255 abort ();
3256#endif
3257
3258 if (fixP->fx_pcrel == 0 && fixP->fx_size == 4)
3259 return BFD_RELOC_32;
3260
3261 if (fixP->fx_pcrel != 0 && fixP->fx_size == 4)
3262 return BFD_RELOC_24_PCREL;
3263
3264 abort ();
3265 return 0;
3266}
3267
3268/* Translate internal representation of relocation info to BFD target
3269 format.
3270
3271 FIXME: To what extent can we get all relevant targets to use this? */
3272
3273arelent *
3274tc_gen_reloc (section, fixP)
3275 asection *section;
3276 fixS *fixP;
3277{
3278 arelent * reloc;
3279
3280 reloc = (arelent *) xmalloc (sizeof (arelent));
3281
3282 /* HACK: Is this right? */
3283 fixP->fx_r_type = tc_bfd_fix2rtype (fixP);
3284
3285 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
3286 if (reloc->howto == (reloc_howto_type *) NULL)
3287 {
3288 as_bad_where (fixP->fx_file, fixP->fx_line,
3289 "internal error: can't export reloc type %d (`%s')",
3290 fixP->fx_r_type,
3291 bfd_get_reloc_code_name (fixP->fx_r_type));
3292 return NULL;
3293 }
3294
3295 assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
3296
49309057
ILT
3297 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
3298 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
bedf545c
ILT
3299 reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
3300 reloc->addend = fixP->fx_addnumber;
3301
3302 return reloc;
3303}
3304
3305/* end from cgen.c */
3306
3307#endif /* BFD_ASSEMBLER */
3308
252b5132 3309/* end of tc-i960.c */
This page took 0.265462 seconds and 4 git commands to generate.