source: trunk/binutils/gas/config/tc-i960.c@ 2562

Last change on this file since 2562 was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

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