1/* tc-i960.c - All the i80960-specific stuff
2   Copyright (C) 1989-2017 Free Software Foundation, Inc.
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
8   the Free Software Foundation; either version 3, or (at your option)
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
18   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19   02110-1301, USA.  */
20
21/* See comment on md_parse_option for 80960-specific invocation options.  */
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
64#include "as.h"
65
66#include "safe-ctype.h"
67
68#include "opcode/i960.h"
69
70#if defined (OBJ_AOUT) || defined (OBJ_BOUT)
71
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))
76
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)
79
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))
82#define TC_S_FORCE_TO_SYSPROC(s)	{;}
83
84#else /* ! OBJ_A/BOUT */
85#ifdef OBJ_COFF
86
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))
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
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))
98
99#else /* ! OBJ_COFF */
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)
108#define TC_S_GET_SYSPROC(s)     0
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 */
116#endif /* ! OBJ_COFF */
117#endif /* ! OBJ_A/BOUT */
118
119extern char *input_line_pointer;
120
121/* Local i80960 routines.  */
122struct memS;
123struct regop;
124
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.  */
128
129/* Characters that always start a comment.
130   If the pre-processor is disabled, these aren't very useful.  */
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
139   #NO_APP at the beginning of its output.  */
140
141/* Also note that comments started like this one will always work.  */
142
143const char line_comment_chars[]   = "#";
144const char line_separator_chars[] = ";";
145
146/* Chars that can be used to separate mant from exp in floating point nums.  */
147const char EXP_CHARS[] = "eE";
148
149/* Chars that mean this number is a floating point constant,
150   as in 0f12.456 or 0d1.2345e12.  */
151const char FLT_CHARS[] = "fFdDtT";
152
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
162   displacement won't hack it.  */
163const relax_typeS md_relax_table[] =
164{
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).  */
168};
169
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
176        integer arg to pass to the function.  */
177#define S_LEAFPROC	1
178#define S_SYSPROC	2
179
180/* Macros to extract info from an 'expressionS' structure 'e'.  */
181#define adds(e)	e.X_add_symbol
182#define offs(e)	e.X_add_number
183
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.  */
188
189/* Some instruction opcodes that we need explicitly.  */
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
208/* These masks are used to build up a set of MEMB mode bits.  */
209#define	A_BIT		0x0400
210#define	I_BIT		0x0800
211#define MEMB_BIT	0x1000
212#define	D_BIT		0x2000
213
214/* Mask for the only mode bit in a MEMA instruction (if set, abase reg is
215   used).  */
216#define MEMA_ABASE	0x2000
217
218/* Info from which a MEMA or MEMB format instruction can be generated.  */
219typedef struct memS
220  {
221    /* (First) 32 bits of instruction.  */
222    long opcode;
223    /* 0-(none), 12- or, 32-bit displacement needed.  */
224    int disp;
225    /* The expression in the source instruction from which the
226       displacement should be determined.  */
227    char *e;
228  }
229memS;
230
231/* The two pieces of info we need to generate a register operand.  */
232struct regop
233  {
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.  */
237  };
238
239/* Number and assembler mnemonic for all registers that can appear in
240   operands.  */
241static const struct
242  {
243    const char *reg_name;
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
337{
338  const char *areg_name;
339  int areg_num;
340}
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
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.  */
388
389/* Architecture for which we are assembling.  */
390#define ARCH_ANY	0	/* Default: no architecture checking done.  */
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
397int architecture = ARCH_ANY;	/* Architecture requested on invocation line.  */
398int iclasses_seen;		/* OR of instruction classes (I_* constants)
399				      for which we've actually assembled
400				        instructions.  */
401
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
409        brach-prediction.)
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
435            list of such tables.  */
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.  */
452
453static void ctrl_fmt (const char *, long, int);
454
455
456void
457md_begin (void)
458{
459  int i;			/* Loop counter.  */
460  const struct i960_opcode *oP;	/* Pointer into opcode table.  */
461  const char *retval;		/* Value returned by hash functions.  */
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++)
472    retval = hash_insert (op_hash, oP->name, (void *) oP);
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
486/* parse_expr:		parse an expression
487
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.
491
492   An empty expression string is treated as an absolute 0.
493
494   Sets O_illegal regardless of expression evaluation if entire input
495   string is not consumed in the evaluation -- tolerate no dangling junk!  */
496
497static void
498parse_expr (const char *textP,		/* Text of expression to be parsed.  */
499	    expressionS *expP)		/* Where to put the results of parsing.  */
500{
501  char *save_in;		/* Save global here.  */
502  symbolS *symP;
503
504  know (textP);
505
506  if (*textP == '\0')
507    {
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;
512    }
513  else
514    {
515      save_in = input_line_pointer;	/* Save global.  */
516      input_line_pointer = (char *) textP;	/* Make parser work for us.  */
517
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;
522
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;
528
529      input_line_pointer = save_in;	/* Restore global.  */
530    }
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
561get_cdisp (const char *dispP, /* Displacement as specified in source instruction.  */
562	   const char *ifmtP, /* "COBR" or "CTRL" (for use in error message).  */
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.  */
567	   int callj)	/* 1 if callj relocation should be done; else 0.  */
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)
577    {
578    case O_illegal:
579      as_bad (_("expression syntax error"));
580      break;
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)
585	{
586	  if (var_frag)
587	    {
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);
592	    }
593	  else
594	    {
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;
613	    }
614	}
615      else
616	as_bad (_("attempt to branch into different segment"));
617      break;
618
619    default:
620      as_bad (_("target of %s instruction must be a label"), ifmtP);
621      break;
622    }
623}
624
625static int
626md_chars_to_number (char * val,		/* Value in target byte order.  */
627		    int n)		/* Number of bytes in the input.  */
628{
629  int retval;
630
631  for (retval = 0; n--;)
632    {
633      retval <<= 8;
634      retval |= (unsigned char) val[n];
635    }
636  return retval;
637}
638
639/* mema_to_memb:	convert a MEMA-format opcode to a MEMB-format opcode.
640
641   There are 2 possible MEMA formats:
642  	- displacement only
643  	- displacement + abase
644
645   They are distinguished by the setting of the MEMA_ABASE bit.  */
646
647static void
648mema_to_memb (char * opcodeP)	/* Where to find the opcode, in target byte order.  */
649{
650  long opcode;			/* Opcode in host byte order.  */
651  long mode;			/* Mode bits for MEMB instruction.  */
652
653  opcode = md_chars_to_number (opcodeP, 4);
654  know (!(opcode & MEMB_BIT));
655
656  mode = MEMB_BIT | D_BIT;
657  if (opcode & MEMA_ABASE)
658    mode |= A_BIT;
659
660  opcode &= 0xffffc000;		/* Clear MEMA offset and mode bits.  */
661  opcode |= mode;		/* Set MEMB mode bits.  */
662
663  md_number_to_chars (opcodeP, opcode, 4);
664}
665
666/* targ_has_sfr:
667
668   Return TRUE iff the target architecture supports the specified
669   special-function register (sfr).  */
670
671static int
672targ_has_sfr (int n)		/* Number (0-31) of sfr.  */
673{
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    }
687}
688
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;
696
697  rP = (int *) hash_find (reg_hash, regname);
698  return (rP == NULL) ? -1 : *rP;
699}
700
701/* syntax: Issue a syntax error.  */
702
703static void
704syntax (void)
705{
706  as_bad (_("syntax error"));
707}
708
709/* parse_regop: parse a register operand.
710
711   In case of illegal operand, issue a message and return some valid
712   information so instruction processing can continue.  */
713
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.  */
721
722  /* See if operand is a register.  */
723  n = get_regnum (optext);
724  if (n >= 0)
725    {
726      if (IS_RG_REG (n))
727	{
728	  /* Global or local register.  */
729	  if (!REG_ALIGN (opdesc, n))
730	    as_bad (_("unaligned register"));
731
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"));
753
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;
770
771	  if (!strcmp (optext, "0.0") || !strcmp (optext, "0"))
772	    {
773	      regopP->n = 0x10;
774	      return;
775	    }
776
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    }
797
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}
804
805/* get_ispec:	parse a memory operand for an index specification
806
807   Here, an "index specification" is taken to be anything surrounded
808   by square brackets and NOT followed by anything else.
809
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.  */
812
813static char *
814get_ispec (char *textP)  /* Pointer to memory operand from source instruction, no white space.  */
815
816{
817  /* Points to start of index specification.  */
818  char *start;
819  /* Points to end of index specification.  */
820  char *end;
821
822  /* Find opening square bracket, if any.  */
823  start = strchr (textP, '[');
824
825  if (start != NULL)
826    {
827      /* Eliminate '[', detach from rest of operand.  */
828      *start++ = '\0';
829
830      end = strchr (start, ']');
831
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}
845
846/* parse_memop:	parse a memory operand
847
848  	This routine is based on the observation that the 4 mode bits of the
849  	MEMB format, taken individually, have fairly consistent meaning:
850
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)
855
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.
859
860  	Unfortunately, I said "fairly consistent".  The exceptions:
861
862  		 DBIA
863  		 0100	Would seem illegal, but means "abase-only".
864
865  		 0101	Would seem to mean "abase-only" -- it means IP-relative.
866  			Must be converted to 0100.
867
868  		 0110	Would seem to mean "index-only", but is reserved.
869  			We turn on the D bit and provide a 0 displacement.
870
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.  */
874
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.  */
879{
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.  */
889
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  };
904
905  iprel_flag = mode = 0;
906
907  /* Any index present? */
908  indexP = get_ispec (argP);
909  if (indexP)
910    {
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 '*' */
925
926	  /* Now indexP->a '\0'-terminated register name,
927	     and p->a scale factor.  */
928
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	}
936
937      regnum = get_regnum (indexP);	/* Get index reg. # */
938      if (!IS_RG_REG (regnum))
939	{
940	  as_bad (_("invalid index register"));
941	  return;
942	}
943
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	};
966
967      memP->opcode |= scale | regnum;	/* Set index bits in opcode.  */
968      mode |= I_BIT;			/* Found a valid index spec.  */
969    }
970
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)
983	    /* We have to specialcase ip-rel mode.  */
984	    iprel_flag = 1;
985	  else
986	    {
987	      memP->opcode |= regnum << 14;
988	      mode |= A_BIT;
989	    }
990	}
991    }
992
993  /* Any expression present?  */
994  memP->e = argP;
995  if (*argP != '\0')
996    mode |= D_BIT;
997
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    }
1010
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;
1022
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;
1028
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;
1035
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;
1040
1041    case I_BIT:
1042      /* Treat missing displacement as displacement of 0.  */
1043      mode |= D_BIT;
1044      /* Fall through.  */
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;
1051
1052    default:
1053      syntax ();
1054      break;
1055    }
1056}
1057
1058/* Generate a MEMA- or MEMB-format instruction.  */
1059
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.  */
1064{
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.  */
1070  expressionS exp;		/* Parsed expression.  */
1071  /* ->description of deferred address fixup.  */
1072  fixS *fixP;
1073
1074#ifdef OBJ_COFF
1075  /* COFF support isn't in place yet for callx relaxing.  */
1076  callx = 0;
1077#endif
1078
1079  memset (&instr, '\0', sizeof (memS));
1080  instr.opcode = oP->opcode;
1081
1082  /* Process operands.  */
1083  for (i = 1; i <= oP->num_ops; i++)
1084    {
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	}
1094    }
1095
1096  /* Parse the displacement; this must be done before emitting the
1097     opcode, in case it is an expression using `.'.  */
1098  parse_expr (instr.e, &exp);
1099
1100  /* Output opcode.  */
1101  outP = emit (instr.opcode);
1102
1103  if (instr.disp == 0)
1104    return;
1105
1106  /* Process the displacement.  */
1107  switch (exp.X_op)
1108    {
1109    case O_illegal:
1110      as_bad (_("expression syntax error"));
1111      break;
1112
1113    case O_constant:
1114      if (instr.disp == 32)
1115	(void) emit (offs (exp));	/* Output displacement.  */
1116      else
1117	{
1118	  /* 12-bit displacement.  */
1119	  if (offs (exp) & ~0xfff)
1120	    {
1121	      /* Won't fit in 12 bits: convert already-output
1122	         instruction to MEMB format, output
1123	         displacement.  */
1124	      mema_to_memb (outP);
1125	      (void) emit (offs (exp));
1126	    }
1127	  else
1128	    {
1129	      /* WILL fit in 12 bits:  OR into opcode and
1130	         overwrite the binary we already put out.  */
1131	      instr.opcode |= offs (exp);
1132	      md_number_to_chars (outP, instr.opcode, 4);
1133	    }
1134	}
1135      break;
1136
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,
1149			  4, &exp, 0, NO_RELOC);
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;
1155    }
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)
1170    {
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)))
1186	{
1187	  as_warn (_("architecture of opcode conflicts with that of earlier instruction(s)"));
1188	  iclasses_seen &= ~ic;
1189	}
1190      return 1;
1191    }
1192}
1193
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.
1198
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".  */
1250      arg[0] = (char *) "lda";
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>
1262
1263         Anything else becomes:
1264                lda xxx,<reg>.  */
1265      n = offs (e);
1266      if ((0 <= n) && (n <= 31))
1267	arg[0] = (char *) "mov";
1268      else if ((-31 <= n) && (n <= -1))
1269	{
1270	  arg[0] = (char *) "subo";
1271	  arg[3] = arg[2];
1272	  sprintf (buf, "%d", -n);
1273	  arg[1] = buf;
1274	  arg[2] = (char *) "0";
1275	}
1276      else if ((32 <= n) && (n <= 62))
1277	{
1278	  arg[0] = (char *) "addo";
1279	  arg[3] = arg[2];
1280	  arg[1] = (char *) "31";
1281	  sprintf (buf, "%d", n - 31);
1282	  arg[2] = buf;
1283	}
1284      else if ((shift = shift_ok (n)) != 0)
1285	{
1286	  arg[0] = (char *) "shlo";
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
1294	arg[0] = (char *) "lda";
1295      break;
1296
1297    case O_illegal:
1298      as_bad (_("invalid constant"));
1299      return -1;
1300      break;
1301    }
1302  return (arg[3] == 0) ? 2 : 3;
1303}
1304
1305/* reg_fmt:	generate a REG-format instruction.  */
1306
1307static void
1308reg_fmt (char *args[],		/* args[0]->opcode mnemonic, args[1-3]->operands.  */
1309	 struct i960_opcode *oP)/* Pointer to description of instruction.  */
1310{
1311  long instr;			/* Binary to be output.  */
1312  struct regop regop;		/* Description of register operand.  */
1313  int n_ops;			/* Number of operands.  */
1314
1315  instr = oP->opcode;
1316  n_ops = oP->num_ops;
1317
1318  if (n_ops >= 1)
1319    {
1320      parse_regop (&regop, args[1], oP->operand[0]);
1321
1322      if ((n_ops == 1) && !(instr & M3))
1323	{
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;
1331	}
1332      else
1333	{
1334	  /* regop.n goes in bit 0, needs no shifting.  */
1335	  regop.mode <<= 11;
1336	  regop.special <<= 5;
1337	}
1338      instr |= regop.n | regop.mode | regop.special;
1339    }
1340
1341  if (n_ops >= 2)
1342    {
1343      parse_regop (&regop, args[2], oP->operand[1]);
1344
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);
1371}
1372
1373/* get_args:	break individual arguments out of comma-separated list
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:
1386   Number of operands (0,1,2, or 3) or -1 on error.  */
1387
1388static int
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
1393{
1394  int n;		/* Number of operands.  */
1395  char *to;
1396
1397  /* Skip lead white space.  */
1398  while (*p == ' ')
1399    p++;
1400
1401  if (*p == '\0')
1402    return 0;
1403
1404  n = 1;
1405  args[1] = p;
1406
1407  /* Squeze blanks out by moving non-blanks toward start of string.
1408     Isolate operands, whenever comma is found.  */
1409  to = p;
1410  while (*p != '\0')
1411    {
1412      if (*p == ' '
1413	  && (! ISALNUM (p[1])
1414	      || ! ISALNUM (p[-1])))
1415	p++;
1416      else if (*p == ',')
1417	{
1418	  /* Start of operand.  */
1419	  if (n == 3)
1420	    {
1421	      as_bad (_("too many operands"));
1422	      return -1;
1423	    }
1424	  *to++ = '\0';		/* Terminate argument.  */
1425	  args[++n] = to;	/* Start next argument.  */
1426	  p++;
1427	}
1428      else
1429	*to++ = *p++;
1430    }
1431  *to = '\0';
1432  return n;
1433}
1434
1435/* i_scan:	perform lexical scan of ascii assembler instruction.
1436
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.
1441
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
1447
1448   Return value:
1449     Number of operands (0,1,2, or 3) or -1 on error.  */
1450
1451static int
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.  */
1455{
1456  /* Isolate opcode.  */
1457  if (*(iP) == ' ')
1458    iP++;
1459
1460  args[0] = iP;
1461  for (; *iP != ' '; iP++)
1462    {
1463      if (*iP == '\0')
1464	{
1465	  /* There are no operands.  */
1466	  if (args[0] == iP)
1467	    {
1468	      /* We never moved: there was no opcode either!  */
1469	      as_bad (_("missing opcode"));
1470	      return -1;
1471	    }
1472	  return 0;
1473	}
1474    }
1475  *iP++ = '\0';
1476  return (get_args (iP, args));
1477}
1478
1479static void
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}
1487
1488static char *
1489brlab_next (void)
1490{
1491  static char buf[20];
1492
1493  sprintf (buf, "%s%d", BR_LABEL_BASE, br_cnt++);
1494  return buf;
1495}
1496
1497static void
1498ctrl_fmt (const char *targP,		/* Pointer to text of lone operand (if any).  */
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
1508    {
1509      instrument = instrument_branches && (opcode != CALL)
1510	&& (opcode != B) && (opcode != RET) && (opcode != BAL);
1511
1512      if (instrument)
1513	{
1514	  brcnt_emit ();
1515	  colon (brlab_next ());
1516	}
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 ();
1524    }
1525}
1526
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.  */
1541
1542  instr = opcode;
1543  n = oP->num_ops;
1544
1545  if (n >= 1)
1546    {
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);
1551    }
1552
1553  if (n >= 2)
1554    {
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    }
1560
1561  if (n < 3)
1562    emit (instr);
1563  else
1564    {
1565      if (instrument_branches)
1566	{
1567	  brcnt_emit ();
1568	  colon (brlab_next ());
1569	}
1570
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);
1578
1579      if (instrument_branches)
1580	brcnt_emit ();
1581    }
1582}
1583
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.  */
1589
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");
1610
1611  /* Parse instruction into opcode and operands.  */
1612  memset (args, '\0', sizeof (args));
1613
1614  n_ops = i_scan (textP, args);
1615
1616  if (n_ops == -1)
1617    return;			/* Error message already issued.  */
1618
1619  /* Do "macro substitution" (sort of) on 'ldconst' pseudo-instruction.  */
1620  if (!strcmp (args[0], "ldconst"))
1621    {
1622      n_ops = parse_ldconst (args);
1623      if (n_ops == -1)
1624	return;
1625    }
1626
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;
1631
1632  if (args[0][n - 1] == '.' && (args[0][n] == 't' || args[0][n] == 'f'))
1633    {
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 */
1640    }
1641
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)
1649    as_bad (_("improper number of operands.  expecting %d, got %d"),
1650	    oP->num_ops, n_ops);
1651  else
1652    {
1653      switch (oP->format)
1654	{
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);
1661	  break;
1662	case COBR:
1663	case COJ:
1664	  cobr_fmt (args, oP->opcode | bp_bits, oP);
1665	  break;
1666	case REG:
1667	  if (branch_predict)
1668	    as_warn ("%s", bp_error_msg);
1669	  reg_fmt (args, oP);
1670	  break;
1671	case MEM1:
1672	  if (args[0][0] == 'c' && args[0][1] == 'a')
1673	    {
1674	      if (branch_predict)
1675		as_warn ("%s", bp_error_msg);
1676	      mem_fmt (args, oP, 1);
1677	      break;
1678	    }
1679	  /* Fall through.  */
1680	case MEM2:
1681	case MEM4:
1682	case MEM8:
1683	case MEM12:
1684	case MEM16:
1685	  if (branch_predict)
1686	    as_warn ("%s", bp_error_msg);
1687	  mem_fmt (args, oP, 0);
1688	  break;
1689	case CALLJ:
1690	  if (branch_predict)
1691	    as_warn ("%s", bp_error_msg);
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);
1696	  break;
1697	default:
1698	  BAD_CASE (oP->format);
1699	  break;
1700	}
1701    }
1702}
1703
1704void
1705md_number_to_chars (char *buf,
1706		    valueT value,
1707		    int n)
1708{
1709  number_to_chars_littleendian (buf, value, n);
1710}
1711
1712const char *
1713md_atof (int type, char *litP, int *sizeP)
1714{
1715  return ieee_md_atof (type, litP, sizeP, FALSE);
1716}
1717
1718static void
1719md_number_to_imm (char *buf, long val, int n)
1720{
1721  md_number_to_chars (buf, val, n);
1722}
1723
1724static void
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.  */
1728{
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'.  */
1732
1733  /* Convert instruction back to host byte order.  */
1734  instr = md_chars_to_number (instrP, 4);
1735
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;
1742
1743  know ((numbits == 13) || (numbits == 24));
1744
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
1753    {
1754      /* Put bit field into instruction and write back in target
1755         * byte order.  */
1756      val &= ~(-(1 << (int) numbits));	/* Clear unused sign bits.  */
1757      instr |= val;
1758      md_number_to_chars (instrP, instr, 4);
1759    }
1760}
1761
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{
1814  const char *flag;
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
1832md_parse_option (int c, const char *arg)
1833{
1834  switch (c)
1835    {
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;
1852	const char *p = arg;
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;
1870    }
1871
1872  return 1;
1873}
1874
1875void
1876md_show_usage (FILE *stream)
1877{
1878  int i;
1879
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
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.  */
1896
1897/* This "conditional jump" table maps cobr instructions into
1898   equivalent compare and branch opcodes.  */
1899
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
1927static void
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.  */
1931{
1932  int opcode, src1, src2, m1, s2;
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.  */
1937  char *iP;
1938  fixS *fixP;			/* Relocation that can be done at assembly time.  */
1939
1940  /* Pick up & parse cobr instruction.  */
1941  iP = fragP->fr_opcode;
1942  instr = md_chars_to_number (iP, 4);
1943  opcode = ((instr >> 24) & 0xff) - 0x30;	/* "-0x30" for table index.  */
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
1950  /* Generate and output compare instruction.  */
1951  instr = coj[opcode].compare
1952    | src1 | (m1 << 11) | (s2 << 6) | (src2 << 14);
1953  md_number_to_chars (iP, instr, 4);
1954
1955  /* Output branch instruction.  */
1956  md_number_to_chars (iP + 4, coj[opcode].branch | bp_bits, 4);
1957
1958  /* Set up address fixup/relocation.  */
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
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
1985void
1986md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1987		 segT sec ATTRIBUTE_UNUSED,
1988		 fragS *fragP)
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.
2046
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
2073}
2074
2075#endif /* defined(OBJ_AOUT) | defined(OBJ_BOUT) */
2076
2077
2078/* brtab_emit:	generate the fetch-prediction branch table.
2079
2080   See the comments above the declaration of 'br_cnt' for details on
2081   branch-prediction instrumentation.
2082
2083   The code emitted here would be functionally equivalent to the following
2084   example assembler source.
2085
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  */
2094
2095void
2096brtab_emit (void)
2097{
2098  int i;
2099  char buf[20];
2100  /* Where the binary was output to.  */
2101  char *p;
2102
2103  if (!instrument_branches)
2104    return;
2105
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 */
2112
2113  for (i = 0; i < br_cnt; i++)
2114    {
2115      sprintf (buf, "%s%d", BR_LABEL_BASE, i);
2116      p = emit (0);
2117      fix_new (frag_now,
2118	       p - frag_now->fr_literal,
2119	       4, symbol_find (buf), 0, 0, NO_RELOC);
2120    }
2121}
2122
2123/* s_leafproc:	process .leafproc pseudo-op
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
2134  	list of symbols.  */
2135
2136static void
2137s_leafproc (int n_ops,		/* Number of operands.  */
2138	    char *args[])	/* args[1]->1st operand, args[2]->2nd operand.  */
2139{
2140  symbolS *callP;		/* Pointer to leafproc 'call' entry point symbol.  */
2141  symbolS *balP;		/* Pointer to leafproc 'bal' entry point symbol.  */
2142
2143  if ((n_ops != 1) && (n_ops != 2))
2144    {
2145      as_bad (_("should have 1 or 2 operands"));
2146      return;
2147    }
2148
2149  /* Find or create symbol for 'call' entry point.  */
2150  callP = symbol_find_or_make (args[1]);
2151
2152  if (TC_S_IS_CALLNAME (callP))
2153    as_warn (_("Redefining leafproc %s"), S_GET_NAME (callP));
2154
2155  /* If that was the only argument, use it as the 'bal' entry point.
2156     Otherwise, mark it as the 'call' entry point and find or create
2157     another symbol for the 'bal' entry point.  */
2158  if ((n_ops == 1) || !strcmp (args[1], args[2]))
2159    {
2160      TC_S_FORCE_TO_BALNAME (callP);
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))
2168	as_warn (_("Redefining leafproc %s"), S_GET_NAME (balP));
2169
2170      TC_S_FORCE_TO_BALNAME (balP);
2171
2172#ifndef OBJ_ELF
2173      tc_set_bal_of_call (callP, balP);
2174#endif
2175    }
2176}
2177
2178/* s_sysproc: process .sysproc pseudo-op
2179
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.  */
2188
2189static void
2190s_sysproc (int n_ops,		/* Number of operands.  */
2191	   char *args[])	/* args[1]->1st operand, args[2]->2nd operand.  */
2192{
2193  expressionS exp;
2194  symbolS *symP;
2195
2196  if (n_ops != 2)
2197    {
2198      as_bad (_("should have two operands"));
2199      return;
2200    }
2201
2202  /* Parse "entry_num" argument and check it for validity.  */
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
2212  /* Find/make symbol and stick entry number (biased by +1) into it.  */
2213  symP = symbol_find_or_make (args[1]);
2214
2215  if (TC_S_IS_SYSPROC (symP))
2216    as_warn (_("Redefining entrynum for sysproc %s"), S_GET_NAME (symP));
2217
2218  TC_S_SET_SYSPROC (symP, offs (exp));	/* Encode entry number.  */
2219  TC_S_FORCE_TO_SYSPROC (symP);
2220}
2221
2222/* parse_po:	parse machine-dependent pseudo-op
2223
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.  */
2227
2228static void
2229parse_po (int po_num)	/* Pseudo-op number:  currently S_LEAFPROC or S_SYSPROC.  */
2230{
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.  */
2237
2238  extern char is_end_of_line[];
2239
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++;
2244
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)
2255    {
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;
2265    }
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;
2271}
2272
2273/* reloc_callj:	Relocate a 'callj' instruction
2274
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.
2278
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.
2283
2284  	See b.out.h for details on the 'n_other' field in a symbol structure.
2285
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
2292reloc_callj (fixS *fixP)  /* Relocation that can be done at assembly time.  */
2293{
2294  /* Points to the binary for the instruction being relocated.  */
2295  char *where;
2296
2297  if (!fixP->fx_tcbit)
2298    /* This wasn't a callj instruction in the first place.  */
2299    return 0;
2300
2301  where = fixP->fx_frag->fr_literal + fixP->fx_where;
2302
2303  if (TC_S_IS_SYSPROC (fixP->fx_addsy))
2304    {
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);
2324    }
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;
2330}
2331
2332/* Handle the MRI .endian pseudo-op.  */
2333
2334static void
2335s_endian (int ignore ATTRIBUTE_UNUSED)
2336{
2337  char *name;
2338  char c;
2339
2340  c = get_symbol_name (&name);
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
2348  (void) restore_line_pointer (c);
2349
2350  demand_empty_rest_of_line ();
2351}
2352
2353/* We have no need to default values of symbols.  */
2354
2355symbolS *
2356md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
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,
2363   which we have set up as the address of the fixup too.  */
2364long
2365md_pcrel_from (fixS *fixP)
2366{
2367  return fixP->fx_where + fixP->fx_frag->fr_address;
2368}
2369
2370void
2371md_apply_fix (fixS *fixP,
2372	       valueT *valP,
2373	       segT seg ATTRIBUTE_UNUSED)
2374{
2375  long val = *valP;
2376  char *place = fixP->fx_where + fixP->fx_frag->fr_literal;
2377
2378  if (!fixP->fx_bit_fixP)
2379    {
2380      md_number_to_imm (place, val, fixP->fx_size);
2381    }
2382  else if ((int) (size_t) fixP->fx_bit_fixP == 13
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    }
2394  else
2395    md_number_to_field (place, val, fixP->fx_bit_fixP);
2396
2397  if (fixP->fx_addsy == NULL)
2398    fixP->fx_done = 1;
2399}
2400
2401#if defined(OBJ_AOUT) | defined(OBJ_BOUT)
2402void
2403tc_bout_fix_to_chars (char *where,
2404		      fixS *fixP,
2405		      relax_addressT segment_address_in_file)
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
2456  /* Output the relocation information in machine-dependent form.  */
2457  md_ri_to_chars (where, &ri);
2458}
2459
2460#endif /* OBJ_AOUT or OBJ_BOUT */
2461
2462/* Align an address by rounding it up to the specified boundary.  */
2463
2464valueT
2465md_section_align (segT seg,
2466		  valueT addr)		/* Address to be rounded up.  */
2467{
2468  int align;
2469
2470  align = bfd_get_section_alignment (stdoutput, seg);
2471  return (addr + (1 << align) - 1) & -(1 << align);
2472}
2473
2474extern int coff_flags;
2475
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
2490tc_set_bal_of_call (symbolS *callP ATTRIBUTE_UNUSED,
2491		    symbolS *balP ATTRIBUTE_UNUSED)
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'
2505     symbol, unlink it from the symbol list and re-insert it.  */
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 */
2513  as_fatal ("Only supported for a.out, b.out, or COFF");
2514#endif /* ! OBJ_ABOUT */
2515#endif /* ! OBJ_COFF */
2516}
2517
2518symbolS *
2519tc_get_bal_of_call (symbolS *callP ATTRIBUTE_UNUSED)
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
2531  as_fatal ("Only supported for a.out, b.out, or COFF");
2532#endif /* ! OBJ_ABOUT */
2533#endif /* ! OBJ_COFF */
2534
2535  know (TC_S_IS_BALNAME (retval));
2536  return retval;
2537}
2538
2539#ifdef OBJ_COFF
2540void
2541tc_coff_symbol_emit_hook (symbolS *symbolP ATTRIBUTE_UNUSED)
2542{
2543  if (TC_S_IS_CALLNAME (symbolP))
2544    {
2545      symbolS *balP = tc_get_bal_of_call (symbolP);
2546
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));
2553      /* Fix up the bal symbol.  */
2554      S_SET_STORAGE_CLASS (balP, C_LABEL);
2555    }
2556}
2557#endif /* OBJ_COFF */
2558
2559void
2560i960_handle_align (fragS *fragp ATTRIBUTE_UNUSED)
2561{
2562  if (!linkrelax)
2563    return;
2564
2565#ifndef OBJ_BOUT
2566  as_bad (_("option --link-relax is only supported in b.out format"));
2567  linkrelax = 0;
2568  return;
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
2584i960_validate_fix (fixS *fixP, segT this_segment_type ATTRIBUTE_UNUSED)
2585{
2586  if (fixP->fx_tcbit && TC_S_IS_CALLNAME (fixP->fx_addsy))
2587    {
2588      /* Relocation should be done via the associated 'bal'
2589         entry point symbol.  */
2590      if (!TC_S_IS_BALNAME (tc_get_bal_of_call (fixP->fx_addsy)))
2591	{
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;
2596	}
2597      fixP->fx_addsy = tc_get_bal_of_call (fixP->fx_addsy);
2598    }
2599
2600  return 1;
2601}
2602
2603/* From cgen.c:  */
2604
2605static short
2606tc_bfd_fix2rtype (fixS *fixP)
2607{
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 *
2624tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
2625{
2626  arelent * reloc;
2627
2628  reloc = XNEW (arelent);
2629
2630  /* HACK: Is this right?  */
2631  fixP->fx_r_type = tc_bfd_fix2rtype (fixP);
2632
2633  reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
2634  if (reloc->howto == NULL)
2635    {
2636      as_bad_where (fixP->fx_file, fixP->fx_line,
2637		    _("internal error: can't export reloc type %d (`%s')"),
2638		    fixP->fx_r_type,
2639		    bfd_get_reloc_code_name (fixP->fx_r_type));
2640      return NULL;
2641    }
2642
2643  gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
2644
2645  reloc->sym_ptr_ptr = XNEW (asymbol *);
2646  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
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
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};
2668