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