1 /* tc-i960.c - All the i80960-specific stuff
2    Copyright (C) 1989-2016 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 
119 extern char *input_line_pointer;
120 
121 /* Local i80960 routines.  */
122 struct memS;
123 struct regop;
124 
125 /* See md_parse_option() for meanings of these options.  */
126 static char norelax;			/* True if -norelax switch seen.  */
127 static 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.  */
131 const 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 
143 const char line_comment_chars[]   = "#";
144 const char line_separator_chars[] = ";";
145 
146 /* Chars that can be used to separate mant from exp in floating point nums.  */
147 const char EXP_CHARS[] = "eE";
148 
149 /* Chars that mean this number is a floating point constant,
150    as in 0f12.456 or 0d1.2345e12.  */
151 const 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.  */
163 const 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.  */
219 typedef 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   }
229 memS;
230 
231 /* The two pieces of info we need to generate a register operand.  */
232 struct 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.  */
241 static const struct
242   {
243     const char *reg_name;
244     int reg_num;
245   }
246 regnames[] =
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.  */
336 static const struct
337 {
338   const char *areg_name;
339   int areg_num;
340 }
341 aregs[] =
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.  */
385 static struct hash_control *op_hash;	/* Opcode mnemonics.  */
386 static struct hash_control *reg_hash;	/* Register name hash table.  */
387 static 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
397 int architecture = ARCH_ANY;	/* Architecture requested on invocation line.  */
398 int 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.  */
439 static 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 
453 static void ctrl_fmt (const char *, long, int);
454 
455 
456 void
md_begin(void)457 md_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 
497 static void
parse_expr(const char * textP,expressionS * expP)498 parse_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 
538 static char *
emit(long instr)539 emit (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 
560 static void
get_cdisp(const char * dispP,const char * ifmtP,long instr,int numbits,int var_frag,int callj)561 get_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 
581     case O_symbol:
582       if (S_GET_SEGMENT (e.X_add_symbol) == now_seg
583 	  || S_GET_SEGMENT (e.X_add_symbol) == undefined_section)
584 	{
585 	  if (var_frag)
586 	    {
587 	      outP = frag_more (8);	/* Allocate worst-case storage.  */
588 	      md_number_to_chars (outP, instr, 4);
589 	      frag_variant (rs_machine_dependent, 4, 4, 1,
590 			    adds (e), offs (e), outP);
591 	    }
592 	  else
593 	    {
594 	      /* Set up a new fix structure, so address can be updated
595 	         when all symbol values are known.  */
596 	      outP = emit (instr);
597 	      fixP = fix_new (frag_now,
598 			      outP - frag_now->fr_literal,
599 			      4,
600 			      adds (e),
601 			      offs (e),
602 			      1,
603 			      NO_RELOC);
604 
605 	      fixP->fx_tcbit = callj;
606 
607 	      /* We want to modify a bit field when the address is
608 	         known.  But we don't need all the garbage in the
609 	         bit_fix structure.  So we're going to lie and store
610 	         the number of bits affected instead of a pointer.  */
611 	      fixP->fx_bit_fixP = (bit_fixS *) (size_t) numbits;
612 	    }
613 	}
614       else
615 	as_bad (_("attempt to branch into different segment"));
616       break;
617 
618     default:
619       as_bad (_("target of %s instruction must be a label"), ifmtP);
620       break;
621     }
622 }
623 
624 static int
md_chars_to_number(char * val,int n)625 md_chars_to_number (char * val,		/* Value in target byte order.  */
626 		    int n)		/* Number of bytes in the input.  */
627 {
628   int retval;
629 
630   for (retval = 0; n--;)
631     {
632       retval <<= 8;
633       retval |= (unsigned char) val[n];
634     }
635   return retval;
636 }
637 
638 /* mema_to_memb:	convert a MEMA-format opcode to a MEMB-format opcode.
639 
640    There are 2 possible MEMA formats:
641   	- displacement only
642   	- displacement + abase
643 
644    They are distinguished by the setting of the MEMA_ABASE bit.  */
645 
646 static void
mema_to_memb(char * opcodeP)647 mema_to_memb (char * opcodeP)	/* Where to find the opcode, in target byte order.  */
648 {
649   long opcode;			/* Opcode in host byte order.  */
650   long mode;			/* Mode bits for MEMB instruction.  */
651 
652   opcode = md_chars_to_number (opcodeP, 4);
653   know (!(opcode & MEMB_BIT));
654 
655   mode = MEMB_BIT | D_BIT;
656   if (opcode & MEMA_ABASE)
657     mode |= A_BIT;
658 
659   opcode &= 0xffffc000;		/* Clear MEMA offset and mode bits.  */
660   opcode |= mode;		/* Set MEMB mode bits.  */
661 
662   md_number_to_chars (opcodeP, opcode, 4);
663 }
664 
665 /* targ_has_sfr:
666 
667    Return TRUE iff the target architecture supports the specified
668    special-function register (sfr).  */
669 
670 static int
targ_has_sfr(int n)671 targ_has_sfr (int n)		/* Number (0-31) of sfr.  */
672 {
673   switch (architecture)
674     {
675     case ARCH_KA:
676     case ARCH_KB:
677     case ARCH_MC:
678     case ARCH_JX:
679       return 0;
680     case ARCH_HX:
681       return ((0 <= n) && (n <= 4));
682     case ARCH_CA:
683     default:
684       return ((0 <= n) && (n <= 2));
685     }
686 }
687 
688 /* Look up a (suspected) register name in the register table and return the
689    associated register number (or -1 if not found).  */
690 
691 static int
get_regnum(char * regname)692 get_regnum (char *regname)	/* Suspected register name.  */
693 {
694   int *rP;
695 
696   rP = (int *) hash_find (reg_hash, regname);
697   return (rP == NULL) ? -1 : *rP;
698 }
699 
700 /* syntax: Issue a syntax error.  */
701 
702 static void
syntax(void)703 syntax (void)
704 {
705   as_bad (_("syntax error"));
706 }
707 
708 /* parse_regop: parse a register operand.
709 
710    In case of illegal operand, issue a message and return some valid
711    information so instruction processing can continue.  */
712 
713 static void
parse_regop(struct regop * regopP,char * optext,char opdesc)714 parse_regop (struct regop *regopP,	/* Where to put description of register operand.  */
715 	     char *optext,		/* Text of operand.  */
716 	     char opdesc)      		/* Descriptor byte:  what's legal for this operand.  */
717 {
718   int n;			/* Register number.  */
719   expressionS e;		/* Parsed expression.  */
720 
721   /* See if operand is a register.  */
722   n = get_regnum (optext);
723   if (n >= 0)
724     {
725       if (IS_RG_REG (n))
726 	{
727 	  /* Global or local register.  */
728 	  if (!REG_ALIGN (opdesc, n))
729 	    as_bad (_("unaligned register"));
730 
731 	  regopP->n = n;
732 	  regopP->mode = 0;
733 	  regopP->special = 0;
734 	  return;
735 	}
736       else if (IS_FP_REG (n) && FP_OK (opdesc))
737 	{
738 	  /* Floating point register, and it's allowed.  */
739 	  regopP->n = n - FP0;
740 	  regopP->mode = 1;
741 	  regopP->special = 0;
742 	  return;
743 	}
744       else if (IS_SF_REG (n) && SFR_OK (opdesc))
745 	{
746 	  /* Special-function register, and it's allowed.  */
747 	  regopP->n = n - SF0;
748 	  regopP->mode = 0;
749 	  regopP->special = 1;
750 	  if (!targ_has_sfr (regopP->n))
751 	    as_bad (_("no such sfr in this architecture"));
752 
753 	  return;
754 	}
755     }
756   else if (LIT_OK (opdesc))
757     {
758       /* How about a literal?  */
759       regopP->mode = 1;
760       regopP->special = 0;
761       if (FP_OK (opdesc))
762 	{
763 	  /* Floating point literal acceptable.  */
764 	  /* Skip over 0f, 0d, or 0e prefix.  */
765 	  if ((optext[0] == '0')
766 	      && (optext[1] >= 'd')
767 	      && (optext[1] <= 'f'))
768 	    optext += 2;
769 
770 	  if (!strcmp (optext, "0.0") || !strcmp (optext, "0"))
771 	    {
772 	      regopP->n = 0x10;
773 	      return;
774 	    }
775 
776 	  if (!strcmp (optext, "1.0") || !strcmp (optext, "1"))
777 	    {
778 	      regopP->n = 0x16;
779 	      return;
780 	    }
781 	}
782       else
783 	{
784 	  /* Fixed point literal acceptable.  */
785 	  parse_expr (optext, &e);
786 	  if (e.X_op != O_constant
787 	      || (offs (e) < 0) || (offs (e) > 31))
788 	    {
789 	      as_bad (_("illegal literal"));
790 	      offs (e) = 0;
791 	    }
792 	  regopP->n = offs (e);
793 	  return;
794 	}
795     }
796 
797   /* Nothing worked.  */
798   syntax ();
799   regopP->mode = 0;		/* Register r0 is always a good one.  */
800   regopP->n = 0;
801   regopP->special = 0;
802 }
803 
804 /* get_ispec:	parse a memory operand for an index specification
805 
806    Here, an "index specification" is taken to be anything surrounded
807    by square brackets and NOT followed by anything else.
808 
809    If it's found, detach it from the input string, remove the surrounding
810    square brackets, and return a pointer to it.  Otherwise, return NULL.  */
811 
812 static char *
get_ispec(char * textP)813 get_ispec (char *textP)  /* Pointer to memory operand from source instruction, no white space.  */
814 
815 {
816   /* Points to start of index specification.  */
817   char *start;
818   /* Points to end of index specification.  */
819   char *end;
820 
821   /* Find opening square bracket, if any.  */
822   start = strchr (textP, '[');
823 
824   if (start != NULL)
825     {
826       /* Eliminate '[', detach from rest of operand.  */
827       *start++ = '\0';
828 
829       end = strchr (start, ']');
830 
831       if (end == NULL)
832 	as_bad (_("unmatched '['"));
833       else
834 	{
835 	  /* Eliminate ']' and make sure it was the last thing
836 	     in the string.  */
837 	  *end = '\0';
838 	  if (*(end + 1) != '\0')
839 	    as_bad (_("garbage after index spec ignored"));
840 	}
841     }
842   return start;
843 }
844 
845 /* parse_memop:	parse a memory operand
846 
847   	This routine is based on the observation that the 4 mode bits of the
848   	MEMB format, taken individually, have fairly consistent meaning:
849 
850   		 M3 (bit 13): 1 if displacement is present (D_BIT)
851   		 M2 (bit 12): 1 for MEMB instructions (MEMB_BIT)
852   		 M1 (bit 11): 1 if index is present (I_BIT)
853   		 M0 (bit 10): 1 if abase is present (A_BIT)
854 
855   	So we parse the memory operand and set bits in the mode as we find
856   	things.  Then at the end, if we go to MEMB format, we need only set
857   	the MEMB bit (M2) and our mode is built for us.
858 
859   	Unfortunately, I said "fairly consistent".  The exceptions:
860 
861   		 DBIA
862   		 0100	Would seem illegal, but means "abase-only".
863 
864   		 0101	Would seem to mean "abase-only" -- it means IP-relative.
865   			Must be converted to 0100.
866 
867   		 0110	Would seem to mean "index-only", but is reserved.
868   			We turn on the D bit and provide a 0 displacement.
869 
870   	The other thing to observe is that we parse from the right, peeling
871   	things * off as we go:  first any index spec, then any abase, then
872   	the displacement.  */
873 
874 static void
parse_memop(memS * memP,char * argP,int optype)875 parse_memop (memS *memP,	/* Where to put the results.  */
876 	     char *argP,	/* Text of the operand to be parsed.  */
877 	     int optype)	/* MEM1, MEM2, MEM4, MEM8, MEM12, or MEM16.  */
878 {
879   char *indexP;			/* Pointer to index specification with "[]" removed.  */
880   char *p;			/* Temp char pointer.  */
881   char iprel_flag;		/* True if this is an IP-relative operand.  */
882   int regnum;			/* Register number.  */
883   /* Scale factor: 1,2,4,8, or 16.  Later converted to internal format
884      (0,1,2,3,4 respectively).  */
885   int scale;
886   int mode;			/* MEMB mode bits.  */
887   int *intP;			/* Pointer to register number.  */
888 
889   /* The following table contains the default scale factors for each
890      type of memory instruction.  It is accessed using (optype-MEM1)
891      as an index -- thus it assumes the 'optype' constants are
892      assigned consecutive values, in the order they appear in this
893      table.  */
894   static const int def_scale[] =
895   {
896     1,				/* MEM1 */
897     2,				/* MEM2 */
898     4,				/* MEM4 */
899     8,				/* MEM8 */
900     -1,				/* MEM12 -- no valid default */
901     16				/* MEM16 */
902   };
903 
904   iprel_flag = mode = 0;
905 
906   /* Any index present? */
907   indexP = get_ispec (argP);
908   if (indexP)
909     {
910       p = strchr (indexP, '*');
911       if (p == NULL)
912 	{
913 	  /* No explicit scale -- use default for this instruction
914 	     type and assembler mode.  */
915 	  if (flag_mri)
916 	    scale = 1;
917 	  else
918 	    /* GNU960 compatibility */
919 	    scale = def_scale[optype - MEM1];
920 	}
921       else
922 	{
923 	  *p++ = '\0';		/* Eliminate '*' */
924 
925 	  /* Now indexP->a '\0'-terminated register name,
926 	     and p->a scale factor.  */
927 
928 	  if (!strcmp (p, "16"))
929 	    scale = 16;
930 	  else if (strchr ("1248", *p) && (p[1] == '\0'))
931 	    scale = *p - '0';
932 	  else
933 	    scale = -1;
934 	}
935 
936       regnum = get_regnum (indexP);	/* Get index reg. # */
937       if (!IS_RG_REG (regnum))
938 	{
939 	  as_bad (_("invalid index register"));
940 	  return;
941 	}
942 
943       /* Convert scale to its binary encoding.  */
944       switch (scale)
945 	{
946 	case 1:
947 	  scale = 0 << 7;
948 	  break;
949 	case 2:
950 	  scale = 1 << 7;
951 	  break;
952 	case 4:
953 	  scale = 2 << 7;
954 	  break;
955 	case 8:
956 	  scale = 3 << 7;
957 	  break;
958 	case 16:
959 	  scale = 4 << 7;
960 	  break;
961 	default:
962 	  as_bad (_("invalid scale factor"));
963 	  return;
964 	};
965 
966       memP->opcode |= scale | regnum;	/* Set index bits in opcode.  */
967       mode |= I_BIT;			/* Found a valid index spec.  */
968     }
969 
970   /* Any abase (Register Indirect) specification present?  */
971   if ((p = strrchr (argP, '(')) != NULL)
972     {
973       /* "(" is there -- does it start a legal abase spec?  If not, it
974          could be part of a displacement expression.  */
975       intP = (int *) hash_find (areg_hash, p);
976       if (intP != NULL)
977 	{
978 	  /* Got an abase here.  */
979 	  regnum = *intP;
980 	  *p = '\0';		/* Discard register spec.  */
981 	  if (regnum == IPREL)
982 	    /* We have to specialcase ip-rel mode.  */
983 	    iprel_flag = 1;
984 	  else
985 	    {
986 	      memP->opcode |= regnum << 14;
987 	      mode |= A_BIT;
988 	    }
989 	}
990     }
991 
992   /* Any expression present?  */
993   memP->e = argP;
994   if (*argP != '\0')
995     mode |= D_BIT;
996 
997   /* Special-case ip-relative addressing.  */
998   if (iprel_flag)
999     {
1000       if (mode & I_BIT)
1001 	syntax ();
1002       else
1003 	{
1004 	  memP->opcode |= 5 << 10;	/* IP-relative mode.  */
1005 	  memP->disp = 32;
1006 	}
1007       return;
1008     }
1009 
1010   /* Handle all other modes.  */
1011   switch (mode)
1012     {
1013     case D_BIT | A_BIT:
1014       /* Go with MEMA instruction format for now (grow to MEMB later
1015          if 12 bits is not enough for the displacement).  MEMA format
1016          has a single mode bit: set it to indicate that abase is
1017          present.  */
1018       memP->opcode |= MEMA_ABASE;
1019       memP->disp = 12;
1020       break;
1021 
1022     case D_BIT:
1023       /* Go with MEMA instruction format for now (grow to MEMB later
1024          if 12 bits is not enough for the displacement).  */
1025       memP->disp = 12;
1026       break;
1027 
1028     case A_BIT:
1029       /* For some reason, the bit string for this mode is not
1030          consistent: it should be 0 (exclusive of the MEMB bit), so we
1031          set it "by hand" here.  */
1032       memP->opcode |= MEMB_BIT;
1033       break;
1034 
1035     case A_BIT | I_BIT:
1036       /* set MEMB bit in mode, and OR in mode bits.  */
1037       memP->opcode |= mode | MEMB_BIT;
1038       break;
1039 
1040     case I_BIT:
1041       /* Treat missing displacement as displacement of 0.  */
1042       mode |= D_BIT;
1043       /* Fall into next case.  */
1044     case D_BIT | A_BIT | I_BIT:
1045     case D_BIT | I_BIT:
1046       /* Set MEMB bit in mode, and OR in mode bits.  */
1047       memP->opcode |= mode | MEMB_BIT;
1048       memP->disp = 32;
1049       break;
1050 
1051     default:
1052       syntax ();
1053       break;
1054     }
1055 }
1056 
1057 /* Generate a MEMA- or MEMB-format instruction.  */
1058 
1059 static void
mem_fmt(char * args[],struct i960_opcode * oP,int callx)1060 mem_fmt (char *args[],		/* args[0]->opcode mnemonic, args[1-3]->operands.  */
1061 	 struct i960_opcode *oP,/* Pointer to description of instruction.  */
1062 	 int callx)		/* Is this a callx opcode.  */
1063 {
1064   int i;			/* Loop counter.  */
1065   struct regop regop;		/* Description of register operand.  */
1066   char opdesc;			/* Operand descriptor byte.  */
1067   memS instr;			/* Description of binary to be output.  */
1068   char *outP;			/* Where the binary was output to.  */
1069   expressionS exp;		/* Parsed expression.  */
1070   /* ->description of deferred address fixup.  */
1071   fixS *fixP;
1072 
1073 #ifdef OBJ_COFF
1074   /* COFF support isn't in place yet for callx relaxing.  */
1075   callx = 0;
1076 #endif
1077 
1078   memset (&instr, '\0', sizeof (memS));
1079   instr.opcode = oP->opcode;
1080 
1081   /* Process operands.  */
1082   for (i = 1; i <= oP->num_ops; i++)
1083     {
1084       opdesc = oP->operand[i - 1];
1085 
1086       if (MEMOP (opdesc))
1087 	parse_memop (&instr, args[i], oP->format);
1088       else
1089 	{
1090 	  parse_regop (&regop, args[i], opdesc);
1091 	  instr.opcode |= regop.n << 19;
1092 	}
1093     }
1094 
1095   /* Parse the displacement; this must be done before emitting the
1096      opcode, in case it is an expression using `.'.  */
1097   parse_expr (instr.e, &exp);
1098 
1099   /* Output opcode.  */
1100   outP = emit (instr.opcode);
1101 
1102   if (instr.disp == 0)
1103     return;
1104 
1105   /* Process the displacement.  */
1106   switch (exp.X_op)
1107     {
1108     case O_illegal:
1109       as_bad (_("expression syntax error"));
1110       break;
1111 
1112     case O_constant:
1113       if (instr.disp == 32)
1114 	(void) emit (offs (exp));	/* Output displacement.  */
1115       else
1116 	{
1117 	  /* 12-bit displacement.  */
1118 	  if (offs (exp) & ~0xfff)
1119 	    {
1120 	      /* Won't fit in 12 bits: convert already-output
1121 	         instruction to MEMB format, output
1122 	         displacement.  */
1123 	      mema_to_memb (outP);
1124 	      (void) emit (offs (exp));
1125 	    }
1126 	  else
1127 	    {
1128 	      /* WILL fit in 12 bits:  OR into opcode and
1129 	         overwrite the binary we already put out.  */
1130 	      instr.opcode |= offs (exp);
1131 	      md_number_to_chars (outP, instr.opcode, 4);
1132 	    }
1133 	}
1134       break;
1135 
1136     default:
1137       if (instr.disp == 12)
1138 	/* Displacement is dependent on a symbol, whose value
1139 	   may change at link time.  We HAVE to reserve 32 bits.
1140 	   Convert already-output opcode to MEMB format.  */
1141 	mema_to_memb (outP);
1142 
1143       /* Output 0 displacement and set up address fixup for when
1144          this symbol's value becomes known.  */
1145       outP = emit ((long) 0);
1146       fixP = fix_new_exp (frag_now,
1147 			  outP - frag_now->fr_literal,
1148 			  4, &exp, 0, NO_RELOC);
1149       /* Steve's linker relaxing hack.  Mark this 32-bit relocation as
1150          being in the instruction stream, specifically as part of a callx
1151          instruction.  */
1152       fixP->fx_bsr = callx;
1153       break;
1154     }
1155 }
1156 
1157 /* targ_has_iclass:
1158 
1159    Return TRUE iff the target architecture supports the indicated
1160    class of instructions.  */
1161 
1162 static int
targ_has_iclass(int ic)1163 targ_has_iclass (int ic) /* Instruction class;  one of:
1164 			    I_BASE, I_CX, I_DEC, I_KX, I_FP, I_MIL, I_CASIM, I_CX2, I_HX, I_HX2.  */
1165 {
1166   iclasses_seen |= ic;
1167 
1168   switch (architecture)
1169     {
1170     case ARCH_KA:
1171       return ic & (I_BASE | I_KX);
1172     case ARCH_KB:
1173       return ic & (I_BASE | I_KX | I_FP | I_DEC);
1174     case ARCH_MC:
1175       return ic & (I_BASE | I_KX | I_FP | I_DEC | I_MIL);
1176     case ARCH_CA:
1177       return ic & (I_BASE | I_CX | I_CX2 | I_CASIM);
1178     case ARCH_JX:
1179       return ic & (I_BASE | I_CX2 | I_JX);
1180     case ARCH_HX:
1181       return ic & (I_BASE | I_CX2 | I_JX | I_HX);
1182     default:
1183       if ((iclasses_seen & (I_KX | I_FP | I_DEC | I_MIL))
1184 	  && (iclasses_seen & (I_CX | I_CX2)))
1185 	{
1186 	  as_warn (_("architecture of opcode conflicts with that of earlier instruction(s)"));
1187 	  iclasses_seen &= ~ic;
1188 	}
1189       return 1;
1190     }
1191 }
1192 
1193 /* shift_ok:
1194    Determine if a "shlo" instruction can be used to implement a "ldconst".
1195    This means that some number X < 32 can be shifted left to produce the
1196    constant of interest.
1197 
1198    Return the shift count, or 0 if we can't do it.
1199    Caller calculates X by shifting original constant right 'shift' places.  */
1200 
1201 static int
shift_ok(int n)1202 shift_ok (int n)		/* The constant of interest.  */
1203 {
1204   int shift;			/* The shift count.  */
1205 
1206   if (n <= 0)
1207     /* Can't do it for negative numbers.  */
1208     return 0;
1209 
1210   /* Shift 'n' right until a 1 is about to be lost.  */
1211   for (shift = 0; (n & 1) == 0; shift++)
1212     n >>= 1;
1213 
1214   if (n >= 32)
1215     return 0;
1216 
1217   return shift;
1218 }
1219 
1220 /* parse_ldcont:
1221    Parse and replace a 'ldconst' pseudo-instruction with an appropriate
1222    i80960 instruction.
1223 
1224    Assumes the input consists of:
1225   		arg[0]	opcode mnemonic ('ldconst')
1226   		arg[1]  first operand (constant)
1227   		arg[2]	name of register to be loaded
1228 
1229    Replaces opcode and/or operands as appropriate.
1230 
1231    Returns the new number of arguments, or -1 on failure.  */
1232 
1233 static int
parse_ldconst(char * arg[])1234 parse_ldconst (char *arg[])	/* See above.  */
1235 {
1236   int n;			/* Constant to be loaded.  */
1237   int shift;			/* Shift count for "shlo" instruction.  */
1238   static char buf[5];		/* Literal for first operand.  */
1239   static char buf2[5];		/* Literal for second operand.  */
1240   expressionS e;		/* Parsed expression.  */
1241 
1242   arg[3] = NULL;		/* So we can tell at the end if it got used or not.  */
1243 
1244   parse_expr (arg[1], &e);
1245   switch (e.X_op)
1246     {
1247     default:
1248       /* We're dependent on one or more symbols -- use "lda".  */
1249       arg[0] = (char *) "lda";
1250       break;
1251 
1252     case O_constant:
1253       /* Try the following mappings:
1254               ldconst   0,<reg>  -> mov  0,<reg>
1255               ldconst  31,<reg>  -> mov  31,<reg>
1256               ldconst  32,<reg>  -> addo 1,31,<reg>
1257               ldconst  62,<reg>  -> addo 31,31,<reg>
1258               ldconst  64,<reg>  -> shlo 8,3,<reg>
1259               ldconst  -1,<reg>  -> subo 1,0,<reg>
1260               ldconst -31,<reg>  -> subo 31,0,<reg>
1261 
1262          Anything else becomes:
1263                 lda xxx,<reg>.  */
1264       n = offs (e);
1265       if ((0 <= n) && (n <= 31))
1266 	arg[0] = (char *) "mov";
1267       else if ((-31 <= n) && (n <= -1))
1268 	{
1269 	  arg[0] = (char *) "subo";
1270 	  arg[3] = arg[2];
1271 	  sprintf (buf, "%d", -n);
1272 	  arg[1] = buf;
1273 	  arg[2] = (char *) "0";
1274 	}
1275       else if ((32 <= n) && (n <= 62))
1276 	{
1277 	  arg[0] = (char *) "addo";
1278 	  arg[3] = arg[2];
1279 	  arg[1] = (char *) "31";
1280 	  sprintf (buf, "%d", n - 31);
1281 	  arg[2] = buf;
1282 	}
1283       else if ((shift = shift_ok (n)) != 0)
1284 	{
1285 	  arg[0] = (char *) "shlo";
1286 	  arg[3] = arg[2];
1287 	  sprintf (buf, "%d", shift);
1288 	  arg[1] = buf;
1289 	  sprintf (buf2, "%d", n >> shift);
1290 	  arg[2] = buf2;
1291 	}
1292       else
1293 	arg[0] = (char *) "lda";
1294       break;
1295 
1296     case O_illegal:
1297       as_bad (_("invalid constant"));
1298       return -1;
1299       break;
1300     }
1301   return (arg[3] == 0) ? 2 : 3;
1302 }
1303 
1304 /* reg_fmt:	generate a REG-format instruction.  */
1305 
1306 static void
reg_fmt(char * args[],struct i960_opcode * oP)1307 reg_fmt (char *args[],		/* args[0]->opcode mnemonic, args[1-3]->operands.  */
1308 	 struct i960_opcode *oP)/* Pointer to description of instruction.  */
1309 {
1310   long instr;			/* Binary to be output.  */
1311   struct regop regop;		/* Description of register operand.  */
1312   int n_ops;			/* Number of operands.  */
1313 
1314   instr = oP->opcode;
1315   n_ops = oP->num_ops;
1316 
1317   if (n_ops >= 1)
1318     {
1319       parse_regop (&regop, args[1], oP->operand[0]);
1320 
1321       if ((n_ops == 1) && !(instr & M3))
1322 	{
1323 	  /* 1-operand instruction in which the dst field should
1324 	     be used (instead of src1).  */
1325 	  regop.n <<= 19;
1326 	  if (regop.special)
1327 	    regop.mode = regop.special;
1328 	  regop.mode <<= 13;
1329 	  regop.special = 0;
1330 	}
1331       else
1332 	{
1333 	  /* regop.n goes in bit 0, needs no shifting.  */
1334 	  regop.mode <<= 11;
1335 	  regop.special <<= 5;
1336 	}
1337       instr |= regop.n | regop.mode | regop.special;
1338     }
1339 
1340   if (n_ops >= 2)
1341     {
1342       parse_regop (&regop, args[2], oP->operand[1]);
1343 
1344       if ((n_ops == 2) && !(instr & M3))
1345 	{
1346 	  /* 2-operand instruction in which the dst field should
1347 	     be used instead of src2).  */
1348 	  regop.n <<= 19;
1349 	  if (regop.special)
1350 	    regop.mode = regop.special;
1351 	  regop.mode <<= 13;
1352 	  regop.special = 0;
1353 	}
1354       else
1355 	{
1356 	  regop.n <<= 14;
1357 	  regop.mode <<= 12;
1358 	  regop.special <<= 6;
1359 	}
1360       instr |= regop.n | regop.mode | regop.special;
1361     }
1362   if (n_ops == 3)
1363     {
1364       parse_regop (&regop, args[3], oP->operand[2]);
1365       if (regop.special)
1366 	regop.mode = regop.special;
1367       instr |= (regop.n <<= 19) | (regop.mode <<= 13);
1368     }
1369   emit (instr);
1370 }
1371 
1372 /* get_args:	break individual arguments out of comma-separated list
1373 
1374    Input assumptions:
1375   	- all comments and labels have been removed
1376   	- all strings of whitespace have been collapsed to a single blank.
1377   	- all character constants ('x') have been replaced with decimal
1378 
1379    Output:
1380   	args[0] is untouched. args[1] points to first operand, etc. All args:
1381   	- are NULL-terminated
1382   	- contain no whitespace
1383 
1384    Return value:
1385    Number of operands (0,1,2, or 3) or -1 on error.  */
1386 
1387 static int
get_args(char * p,char * args[])1388 get_args (char *p, 	/* Pointer to comma-separated operands; Mucked by us.  */
1389 	  char *args[]) /* Output arg: pointers to operands placed in args[1-3].
1390 			   Must accommodate 4 entries (args[0-3]).  */
1391 
1392 {
1393   int n;		/* Number of operands.  */
1394   char *to;
1395 
1396   /* Skip lead white space.  */
1397   while (*p == ' ')
1398     p++;
1399 
1400   if (*p == '\0')
1401     return 0;
1402 
1403   n = 1;
1404   args[1] = p;
1405 
1406   /* Squeze blanks out by moving non-blanks toward start of string.
1407      Isolate operands, whenever comma is found.  */
1408   to = p;
1409   while (*p != '\0')
1410     {
1411       if (*p == ' '
1412 	  && (! ISALNUM (p[1])
1413 	      || ! ISALNUM (p[-1])))
1414 	p++;
1415       else if (*p == ',')
1416 	{
1417 	  /* Start of operand.  */
1418 	  if (n == 3)
1419 	    {
1420 	      as_bad (_("too many operands"));
1421 	      return -1;
1422 	    }
1423 	  *to++ = '\0';		/* Terminate argument.  */
1424 	  args[++n] = to;	/* Start next argument.  */
1425 	  p++;
1426 	}
1427       else
1428 	*to++ = *p++;
1429     }
1430   *to = '\0';
1431   return n;
1432 }
1433 
1434 /* i_scan:	perform lexical scan of ascii assembler instruction.
1435 
1436    Input assumptions:
1437   	- input string is an i80960 instruction (not a pseudo-op)
1438   	- all comments and labels have been removed
1439   	- all strings of whitespace have been collapsed to a single blank.
1440 
1441    Output:
1442   	args[0] points to opcode, other entries point to operands. All strings:
1443   	- are NULL-terminated
1444   	- contain no whitespace
1445   	- have character constants ('x') replaced with a decimal number
1446 
1447    Return value:
1448      Number of operands (0,1,2, or 3) or -1 on error.  */
1449 
1450 static int
i_scan(char * iP,char * args[])1451 i_scan (char *iP,     /* Pointer to ascii instruction;  Mucked by us.  */
1452 	char *args[]) /* Output arg: pointers to opcode and operands placed here.
1453 			 Must accommodate 4 entries.  */
1454 {
1455   /* Isolate opcode.  */
1456   if (*(iP) == ' ')
1457     iP++;
1458 
1459   args[0] = iP;
1460   for (; *iP != ' '; iP++)
1461     {
1462       if (*iP == '\0')
1463 	{
1464 	  /* There are no operands.  */
1465 	  if (args[0] == iP)
1466 	    {
1467 	      /* We never moved: there was no opcode either!  */
1468 	      as_bad (_("missing opcode"));
1469 	      return -1;
1470 	    }
1471 	  return 0;
1472 	}
1473     }
1474   *iP++ = '\0';
1475   return (get_args (iP, args));
1476 }
1477 
1478 static void
brcnt_emit(void)1479 brcnt_emit (void)
1480 {
1481   /* Emit call to "increment" routine.  */
1482   ctrl_fmt (BR_CNT_FUNC, CALL, 1);
1483   /* Emit inline counter to be incremented.  */
1484   emit (0);
1485 }
1486 
1487 static char *
brlab_next(void)1488 brlab_next (void)
1489 {
1490   static char buf[20];
1491 
1492   sprintf (buf, "%s%d", BR_LABEL_BASE, br_cnt++);
1493   return buf;
1494 }
1495 
1496 static void
ctrl_fmt(const char * targP,long opcode,int num_ops)1497 ctrl_fmt (const char *targP,		/* Pointer to text of lone operand (if any).  */
1498 	  long opcode,		/* Template of instruction.  */
1499 	  int num_ops)		/* Number of operands.  */
1500 {
1501   int instrument;		/* TRUE iff we should add instrumentation to track
1502 				   how often the branch is taken.  */
1503 
1504   if (num_ops == 0)
1505     emit (opcode);		/* Output opcode.  */
1506   else
1507     {
1508       instrument = instrument_branches && (opcode != CALL)
1509 	&& (opcode != B) && (opcode != RET) && (opcode != BAL);
1510 
1511       if (instrument)
1512 	{
1513 	  brcnt_emit ();
1514 	  colon (brlab_next ());
1515 	}
1516 
1517       /* The operand MUST be an ip-relative displacement. Parse it
1518          and set up address fix for the instruction we just output.  */
1519       get_cdisp (targP, "CTRL", opcode, 24, 0, 0);
1520 
1521       if (instrument)
1522 	brcnt_emit ();
1523     }
1524 }
1525 
1526 static void
cobr_fmt(char * arg[],long opcode,struct i960_opcode * oP)1527 cobr_fmt (/* arg[0]->opcode mnemonic, arg[1-3]->operands (ascii) */
1528 	  char *arg[],
1529 	  /* Opcode, with branch-prediction bits already set if necessary.  */
1530 	  long opcode,
1531 	  /* Pointer to description of instruction.  */
1532 	  struct i960_opcode *oP)
1533 {
1534   long instr;			/* 32-bit instruction.  */
1535   struct regop regop;		/* Description of register operand.  */
1536   int n;			/* Number of operands.  */
1537   int var_frag;			/* 1 if varying length code fragment should
1538 				     be emitted;  0 if an address fix
1539 				        should be emitted.  */
1540 
1541   instr = opcode;
1542   n = oP->num_ops;
1543 
1544   if (n >= 1)
1545     {
1546       /* First operand (if any) of a COBR is always a register
1547 	 operand.  Parse it.  */
1548       parse_regop (&regop, arg[1], oP->operand[0]);
1549       instr |= (regop.n << 19) | (regop.mode << 13);
1550     }
1551 
1552   if (n >= 2)
1553     {
1554       /* Second operand (if any) of a COBR is always a register
1555 	 operand.  Parse it.  */
1556       parse_regop (&regop, arg[2], oP->operand[1]);
1557       instr |= (regop.n << 14) | regop.special;
1558     }
1559 
1560   if (n < 3)
1561     emit (instr);
1562   else
1563     {
1564       if (instrument_branches)
1565 	{
1566 	  brcnt_emit ();
1567 	  colon (brlab_next ());
1568 	}
1569 
1570       /* A third operand to a COBR is always a displacement.  Parse
1571          it; if it's relaxable (a cobr "j" directive, or any cobr
1572          other than bbs/bbc when the "-norelax" option is not in use)
1573          set up a variable code fragment; otherwise set up an address
1574          fix.  */
1575       var_frag = !norelax || (oP->format == COJ);	/* TRUE or FALSE */
1576       get_cdisp (arg[3], "COBR", instr, 13, var_frag, 0);
1577 
1578       if (instrument_branches)
1579 	brcnt_emit ();
1580     }
1581 }
1582 
1583 /* Assumptions about the passed-in text:
1584   	- all comments, labels removed
1585   	- text is an instruction
1586   	- all white space compressed to single blanks
1587   	- all character constants have been replaced with decimal.  */
1588 
1589 void
md_assemble(char * textP)1590 md_assemble (char *textP)
1591 {
1592   /* Parsed instruction text, containing NO whitespace: arg[0]->opcode
1593      mnemonic arg[1-3]->operands, with char constants replaced by
1594      decimal numbers.  */
1595   char *args[4];
1596   /* Number of instruction operands.  */
1597   int n_ops;
1598   /* Pointer to instruction description.  */
1599   struct i960_opcode *oP;
1600   /* TRUE iff opcode mnemonic included branch-prediction suffix (".f"
1601      or ".t").  */
1602   int branch_predict;
1603   /* Setting of branch-prediction bit(s) to be OR'd into instruction
1604      opcode of CTRL/COBR format instructions.  */
1605   long bp_bits;
1606   /* Offset of last character in opcode mnemonic.  */
1607   int n;
1608   const char *bp_error_msg = _("branch prediction invalid on this opcode");
1609 
1610   /* Parse instruction into opcode and operands.  */
1611   memset (args, '\0', sizeof (args));
1612 
1613   n_ops = i_scan (textP, args);
1614 
1615   if (n_ops == -1)
1616     return;			/* Error message already issued.  */
1617 
1618   /* Do "macro substitution" (sort of) on 'ldconst' pseudo-instruction.  */
1619   if (!strcmp (args[0], "ldconst"))
1620     {
1621       n_ops = parse_ldconst (args);
1622       if (n_ops == -1)
1623 	return;
1624     }
1625 
1626   /* Check for branch-prediction suffix on opcode mnemonic, strip it off.  */
1627   n = strlen (args[0]) - 1;
1628   branch_predict = 0;
1629   bp_bits = 0;
1630 
1631   if (args[0][n - 1] == '.' && (args[0][n] == 't' || args[0][n] == 'f'))
1632     {
1633       /* We could check here to see if the target architecture
1634 	 supports branch prediction, but why bother?  The bit will
1635 	 just be ignored by processors that don't use it.  */
1636       branch_predict = 1;
1637       bp_bits = (args[0][n] == 't') ? BP_TAKEN : BP_NOT_TAKEN;
1638       args[0][n - 1] = '\0';	/* Strip suffix from opcode mnemonic */
1639     }
1640 
1641   /* Look up opcode mnemonic in table and check number of operands.
1642      Check that opcode is legal for the target architecture.  If all
1643      looks good, assemble instruction.  */
1644   oP = (struct i960_opcode *) hash_find (op_hash, args[0]);
1645   if (!oP || !targ_has_iclass (oP->iclass))
1646     as_bad (_("invalid opcode, \"%s\"."), args[0]);
1647   else if (n_ops != oP->num_ops)
1648     as_bad (_("improper number of operands.  expecting %d, got %d"),
1649 	    oP->num_ops, n_ops);
1650   else
1651     {
1652       switch (oP->format)
1653 	{
1654 	case FBRA:
1655 	case CTRL:
1656 	  ctrl_fmt (args[1], oP->opcode | bp_bits, oP->num_ops);
1657 	  if (oP->format == FBRA)
1658 	    /* Now generate a 'bno' to same arg */
1659 	    ctrl_fmt (args[1], BNO | bp_bits, 1);
1660 	  break;
1661 	case COBR:
1662 	case COJ:
1663 	  cobr_fmt (args, oP->opcode | bp_bits, oP);
1664 	  break;
1665 	case REG:
1666 	  if (branch_predict)
1667 	    as_warn ("%s", bp_error_msg);
1668 	  reg_fmt (args, oP);
1669 	  break;
1670 	case MEM1:
1671 	  if (args[0][0] == 'c' && args[0][1] == 'a')
1672 	    {
1673 	      if (branch_predict)
1674 		as_warn ("%s", bp_error_msg);
1675 	      mem_fmt (args, oP, 1);
1676 	      break;
1677 	    }
1678 	case MEM2:
1679 	case MEM4:
1680 	case MEM8:
1681 	case MEM12:
1682 	case MEM16:
1683 	  if (branch_predict)
1684 	    as_warn ("%s", bp_error_msg);
1685 	  mem_fmt (args, oP, 0);
1686 	  break;
1687 	case CALLJ:
1688 	  if (branch_predict)
1689 	    as_warn ("%s", bp_error_msg);
1690 	  /* Output opcode & set up "fixup" (relocation); flag
1691 	     relocation as 'callj' type.  */
1692 	  know (oP->num_ops == 1);
1693 	  get_cdisp (args[1], "CTRL", oP->opcode, 24, 0, 1);
1694 	  break;
1695 	default:
1696 	  BAD_CASE (oP->format);
1697 	  break;
1698 	}
1699     }
1700 }
1701 
1702 void
md_number_to_chars(char * buf,valueT value,int n)1703 md_number_to_chars (char *buf,
1704 		    valueT value,
1705 		    int n)
1706 {
1707   number_to_chars_littleendian (buf, value, n);
1708 }
1709 
1710 const char *
md_atof(int type,char * litP,int * sizeP)1711 md_atof (int type, char *litP, int *sizeP)
1712 {
1713   return ieee_md_atof (type, litP, sizeP, FALSE);
1714 }
1715 
1716 static void
md_number_to_imm(char * buf,long val,int n)1717 md_number_to_imm (char *buf, long val, int n)
1718 {
1719   md_number_to_chars (buf, val, n);
1720 }
1721 
1722 static void
md_number_to_field(char * instrP,long val,bit_fixS * bfixP)1723 md_number_to_field (char *instrP,		/* Pointer to instruction to be fixed.  */
1724 		    long val,			/* Address fixup value.  */
1725 		    bit_fixS *bfixP)		/* Description of bit field to be fixed up.  */
1726 {
1727   int numbits;			/* Length of bit field to be fixed.  */
1728   long instr;			/* 32-bit instruction to be fixed-up.  */
1729   long sign;			/* 0 or -1, according to sign bit of 'val'.  */
1730 
1731   /* Convert instruction back to host byte order.  */
1732   instr = md_chars_to_number (instrP, 4);
1733 
1734   /* Surprise! -- we stored the number of bits to be modified rather
1735      than a pointer to a structure.  */
1736   numbits = (int) (size_t) bfixP;
1737   if (numbits == 1)
1738     /* This is a no-op, stuck here by reloc_callj().  */
1739     return;
1740 
1741   know ((numbits == 13) || (numbits == 24));
1742 
1743   /* Propagate sign bit of 'val' for the given number of bits.  Result
1744      should be all 0 or all 1.  */
1745   sign = val >> ((int) numbits - 1);
1746   if (((val < 0) && (sign != -1))
1747       || ((val > 0) && (sign != 0)))
1748     as_bad (_("Fixup of %ld too large for field width of %d"),
1749 	    val, numbits);
1750   else
1751     {
1752       /* Put bit field into instruction and write back in target
1753          * byte order.  */
1754       val &= ~(-(1 << (int) numbits));	/* Clear unused sign bits.  */
1755       instr |= val;
1756       md_number_to_chars (instrP, instr, 4);
1757     }
1758 }
1759 
1760 
1761 /* md_parse_option
1762   	Invocation line includes a switch not recognized by the base assembler.
1763   	See if it's a processor-specific option.  For the 960, these are:
1764 
1765   	-norelax:
1766   		Conditional branch instructions that require displacements
1767   		greater than 13 bits (or that have external targets) should
1768   		generate errors.  The default is to replace each such
1769   		instruction with the corresponding compare (or chkbit) and
1770   		branch instructions.  Note that the Intel "j" cobr directives
1771   		are ALWAYS "de-optimized" in this way when necessary,
1772   		regardless of the setting of this option.
1773 
1774   	-b:
1775   		Add code to collect information about branches taken, for
1776   		later optimization of branch prediction bits by a separate
1777   		tool.  COBR and CNTL format instructions have branch
1778   		prediction bits (in the CX architecture);  if "BR" represents
1779   		an instruction in one of these classes, the following rep-
1780   		resents the code generated by the assembler:
1781 
1782   			call	<increment routine>
1783   			.word	0	# pre-counter
1784   		Label:  BR
1785   			call	<increment routine>
1786   			.word	0	# post-counter
1787 
1788   		A table of all such "Labels" is also generated.
1789 
1790   	-AKA, -AKB, -AKC, -ASA, -ASB, -AMC, -ACA:
1791   		Select the 80960 architecture.  Instructions or features not
1792   		supported by the selected architecture cause fatal errors.
1793   		The default is to generate code for any instruction or feature
1794   		that is supported by SOME version of the 960 (even if this
1795   		means mixing architectures!).  */
1796 
1797 const char *md_shortopts = "A:b";
1798 struct option md_longopts[] =
1799 {
1800 #define OPTION_LINKRELAX (OPTION_MD_BASE)
1801   {"linkrelax", no_argument, NULL, OPTION_LINKRELAX},
1802   {"link-relax", no_argument, NULL, OPTION_LINKRELAX},
1803 #define OPTION_NORELAX (OPTION_MD_BASE + 1)
1804   {"norelax", no_argument, NULL, OPTION_NORELAX},
1805   {"no-relax", no_argument, NULL, OPTION_NORELAX},
1806   {NULL, no_argument, NULL, 0}
1807 };
1808 size_t md_longopts_size = sizeof (md_longopts);
1809 
1810 struct tabentry
1811 {
1812   const char *flag;
1813   int arch;
1814 };
1815 static const struct tabentry arch_tab[] =
1816 {
1817   {"KA", ARCH_KA},
1818   {"KB", ARCH_KB},
1819   {"SA", ARCH_KA},		/* Synonym for KA.  */
1820   {"SB", ARCH_KB},		/* Synonym for KB.  */
1821   {"KC", ARCH_MC},		/* Synonym for MC.  */
1822   {"MC", ARCH_MC},
1823   {"CA", ARCH_CA},
1824   {"JX", ARCH_JX},
1825   {"HX", ARCH_HX},
1826   {NULL, 0}
1827 };
1828 
1829 int
md_parse_option(int c,const char * arg)1830 md_parse_option (int c, const char *arg)
1831 {
1832   switch (c)
1833     {
1834     case OPTION_LINKRELAX:
1835       linkrelax = 1;
1836       flag_keep_locals = 1;
1837       break;
1838 
1839     case OPTION_NORELAX:
1840       norelax = 1;
1841       break;
1842 
1843     case 'b':
1844       instrument_branches = 1;
1845       break;
1846 
1847     case 'A':
1848       {
1849 	const struct tabentry *tp;
1850 	const char *p = arg;
1851 
1852 	for (tp = arch_tab; tp->flag != NULL; tp++)
1853 	  if (!strcmp (p, tp->flag))
1854 	    break;
1855 
1856 	if (tp->flag == NULL)
1857 	  {
1858 	    as_bad (_("invalid architecture %s"), p);
1859 	    return 0;
1860 	  }
1861 	else
1862 	  architecture = tp->arch;
1863       }
1864       break;
1865 
1866     default:
1867       return 0;
1868     }
1869 
1870   return 1;
1871 }
1872 
1873 void
md_show_usage(FILE * stream)1874 md_show_usage (FILE *stream)
1875 {
1876   int i;
1877 
1878   fprintf (stream, _("I960 options:\n"));
1879   for (i = 0; arch_tab[i].flag; i++)
1880     fprintf (stream, "%s-A%s", i ? " | " : "", arch_tab[i].flag);
1881   fprintf (stream, _("\n\
1882 			specify variant of 960 architecture\n\
1883 -b			add code to collect statistics about branches taken\n\
1884 -link-relax		preserve individual alignment directives so linker\n\
1885 			can do relaxing (b.out format only)\n\
1886 -no-relax		don't alter compare-and-branch instructions for\n\
1887 			long displacements\n"));
1888 }
1889 
1890 /* relax_cobr:
1891    Replace cobr instruction in a code fragment with equivalent branch and
1892    compare instructions, so it can reach beyond a 13-bit displacement.
1893    Set up an address fix/relocation for the new branch instruction.  */
1894 
1895 /* This "conditional jump" table maps cobr instructions into
1896    equivalent compare and branch opcodes.  */
1897 
1898 static const
1899 struct
1900 {
1901   long compare;
1902   long branch;
1903 }
1904 
1905 coj[] =
1906 {				/* COBR OPCODE: */
1907   { CHKBIT, BNO },		/*      0x30 - bbc */
1908   { CMPO, BG },			/*      0x31 - cmpobg */
1909   { CMPO, BE },			/*      0x32 - cmpobe */
1910   { CMPO, BGE },		/*      0x33 - cmpobge */
1911   { CMPO, BL },			/*      0x34 - cmpobl */
1912   { CMPO, BNE },		/*      0x35 - cmpobne */
1913   { CMPO, BLE },		/*      0x36 - cmpoble */
1914   { CHKBIT, BO },		/*      0x37 - bbs */
1915   { CMPI, BNO },		/*      0x38 - cmpibno */
1916   { CMPI, BG },			/*      0x39 - cmpibg */
1917   { CMPI, BE },			/*      0x3a - cmpibe */
1918   { CMPI, BGE },		/*      0x3b - cmpibge */
1919   { CMPI, BL },			/*      0x3c - cmpibl */
1920   { CMPI, BNE },		/*      0x3d - cmpibne */
1921   { CMPI, BLE },		/*      0x3e - cmpible */
1922   { CMPI, BO },			/*      0x3f - cmpibo */
1923 };
1924 
1925 static void
relax_cobr(fragS * fragP)1926 relax_cobr (fragS *fragP)	/* fragP->fr_opcode is assumed to point to
1927 				   the cobr instruction, which comes at the
1928 				   end of the code fragment.  */
1929 {
1930   int opcode, src1, src2, m1, s2;
1931   /* Bit fields from cobr instruction.  */
1932   long bp_bits;			/* Branch prediction bits from cobr instruction.  */
1933   long instr;			/* A single i960 instruction.  */
1934   /* ->instruction to be replaced.  */
1935   char *iP;
1936   fixS *fixP;			/* Relocation that can be done at assembly time.  */
1937 
1938   /* Pick up & parse cobr instruction.  */
1939   iP = fragP->fr_opcode;
1940   instr = md_chars_to_number (iP, 4);
1941   opcode = ((instr >> 24) & 0xff) - 0x30;	/* "-0x30" for table index.  */
1942   src1 = (instr >> 19) & 0x1f;
1943   m1 = (instr >> 13) & 1;
1944   s2 = instr & 1;
1945   src2 = (instr >> 14) & 0x1f;
1946   bp_bits = instr & BP_MASK;
1947 
1948   /* Generate and output compare instruction.  */
1949   instr = coj[opcode].compare
1950     | src1 | (m1 << 11) | (s2 << 6) | (src2 << 14);
1951   md_number_to_chars (iP, instr, 4);
1952 
1953   /* Output branch instruction.  */
1954   md_number_to_chars (iP + 4, coj[opcode].branch | bp_bits, 4);
1955 
1956   /* Set up address fixup/relocation.  */
1957   fixP = fix_new (fragP,
1958 		  iP + 4 - fragP->fr_literal,
1959 		  4,
1960 		  fragP->fr_symbol,
1961 		  fragP->fr_offset,
1962 		  1,
1963 		  NO_RELOC);
1964 
1965   fixP->fx_bit_fixP = (bit_fixS *) 24;	/* Store size of bit field.  */
1966 
1967   fragP->fr_fix += 4;
1968   frag_wane (fragP);
1969 }
1970 
1971 /* md_convert_frag:
1972 
1973    Called by base assembler after address relaxation is finished:  modify
1974    variable fragments according to how much relaxation was done.
1975 
1976    If the fragment substate is still 1, a 13-bit displacement was enough
1977    to reach the symbol in question.  Set up an address fixup, but otherwise
1978    leave the cobr instruction alone.
1979 
1980    If the fragment substate is 2, a 13-bit displacement was not enough.
1981    Replace the cobr with a two instructions (a compare and a branch).  */
1982 
1983 void
md_convert_frag(bfd * abfd ATTRIBUTE_UNUSED,segT sec ATTRIBUTE_UNUSED,fragS * fragP)1984 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1985 		 segT sec ATTRIBUTE_UNUSED,
1986 		 fragS *fragP)
1987 {
1988   /* Structure describing needed address fix.  */
1989   fixS *fixP;
1990 
1991   switch (fragP->fr_subtype)
1992     {
1993     case 1:
1994       /* Leave single cobr instruction.  */
1995       fixP = fix_new (fragP,
1996 		      fragP->fr_opcode - fragP->fr_literal,
1997 		      4,
1998 		      fragP->fr_symbol,
1999 		      fragP->fr_offset,
2000 		      1,
2001 		      NO_RELOC);
2002 
2003       fixP->fx_bit_fixP = (bit_fixS *) 13;	/* Size of bit field.  */
2004       break;
2005     case 2:
2006       /* Replace cobr with compare/branch instructions.  */
2007       relax_cobr (fragP);
2008       break;
2009     default:
2010       BAD_CASE (fragP->fr_subtype);
2011       break;
2012     }
2013 }
2014 
2015 /* md_estimate_size_before_relax:  How much does it look like *fragP will grow?
2016 
2017    Called by base assembler just before address relaxation.
2018    Return the amount by which the fragment will grow.
2019 
2020    Any symbol that is now undefined will not become defined; cobr's
2021    based on undefined symbols will have to be replaced with a compare
2022    instruction and a branch instruction, and the code fragment will grow
2023    by 4 bytes.  */
2024 
2025 int
md_estimate_size_before_relax(fragS * fragP,segT segment_type)2026 md_estimate_size_before_relax (fragS *fragP, segT segment_type)
2027 {
2028   /* If symbol is undefined in this segment, go to "relaxed" state
2029      (compare and branch instructions instead of cobr) right now.  */
2030   if (S_GET_SEGMENT (fragP->fr_symbol) != segment_type)
2031     {
2032       relax_cobr (fragP);
2033       return 4;
2034     }
2035 
2036   return md_relax_table[fragP->fr_subtype].rlx_length;
2037 }
2038 
2039 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
2040 
2041 /* md_ri_to_chars:
2042    This routine exists in order to overcome machine byte-order problems
2043    when dealing with bit-field entries in the relocation_info struct.
2044 
2045    But relocation info will be used on the host machine only (only
2046    executable code is actually downloaded to the i80960).  Therefore,
2047    we leave it in host byte order.  */
2048 
2049 static void
md_ri_to_chars(char * where,struct relocation_info * ri)2050 md_ri_to_chars (char *where, struct relocation_info *ri)
2051 {
2052   host_number_to_chars (where, ri->r_address, 4);
2053   host_number_to_chars (where + 4, ri->r_index, 3);
2054 #if WORDS_BIGENDIAN
2055   where[7] = (ri->r_pcrel << 7
2056 	      | ri->r_length << 5
2057 	      | ri->r_extern << 4
2058 	      | ri->r_bsr << 3
2059 	      | ri->r_disp << 2
2060 	      | ri->r_callj << 1
2061 	      | ri->nuthin << 0);
2062 #else
2063   where[7] = (ri->r_pcrel << 0
2064 	      | ri->r_length << 1
2065 	      | ri->r_extern << 3
2066 	      | ri->r_bsr << 4
2067 	      | ri->r_disp << 5
2068 	      | ri->r_callj << 6
2069 	      | ri->nuthin << 7);
2070 #endif
2071 }
2072 
2073 #endif /* defined(OBJ_AOUT) | defined(OBJ_BOUT) */
2074 
2075 
2076 /* brtab_emit:	generate the fetch-prediction branch table.
2077 
2078    See the comments above the declaration of 'br_cnt' for details on
2079    branch-prediction instrumentation.
2080 
2081    The code emitted here would be functionally equivalent to the following
2082    example assembler source.
2083 
2084   			.data
2085   			.align	2
2086   	   BR_TAB_NAME:
2087   			.word	0		# link to next table
2088   			.word	3		# length of table
2089   			.word	LBRANCH0	# 1st entry in table proper
2090   			.word	LBRANCH1
2091   			.word	LBRANCH2  */
2092 
2093 void
brtab_emit(void)2094 brtab_emit (void)
2095 {
2096   int i;
2097   char buf[20];
2098   /* Where the binary was output to.  */
2099   char *p;
2100 
2101   if (!instrument_branches)
2102     return;
2103 
2104   subseg_set (data_section, 0);	/*      .data */
2105   frag_align (2, 0, 0);		/*      .align 2 */
2106   record_alignment (now_seg, 2);
2107   colon (BR_TAB_NAME);		/* BR_TAB_NAME: */
2108   emit (0);			/*      .word 0 #link to next table */
2109   emit (br_cnt);		/*      .word n #length of table */
2110 
2111   for (i = 0; i < br_cnt; i++)
2112     {
2113       sprintf (buf, "%s%d", BR_LABEL_BASE, i);
2114       p = emit (0);
2115       fix_new (frag_now,
2116 	       p - frag_now->fr_literal,
2117 	       4, symbol_find (buf), 0, 0, NO_RELOC);
2118     }
2119 }
2120 
2121 /* s_leafproc:	process .leafproc pseudo-op
2122 
2123   	.leafproc takes two arguments, the second one is optional:
2124   		arg[1]: name of 'call' entry point to leaf procedure
2125   		arg[2]: name of 'bal' entry point to leaf procedure
2126 
2127   	If the two arguments are identical, or if the second one is missing,
2128   	the first argument is taken to be the 'bal' entry point.
2129 
2130   	If there are 2 distinct arguments, we must make sure that the 'bal'
2131   	entry point immediately follows the 'call' entry point in the linked
2132   	list of symbols.  */
2133 
2134 static void
s_leafproc(int n_ops,char * args[])2135 s_leafproc (int n_ops,		/* Number of operands.  */
2136 	    char *args[])	/* args[1]->1st operand, args[2]->2nd operand.  */
2137 {
2138   symbolS *callP;		/* Pointer to leafproc 'call' entry point symbol.  */
2139   symbolS *balP;		/* Pointer to leafproc 'bal' entry point symbol.  */
2140 
2141   if ((n_ops != 1) && (n_ops != 2))
2142     {
2143       as_bad (_("should have 1 or 2 operands"));
2144       return;
2145     }
2146 
2147   /* Find or create symbol for 'call' entry point.  */
2148   callP = symbol_find_or_make (args[1]);
2149 
2150   if (TC_S_IS_CALLNAME (callP))
2151     as_warn (_("Redefining leafproc %s"), S_GET_NAME (callP));
2152 
2153   /* If that was the only argument, use it as the 'bal' entry point.
2154      Otherwise, mark it as the 'call' entry point and find or create
2155      another symbol for the 'bal' entry point.  */
2156   if ((n_ops == 1) || !strcmp (args[1], args[2]))
2157     {
2158       TC_S_FORCE_TO_BALNAME (callP);
2159     }
2160   else
2161     {
2162       TC_S_FORCE_TO_CALLNAME (callP);
2163 
2164       balP = symbol_find_or_make (args[2]);
2165       if (TC_S_IS_CALLNAME (balP))
2166 	as_warn (_("Redefining leafproc %s"), S_GET_NAME (balP));
2167 
2168       TC_S_FORCE_TO_BALNAME (balP);
2169 
2170 #ifndef OBJ_ELF
2171       tc_set_bal_of_call (callP, balP);
2172 #endif
2173     }
2174 }
2175 
2176 /* s_sysproc: process .sysproc pseudo-op
2177 
2178    .sysproc takes two arguments:
2179      arg[1]: name of entry point to system procedure
2180      arg[2]: 'entry_num' (index) of system procedure in the range
2181      [0,31] inclusive.
2182 
2183    For [ab].out, we store the 'entrynum' in the 'n_other' field of
2184    the symbol.  Since that entry is normally 0, we bias 'entrynum'
2185    by adding 1 to it.  It must be unbiased before it is used.  */
2186 
2187 static void
s_sysproc(int n_ops,char * args[])2188 s_sysproc (int n_ops,		/* Number of operands.  */
2189 	   char *args[])	/* args[1]->1st operand, args[2]->2nd operand.  */
2190 {
2191   expressionS exp;
2192   symbolS *symP;
2193 
2194   if (n_ops != 2)
2195     {
2196       as_bad (_("should have two operands"));
2197       return;
2198     }
2199 
2200   /* Parse "entry_num" argument and check it for validity.  */
2201   parse_expr (args[2], &exp);
2202   if (exp.X_op != O_constant
2203       || (offs (exp) < 0)
2204       || (offs (exp) > 31))
2205     {
2206       as_bad (_("'entry_num' must be absolute number in [0,31]"));
2207       return;
2208     }
2209 
2210   /* Find/make symbol and stick entry number (biased by +1) into it.  */
2211   symP = symbol_find_or_make (args[1]);
2212 
2213   if (TC_S_IS_SYSPROC (symP))
2214     as_warn (_("Redefining entrynum for sysproc %s"), S_GET_NAME (symP));
2215 
2216   TC_S_SET_SYSPROC (symP, offs (exp));	/* Encode entry number.  */
2217   TC_S_FORCE_TO_SYSPROC (symP);
2218 }
2219 
2220 /* parse_po:	parse machine-dependent pseudo-op
2221 
2222    This is a top-level routine for machine-dependent pseudo-ops.  It slurps
2223    up the rest of the input line, breaks out the individual arguments,
2224    and dispatches them to the correct handler.  */
2225 
2226 static void
parse_po(int po_num)2227 parse_po (int po_num)	/* Pseudo-op number:  currently S_LEAFPROC or S_SYSPROC.  */
2228 {
2229   /* Pointers operands, with no embedded whitespace.
2230      arg[0] unused, arg[1-3]->operands.  */
2231   char *args[4];
2232   int n_ops;			/* Number of operands.  */
2233   char *p;			/* Pointer to beginning of unparsed argument string.  */
2234   char eol;			/* Character that indicated end of line.  */
2235 
2236   extern char is_end_of_line[];
2237 
2238   /* Advance input pointer to end of line.  */
2239   p = input_line_pointer;
2240   while (!is_end_of_line[(unsigned char) *input_line_pointer])
2241     input_line_pointer++;
2242 
2243   eol = *input_line_pointer;	/* Save end-of-line char.  */
2244   *input_line_pointer = '\0';	/* Terminate argument list.  */
2245 
2246   /* Parse out operands.  */
2247   n_ops = get_args (p, args);
2248   if (n_ops == -1)
2249     return;
2250 
2251   /* Dispatch to correct handler.  */
2252   switch (po_num)
2253     {
2254     case S_SYSPROC:
2255       s_sysproc (n_ops, args);
2256       break;
2257     case S_LEAFPROC:
2258       s_leafproc (n_ops, args);
2259       break;
2260     default:
2261       BAD_CASE (po_num);
2262       break;
2263     }
2264 
2265   /* Restore eol, so line numbers get updated correctly.  Base
2266      assembler assumes we leave input pointer pointing at char
2267      following the eol.  */
2268   *input_line_pointer++ = eol;
2269 }
2270 
2271 /* reloc_callj:	Relocate a 'callj' instruction
2272 
2273   	This is a "non-(GNU)-standard" machine-dependent hook.  The base
2274   	assembler calls it when it decides it can relocate an address at
2275   	assembly time instead of emitting a relocation directive.
2276 
2277   	Check to see if the relocation involves a 'callj' instruction to a:
2278   	    sysproc:	Replace the default 'call' instruction with a 'calls'
2279   	    leafproc:	Replace the default 'call' instruction with a 'bal'.
2280   	    other proc:	Do nothing.
2281 
2282   	See b.out.h for details on the 'n_other' field in a symbol structure.
2283 
2284    IMPORTANT!:
2285   	Assumes the caller has already figured out, in the case of a leafproc,
2286   	to use the 'bal' entry point, and has substituted that symbol into the
2287   	passed fixup structure.  */
2288 
2289 int
reloc_callj(fixS * fixP)2290 reloc_callj (fixS *fixP)  /* Relocation that can be done at assembly time.  */
2291 {
2292   /* Points to the binary for the instruction being relocated.  */
2293   char *where;
2294 
2295   if (!fixP->fx_tcbit)
2296     /* This wasn't a callj instruction in the first place.  */
2297     return 0;
2298 
2299   where = fixP->fx_frag->fr_literal + fixP->fx_where;
2300 
2301   if (TC_S_IS_SYSPROC (fixP->fx_addsy))
2302     {
2303       /* Symbol is a .sysproc: replace 'call' with 'calls'.  System
2304          procedure number is (other-1).  */
2305       md_number_to_chars (where, CALLS | TC_S_GET_SYSPROC (fixP->fx_addsy), 4);
2306 
2307       /* Nothing else needs to be done for this instruction.  Make
2308          sure 'md_number_to_field()' will perform a no-op.  */
2309       fixP->fx_bit_fixP = (bit_fixS *) 1;
2310     }
2311   else if (TC_S_IS_CALLNAME (fixP->fx_addsy))
2312     {
2313       /* Should not happen: see block comment above.  */
2314       as_fatal (_("Trying to 'bal' to %s"), S_GET_NAME (fixP->fx_addsy));
2315     }
2316   else if (TC_S_IS_BALNAME (fixP->fx_addsy))
2317     {
2318       /* Replace 'call' with 'bal'; both instructions have the same
2319          format, so calling code should complete relocation as if
2320          nothing happened here.  */
2321       md_number_to_chars (where, BAL, 4);
2322     }
2323   else if (TC_S_IS_BADPROC (fixP->fx_addsy))
2324     as_bad (_("Looks like a proc, but can't tell what kind.\n"));
2325 
2326   /* Otherwise Symbol is neither a sysproc nor a leafproc.  */
2327   return 0;
2328 }
2329 
2330 /* Handle the MRI .endian pseudo-op.  */
2331 
2332 static void
s_endian(int ignore ATTRIBUTE_UNUSED)2333 s_endian (int ignore ATTRIBUTE_UNUSED)
2334 {
2335   char *name;
2336   char c;
2337 
2338   c = get_symbol_name (&name);
2339   if (strcasecmp (name, "little") == 0)
2340     ;
2341   else if (strcasecmp (name, "big") == 0)
2342     as_bad (_("big endian mode is not supported"));
2343   else
2344     as_warn (_("ignoring unrecognized .endian type `%s'"), name);
2345 
2346   (void) restore_line_pointer (c);
2347 
2348   demand_empty_rest_of_line ();
2349 }
2350 
2351 /* We have no need to default values of symbols.  */
2352 
2353 symbolS *
md_undefined_symbol(char * name ATTRIBUTE_UNUSED)2354 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2355 {
2356   return 0;
2357 }
2358 
2359 /* Exactly what point is a PC-relative offset relative TO?
2360    On the i960, they're relative to the address of the instruction,
2361    which we have set up as the address of the fixup too.  */
2362 long
md_pcrel_from(fixS * fixP)2363 md_pcrel_from (fixS *fixP)
2364 {
2365   return fixP->fx_where + fixP->fx_frag->fr_address;
2366 }
2367 
2368 void
md_apply_fix(fixS * fixP,valueT * valP,segT seg ATTRIBUTE_UNUSED)2369 md_apply_fix (fixS *fixP,
2370 	       valueT *valP,
2371 	       segT seg ATTRIBUTE_UNUSED)
2372 {
2373   long val = *valP;
2374   char *place = fixP->fx_where + fixP->fx_frag->fr_literal;
2375 
2376   if (!fixP->fx_bit_fixP)
2377     {
2378       md_number_to_imm (place, val, fixP->fx_size);
2379     }
2380   else if ((int) (size_t) fixP->fx_bit_fixP == 13
2381 	   && fixP->fx_addsy != NULL
2382 	   && S_GET_SEGMENT (fixP->fx_addsy) == undefined_section)
2383     {
2384       /* This is a COBR instruction.  They have only a
2385 	 13-bit displacement and are only to be used
2386 	 for local branches: flag as error, don't generate
2387 	 relocation.  */
2388       as_bad_where (fixP->fx_file, fixP->fx_line,
2389 		    _("can't use COBR format with external label"));
2390       fixP->fx_addsy = NULL;
2391     }
2392   else
2393     md_number_to_field (place, val, fixP->fx_bit_fixP);
2394 
2395   if (fixP->fx_addsy == NULL)
2396     fixP->fx_done = 1;
2397 }
2398 
2399 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
2400 void
tc_bout_fix_to_chars(char * where,fixS * fixP,relax_addressT segment_address_in_file)2401 tc_bout_fix_to_chars (char *where,
2402 		      fixS *fixP,
2403 		      relax_addressT segment_address_in_file)
2404 {
2405   static const unsigned char nbytes_r_length[] = {42, 0, 1, 42, 2};
2406   struct relocation_info ri;
2407   symbolS *symbolP;
2408 
2409   memset ((char *) &ri, '\0', sizeof (ri));
2410   symbolP = fixP->fx_addsy;
2411   know (symbolP != 0 || fixP->fx_r_type != NO_RELOC);
2412   ri.r_bsr = fixP->fx_bsr;	/*SAC LD RELAX HACK */
2413   /* These two 'cuz of NS32K */
2414   ri.r_callj = fixP->fx_tcbit;
2415   if (fixP->fx_bit_fixP)
2416     ri.r_length = 2;
2417   else
2418     ri.r_length = nbytes_r_length[fixP->fx_size];
2419   ri.r_pcrel = fixP->fx_pcrel;
2420   ri.r_address = fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file;
2421 
2422   if (fixP->fx_r_type != NO_RELOC)
2423     {
2424       switch (fixP->fx_r_type)
2425 	{
2426 	case rs_align:
2427 	  ri.r_index = -2;
2428 	  ri.r_pcrel = 1;
2429 	  ri.r_length = fixP->fx_size - 1;
2430 	  break;
2431 	case rs_org:
2432 	  ri.r_index = -2;
2433 	  ri.r_pcrel = 0;
2434 	  break;
2435 	case rs_fill:
2436 	  ri.r_index = -1;
2437 	  break;
2438 	default:
2439 	  abort ();
2440 	}
2441       ri.r_extern = 0;
2442     }
2443   else if (linkrelax || !S_IS_DEFINED (symbolP) || fixP->fx_bsr)
2444     {
2445       ri.r_extern = 1;
2446       ri.r_index = symbolP->sy_number;
2447     }
2448   else
2449     {
2450       ri.r_extern = 0;
2451       ri.r_index = S_GET_TYPE (symbolP);
2452     }
2453 
2454   /* Output the relocation information in machine-dependent form.  */
2455   md_ri_to_chars (where, &ri);
2456 }
2457 
2458 #endif /* OBJ_AOUT or OBJ_BOUT */
2459 
2460 /* Align an address by rounding it up to the specified boundary.  */
2461 
2462 valueT
md_section_align(segT seg,valueT addr)2463 md_section_align (segT seg,
2464 		  valueT addr)		/* Address to be rounded up.  */
2465 {
2466   int align;
2467 
2468   align = bfd_get_section_alignment (stdoutput, seg);
2469   return (addr + (1 << align) - 1) & -(1 << align);
2470 }
2471 
2472 extern int coff_flags;
2473 
2474 /* For aout or bout, the bal immediately follows the call.
2475 
2476    For coff, we cheat and store a pointer to the bal symbol in the
2477    second aux entry of the call.  */
2478 
2479 #undef OBJ_ABOUT
2480 #ifdef OBJ_AOUT
2481 #define OBJ_ABOUT
2482 #endif
2483 #ifdef OBJ_BOUT
2484 #define OBJ_ABOUT
2485 #endif
2486 
2487 void
tc_set_bal_of_call(symbolS * callP ATTRIBUTE_UNUSED,symbolS * balP ATTRIBUTE_UNUSED)2488 tc_set_bal_of_call (symbolS *callP ATTRIBUTE_UNUSED,
2489 		    symbolS *balP ATTRIBUTE_UNUSED)
2490 {
2491   know (TC_S_IS_CALLNAME (callP));
2492   know (TC_S_IS_BALNAME (balP));
2493 
2494 #ifdef OBJ_COFF
2495 
2496   callP->sy_tc = balP;
2497   S_SET_NUMBER_AUXILIARY (callP, 2);
2498 
2499 #else /* ! OBJ_COFF */
2500 #ifdef OBJ_ABOUT
2501 
2502   /* If the 'bal' entry doesn't immediately follow the 'call'
2503      symbol, unlink it from the symbol list and re-insert it.  */
2504   if (symbol_next (callP) != balP)
2505     {
2506       symbol_remove (balP, &symbol_rootP, &symbol_lastP);
2507       symbol_append (balP, callP, &symbol_rootP, &symbol_lastP);
2508     }				/* if not in order */
2509 
2510 #else /* ! OBJ_ABOUT */
2511   as_fatal ("Only supported for a.out, b.out, or COFF");
2512 #endif /* ! OBJ_ABOUT */
2513 #endif /* ! OBJ_COFF */
2514 }
2515 
2516 symbolS *
tc_get_bal_of_call(symbolS * callP ATTRIBUTE_UNUSED)2517 tc_get_bal_of_call (symbolS *callP ATTRIBUTE_UNUSED)
2518 {
2519   symbolS *retval;
2520 
2521   know (TC_S_IS_CALLNAME (callP));
2522 
2523 #ifdef OBJ_COFF
2524   retval = callP->sy_tc;
2525 #else
2526 #ifdef OBJ_ABOUT
2527   retval = symbol_next (callP);
2528 #else
2529   as_fatal ("Only supported for a.out, b.out, or COFF");
2530 #endif /* ! OBJ_ABOUT */
2531 #endif /* ! OBJ_COFF */
2532 
2533   know (TC_S_IS_BALNAME (retval));
2534   return retval;
2535 }
2536 
2537 #ifdef OBJ_COFF
2538 void
tc_coff_symbol_emit_hook(symbolS * symbolP ATTRIBUTE_UNUSED)2539 tc_coff_symbol_emit_hook (symbolS *symbolP ATTRIBUTE_UNUSED)
2540 {
2541   if (TC_S_IS_CALLNAME (symbolP))
2542     {
2543       symbolS *balP = tc_get_bal_of_call (symbolP);
2544 
2545       symbolP->sy_symbol.ost_auxent[1].x_bal.x_balntry = S_GET_VALUE (balP);
2546       if (S_GET_STORAGE_CLASS (symbolP) == C_EXT)
2547 	S_SET_STORAGE_CLASS (symbolP, C_LEAFEXT);
2548       else
2549 	S_SET_STORAGE_CLASS (symbolP, C_LEAFSTAT);
2550       S_SET_DATA_TYPE (symbolP, S_GET_DATA_TYPE (symbolP) | (DT_FCN << N_BTSHFT));
2551       /* Fix up the bal symbol.  */
2552       S_SET_STORAGE_CLASS (balP, C_LABEL);
2553     }
2554 }
2555 #endif /* OBJ_COFF */
2556 
2557 void
i960_handle_align(fragS * fragp ATTRIBUTE_UNUSED)2558 i960_handle_align (fragS *fragp ATTRIBUTE_UNUSED)
2559 {
2560   if (!linkrelax)
2561     return;
2562 
2563 #ifndef OBJ_BOUT
2564   as_bad (_("option --link-relax is only supported in b.out format"));
2565   linkrelax = 0;
2566   return;
2567 #else
2568 
2569   /* The text section "ends" with another alignment reloc, to which we
2570      aren't adding padding.  */
2571   if (fragp->fr_next == text_last_frag
2572       || fragp->fr_next == data_last_frag)
2573     return;
2574 
2575   /* alignment directive */
2576   fix_new (fragp, fragp->fr_fix, fragp->fr_offset, 0, 0, 0,
2577 	   (int) fragp->fr_type);
2578 #endif /* OBJ_BOUT */
2579 }
2580 
2581 int
i960_validate_fix(fixS * fixP,segT this_segment_type ATTRIBUTE_UNUSED)2582 i960_validate_fix (fixS *fixP, segT this_segment_type ATTRIBUTE_UNUSED)
2583 {
2584   if (fixP->fx_tcbit && TC_S_IS_CALLNAME (fixP->fx_addsy))
2585     {
2586       /* Relocation should be done via the associated 'bal'
2587          entry point symbol.  */
2588       if (!TC_S_IS_BALNAME (tc_get_bal_of_call (fixP->fx_addsy)))
2589 	{
2590 	  as_bad_where (fixP->fx_file, fixP->fx_line,
2591 			_("No 'bal' entry point for leafproc %s"),
2592 			S_GET_NAME (fixP->fx_addsy));
2593 	  return 0;
2594 	}
2595       fixP->fx_addsy = tc_get_bal_of_call (fixP->fx_addsy);
2596     }
2597 
2598   return 1;
2599 }
2600 
2601 /* From cgen.c:  */
2602 
2603 static short
tc_bfd_fix2rtype(fixS * fixP)2604 tc_bfd_fix2rtype (fixS *fixP)
2605 {
2606   if (fixP->fx_pcrel == 0 && fixP->fx_size == 4)
2607     return BFD_RELOC_32;
2608 
2609   if (fixP->fx_pcrel != 0 && fixP->fx_size == 4)
2610     return BFD_RELOC_24_PCREL;
2611 
2612   abort ();
2613   return 0;
2614 }
2615 
2616 /* Translate internal representation of relocation info to BFD target
2617    format.
2618 
2619    FIXME: To what extent can we get all relevant targets to use this?  */
2620 
2621 arelent *
tc_gen_reloc(asection * section ATTRIBUTE_UNUSED,fixS * fixP)2622 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
2623 {
2624   arelent * reloc;
2625 
2626   reloc = XNEW (arelent);
2627 
2628   /* HACK: Is this right?  */
2629   fixP->fx_r_type = tc_bfd_fix2rtype (fixP);
2630 
2631   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
2632   if (reloc->howto == NULL)
2633     {
2634       as_bad_where (fixP->fx_file, fixP->fx_line,
2635 		    _("internal error: can't export reloc type %d (`%s')"),
2636 		    fixP->fx_r_type,
2637 		    bfd_get_reloc_code_name (fixP->fx_r_type));
2638       return NULL;
2639     }
2640 
2641   gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
2642 
2643   reloc->sym_ptr_ptr = XNEW (asymbol *);
2644   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
2645   reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
2646   reloc->addend = fixP->fx_addnumber;
2647 
2648   return reloc;
2649 }
2650 
2651 /* end from cgen.c */
2652 
2653 const pseudo_typeS md_pseudo_table[] =
2654 {
2655   {"bss", s_lcomm, 1},
2656   {"endian", s_endian, 0},
2657   {"extended", float_cons, 't'},
2658   {"leafproc", parse_po, S_LEAFPROC},
2659   {"sysproc", parse_po, S_SYSPROC},
2660 
2661   {"word", cons, 4},
2662   {"quad", cons, 16},
2663 
2664   {0, 0, 0}
2665 };
2666