1/* ns32k.c  -- Assemble on the National Semiconductor 32k series
2   Copyright (C) 1987-2017 Free Software Foundation, Inc.
3
4   This file is part of GAS, the GNU Assembler.
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/*#define SHOW_NUM 1*//* Uncomment for debugging.  */
22
23#include "as.h"
24#include "opcode/ns32k.h"
25
26#include "obstack.h"
27
28/* Macros.  */
29#define IIF_ENTRIES 13		/* Number of entries in iif.  */
30#define PRIVATE_SIZE 256	/* Size of my garbage memory.  */
31#define MAX_ARGS 4
32#define DEFAULT	-1		/* addr_mode returns this value when
33                                   plain constant or label is
34                                   encountered.  */
35
36#define IIF(ptr,a1,c1,e1,g1,i1,k1,m1,o1,q1,s1,u1)	\
37    iif.iifP[ptr].type = a1;				\
38    iif.iifP[ptr].size = c1;				\
39    iif.iifP[ptr].object = e1;				\
40    iif.iifP[ptr].object_adjust = g1;			\
41    iif.iifP[ptr].pcrel = i1;				\
42    iif.iifP[ptr].pcrel_adjust = k1;			\
43    iif.iifP[ptr].im_disp = m1;				\
44    iif.iifP[ptr].relax_substate = o1;			\
45    iif.iifP[ptr].bit_fixP = q1;			\
46    iif.iifP[ptr].addr_mode = s1;			\
47    iif.iifP[ptr].bsr = u1;
48
49#ifdef SEQUENT_COMPATABILITY
50#define LINE_COMMENT_CHARS "|"
51#define ABSOLUTE_PREFIX '@'
52#define IMMEDIATE_PREFIX '#'
53#endif
54
55#ifndef LINE_COMMENT_CHARS
56#define LINE_COMMENT_CHARS "#"
57#endif
58
59const char comment_chars[] = "#";
60const char line_comment_chars[] = LINE_COMMENT_CHARS;
61const char line_separator_chars[] = ";";
62static int default_disp_size = 4; /* Displacement size for external refs.  */
63
64#if !defined(ABSOLUTE_PREFIX) && !defined(IMMEDIATE_PREFIX)
65#define ABSOLUTE_PREFIX '@'	/* One or the other MUST be defined.  */
66#endif
67
68struct addr_mode
69{
70  signed char mode;		/* Addressing mode of operand (0-31).  */
71  signed char scaled_mode;	/* Mode combined with scaled mode.  */
72  char scaled_reg;		/* Register used in scaled+1 (1-8).  */
73  char float_flag;		/* Set if R0..R7 was F0..F7 ie a
74				   floating-point-register.  */
75  char am_size;			/* Estimated max size of general addr-mode
76				   parts.  */
77  char im_disp;			/* If im_disp==1 we have a displacement.  */
78  char pcrel;			/* 1 if pcrel, this is really redundant info.  */
79  char disp_suffix[2];		/* Length of displacement(s), 0=undefined.  */
80  char *disp[2];		/* Pointer(s) at displacement(s)
81				   or immediates(s)     (ascii).  */
82  char index_byte;		/* Index byte.  */
83};
84typedef struct addr_mode addr_modeS;
85
86char *freeptr, *freeptr_static;	/* Points at some number of free bytes.  */
87struct hash_control *inst_hash_handle;
88
89struct ns32k_opcode *desc;	/* Pointer at description of instruction.  */
90addr_modeS addr_modeP;
91const char EXP_CHARS[] = "eE";
92const char FLT_CHARS[] = "fd";	/* We don't want to support lowercase,
93                                   do we?  */
94
95/* UPPERCASE denotes live names when an instruction is built, IIF is
96   used as an intermediate form to store the actual parts of the
97   instruction. A ns32k machine instruction can be divided into a
98   couple of sub PARTs. When an instruction is assembled the
99   appropriate PART get an assignment. When an IIF has been completed
100   it is converted to a FRAGment as specified in AS.H.  */
101
102/* Internal structs.  */
103struct ns32k_option
104{
105  const char *pattern;
106  unsigned long or;
107  unsigned long and;
108};
109
110typedef struct
111{
112  int type;			/* How to interpret object.  */
113  int size;			/* Estimated max size of object.  */
114  unsigned long object;		/* Binary data.  */
115  int object_adjust;		/* Number added to object.  */
116  int pcrel;			/* True if object is pcrel.  */
117  int pcrel_adjust;		/* Length in bytes from the instruction
118				   start to the	displacement.  */
119  int im_disp;			/* True if the object is a displacement.  */
120  relax_substateT relax_substate;/*Initial relaxsubstate.  */
121  bit_fixS *bit_fixP;		/* Pointer at bit_fix struct.  */
122  int addr_mode;		/* What addrmode do we associate with this
123				   iif-entry.  */
124  char bsr;			/* Sequent hack.  */
125} iif_entryT;			/* Internal Instruction Format.  */
126
127struct int_ins_form
128{
129  int instr_size;		/* Max size of instruction in bytes.  */
130  iif_entryT iifP[IIF_ENTRIES + 1];
131};
132
133struct int_ins_form iif;
134expressionS exprP;
135
136/* Description of the PARTs in IIF
137  object[n]:
138   0	total length in bytes of entries in iif
139   1	opcode
140   2	index_byte_a
141   3	index_byte_b
142   4	disp_a_1
143   5	disp_a_2
144   6	disp_b_1
145   7	disp_b_2
146   8	imm_a
147   9	imm_b
148   10	implied1
149   11	implied2
150
151   For every entry there is a datalength in bytes. This is stored in size[n].
152  	 0,	the objectlength is not explicitly given by the instruction
153  		and the operand is undefined. This is a case for relaxation.
154  		Reserve 4 bytes for the final object.
155
156  	 1,	the entry contains one byte
157  	 2,	the entry contains two bytes
158  	 3,	the entry contains three bytes
159  	 4,	the entry contains four bytes
160  	etc
161
162   Furthermore, every entry has a data type identifier in type[n].
163
164   	 0,	the entry is void, ignore it.
165   	 1,	the entry is a binary number.
166  	 2,	the entry is a pointer at an expression.
167  		Where expression may be as simple as a single '1',
168  		and as complicated as  foo-bar+12,
169   		foo and bar may be undefined but suffixed by :{b|w|d} to
170  		control the length of the object.
171
172  	 3,	the entry is a pointer at a bignum struct
173
174   The low-order-byte corresponds to low physical memory.
175   Obviously a FRAGment must be created for each valid disp in PART whose
176   datalength is undefined (to bad) .
177   The case where just the expression is undefined is less severe and is
178   handled by fix. Here the number of bytes in the objectfile is known.
179   With this representation we simplify the assembly and separates the
180   machine dependent/independent parts in a more clean way (said OE).  */
181
182struct ns32k_option opt1[] =		/* restore, exit.  */
183{
184  {"r0", 0x80, 0xff},
185  {"r1", 0x40, 0xff},
186  {"r2", 0x20, 0xff},
187  {"r3", 0x10, 0xff},
188  {"r4", 0x08, 0xff},
189  {"r5", 0x04, 0xff},
190  {"r6", 0x02, 0xff},
191  {"r7", 0x01, 0xff},
192  {0, 0x00, 0xff}
193};
194struct ns32k_option opt2[] =		/* save, enter.  */
195{
196  {"r0", 0x01, 0xff},
197  {"r1", 0x02, 0xff},
198  {"r2", 0x04, 0xff},
199  {"r3", 0x08, 0xff},
200  {"r4", 0x10, 0xff},
201  {"r5", 0x20, 0xff},
202  {"r6", 0x40, 0xff},
203  {"r7", 0x80, 0xff},
204  {0, 0x00, 0xff}
205};
206struct ns32k_option opt3[] =		/* setcfg.  */
207{
208  {"c", 0x8, 0xff},
209  {"m", 0x4, 0xff},
210  {"f", 0x2, 0xff},
211  {"i", 0x1, 0xff},
212  {0, 0x0, 0xff}
213};
214struct ns32k_option opt4[] =		/* cinv.  */
215{
216  {"a", 0x4, 0xff},
217  {"i", 0x2, 0xff},
218  {"d", 0x1, 0xff},
219  {0, 0x0, 0xff}
220};
221struct ns32k_option opt5[] =		/* String inst.  */
222{
223  {"b", 0x2, 0xff},
224  {"u", 0xc, 0xff},
225  {"w", 0x4, 0xff},
226  {0, 0x0, 0xff}
227};
228struct ns32k_option opt6[] =		/* Plain reg ext,cvtp etc.  */
229{
230  {"r0", 0x00, 0xff},
231  {"r1", 0x01, 0xff},
232  {"r2", 0x02, 0xff},
233  {"r3", 0x03, 0xff},
234  {"r4", 0x04, 0xff},
235  {"r5", 0x05, 0xff},
236  {"r6", 0x06, 0xff},
237  {"r7", 0x07, 0xff},
238  {0, 0x00, 0xff}
239};
240
241#if !defined(NS32032) && !defined(NS32532)
242#define NS32532
243#endif
244
245struct ns32k_option cpureg_532[] =	/* lpr spr.  */
246{
247  {"us", 0x0, 0xff},
248  {"dcr", 0x1, 0xff},
249  {"bpc", 0x2, 0xff},
250  {"dsr", 0x3, 0xff},
251  {"car", 0x4, 0xff},
252  {"fp", 0x8, 0xff},
253  {"sp", 0x9, 0xff},
254  {"sb", 0xa, 0xff},
255  {"usp", 0xb, 0xff},
256  {"cfg", 0xc, 0xff},
257  {"psr", 0xd, 0xff},
258  {"intbase", 0xe, 0xff},
259  {"mod", 0xf, 0xff},
260  {0, 0x00, 0xff}
261};
262struct ns32k_option mmureg_532[] =	/* lmr smr.  */
263{
264  {"mcr", 0x9, 0xff},
265  {"msr", 0xa, 0xff},
266  {"tear", 0xb, 0xff},
267  {"ptb0", 0xc, 0xff},
268  {"ptb1", 0xd, 0xff},
269  {"ivar0", 0xe, 0xff},
270  {"ivar1", 0xf, 0xff},
271  {0, 0x0, 0xff}
272};
273
274struct ns32k_option cpureg_032[] =	/* lpr spr.  */
275{
276  {"upsr", 0x0, 0xff},
277  {"fp", 0x8, 0xff},
278  {"sp", 0x9, 0xff},
279  {"sb", 0xa, 0xff},
280  {"psr", 0xd, 0xff},
281  {"intbase", 0xe, 0xff},
282  {"mod", 0xf, 0xff},
283  {0, 0x0, 0xff}
284};
285struct ns32k_option mmureg_032[] =	/* lmr smr.  */
286{
287  {"bpr0", 0x0, 0xff},
288  {"bpr1", 0x1, 0xff},
289  {"pf0", 0x4, 0xff},
290  {"pf1", 0x5, 0xff},
291  {"sc", 0x8, 0xff},
292  {"msr", 0xa, 0xff},
293  {"bcnt", 0xb, 0xff},
294  {"ptb0", 0xc, 0xff},
295  {"ptb1", 0xd, 0xff},
296  {"eia", 0xf, 0xff},
297  {0, 0x0, 0xff}
298};
299
300#if defined(NS32532)
301struct ns32k_option *cpureg = cpureg_532;
302struct ns32k_option *mmureg = mmureg_532;
303#else
304struct ns32k_option *cpureg = cpureg_032;
305struct ns32k_option *mmureg = mmureg_032;
306#endif
307
308
309const pseudo_typeS md_pseudo_table[] =
310{					/* So far empty.  */
311  {0, 0, 0}
312};
313
314#define IND(x,y)	(((x)<<2)+(y))
315
316/* Those are index's to relax groups in md_relax_table ie it must be
317   multiplied by 4 to point at a group start. Viz IND(x,y) Se function
318   relax_segment in write.c for more info.  */
319
320#define BRANCH		1
321#define PCREL		2
322
323/* Those are index's to entries in a relax group.  */
324
325#define BYTE		0
326#define WORD		1
327#define DOUBLE		2
328#define UNDEF           3
329/* Those limits are calculated from the displacement start in memory.
330   The ns32k uses the beginning of the instruction as displacement
331   base.  This type of displacements could be handled here by moving
332   the limit window up or down. I choose to use an internal
333   displacement base-adjust as there are other routines that must
334   consider this. Also, as we have two various offset-adjusts in the
335   ns32k (acb versus br/brs/jsr/bcond), two set of limits would have
336   had to be used.  Now we don't have to think about that.  */
337
338const relax_typeS md_relax_table[] =
339{
340  {1, 1, 0, 0},
341  {1, 1, 0, 0},
342  {1, 1, 0, 0},
343  {1, 1, 0, 0},
344
345  {(63), (-64), 1, IND (BRANCH, WORD)},
346  {(8192), (-8192), 2, IND (BRANCH, DOUBLE)},
347  {0, 0, 4, 0},
348  {1, 1, 0, 0}
349};
350
351/* Array used to test if mode contains displacements.
352   Value is true if mode contains displacement.  */
353
354char disp_test[] =
355{0, 0, 0, 0, 0, 0, 0, 0,
356 1, 1, 1, 1, 1, 1, 1, 1,
357 1, 1, 1, 0, 0, 1, 1, 0,
358 1, 1, 1, 1, 1, 1, 1, 1};
359
360/* Array used to calculate max size of displacements.  */
361
362char disp_size[] =
363{4, 1, 2, 0, 4};
364
365/* Parse a general operand into an addressingmode struct
366
367   In:  pointer at operand in ascii form
368        pointer at addr_mode struct for result
369        the level of recursion. (always 0 or 1)
370
371   Out: data in addr_mode struct.  */
372
373static int
374addr_mode (char *operand,
375	   addr_modeS *addrmodeP,
376	   int recursive_level)
377{
378  char *str;
379  int i;
380  int strl;
381  int mode;
382  int j;
383
384  mode = DEFAULT;		/* Default.  */
385  addrmodeP->scaled_mode = 0;	/* Why not.  */
386  addrmodeP->scaled_reg = 0;	/* If 0, not scaled index.  */
387  addrmodeP->float_flag = 0;
388  addrmodeP->am_size = 0;
389  addrmodeP->im_disp = 0;
390  addrmodeP->pcrel = 0;	/* Not set in this function.  */
391  addrmodeP->disp_suffix[0] = 0;
392  addrmodeP->disp_suffix[1] = 0;
393  addrmodeP->disp[0] = NULL;
394  addrmodeP->disp[1] = NULL;
395  str = operand;
396
397  if (str[0] == 0)
398    return 0;
399
400  strl = strlen (str);
401
402  switch (str[0])
403    {
404      /* The following three case statements controls the mode-chars
405	 this is the place to ed if you want to change them.  */
406#ifdef ABSOLUTE_PREFIX
407    case ABSOLUTE_PREFIX:
408      if (str[strl - 1] == ']')
409	break;
410      addrmodeP->mode = 21;	/* absolute */
411      addrmodeP->disp[0] = str + 1;
412      return -1;
413#endif
414#ifdef IMMEDIATE_PREFIX
415    case IMMEDIATE_PREFIX:
416      if (str[strl - 1] == ']')
417	break;
418      addrmodeP->mode = 20;	/* immediate */
419      addrmodeP->disp[0] = str + 1;
420      return -1;
421#endif
422    case '.':
423      if (str[strl - 1] != ']')
424	{
425	  switch (str[1])
426	    {
427	    case '-':
428	    case '+':
429	      if (str[2] != '\000')
430		{
431		  addrmodeP->mode = 27;	/* pc-relative */
432		  addrmodeP->disp[0] = str + 2;
433		  return -1;
434		}
435	      /* Fall through.  */
436	    default:
437	      as_bad (_("Invalid syntax in PC-relative addressing mode"));
438	      return 0;
439	    }
440	}
441      break;
442    case 'e':
443      if (str[strl - 1] != ']')
444	{
445	  if ((!strncmp (str, "ext(", 4)) && strl > 7)
446	    {				/* external */
447	      addrmodeP->disp[0] = str + 4;
448	      i = 0;
449	      j = 2;
450	      do
451		{			/* disp[0]'s termination point.  */
452		  j += 1;
453		  if (str[j] == '(')
454		    i++;
455		  if (str[j] == ')')
456		    i--;
457		}
458	      while (j < strl && i != 0);
459	      if (i != 0 || !(str[j + 1] == '-' || str[j + 1] == '+'))
460		{
461		  as_bad (_("Invalid syntax in External addressing mode"));
462		  return (0);
463		}
464	      str[j] = '\000';		/* null terminate disp[0] */
465	      addrmodeP->disp[1] = str + j + 2;
466	      addrmodeP->mode = 22;
467	      return -1;
468	    }
469	}
470      break;
471
472    default:
473      ;
474    }
475
476  strl = strlen (str);
477
478  switch (strl)
479    {
480    case 2:
481      switch (str[0])
482	{
483	case 'f':
484	  addrmodeP->float_flag = 1;
485	  /* Fall through.  */
486	case 'r':
487	  if (str[1] >= '0' && str[1] < '8')
488	    {
489	      addrmodeP->mode = str[1] - '0';
490	      return -1;
491	    }
492	  break;
493	default:
494	  break;
495	}
496      /* Drop through.  */
497
498    case 3:
499      if (!strncmp (str, "tos", 3))
500	{
501	  addrmodeP->mode = 23;	/* TopOfStack */
502	  return -1;
503	}
504      break;
505
506    default:
507      break;
508    }
509
510  if (strl > 4)
511    {
512      if (str[strl - 1] == ')')
513	{
514	  if (str[strl - 2] == ')')
515	    {
516	      if (!strncmp (&str[strl - 5], "(fp", 3))
517		mode = 16;		/* Memory Relative.  */
518	      else if (!strncmp (&str[strl - 5], "(sp", 3))
519		mode = 17;
520	      else if (!strncmp (&str[strl - 5], "(sb", 3))
521		mode = 18;
522
523	      if (mode != DEFAULT)
524		{
525		  /* Memory relative.  */
526		  addrmodeP->mode = mode;
527		  j = strl - 5;		/* Temp for end of disp[0].  */
528		  i = 0;
529
530		  do
531		    {
532		      strl -= 1;
533		      if (str[strl] == ')')
534			i++;
535		      if (str[strl] == '(')
536			i--;
537		    }
538		  while (strl > -1 && i != 0);
539
540		  if (i != 0)
541		    {
542		      as_bad (_("Invalid syntax in Memory Relative addressing mode"));
543		      return (0);
544		    }
545
546		  addrmodeP->disp[1] = str;
547		  addrmodeP->disp[0] = str + strl + 1;
548		  str[j] = '\000';	/* Null terminate disp[0] .  */
549		  str[strl] = '\000';	/* Null terminate disp[1].  */
550
551		  return -1;
552		}
553	    }
554
555	  switch (str[strl - 3])
556	    {
557	    case 'r':
558	    case 'R':
559	      if (str[strl - 2] >= '0'
560		  && str[strl - 2] < '8'
561		  && str[strl - 4] == '(')
562		{
563		  addrmodeP->mode = str[strl - 2] - '0' + 8;
564		  addrmodeP->disp[0] = str;
565		  str[strl - 4] = 0;
566		  return -1;		/* reg rel */
567		}
568	      /* Fall through.  */
569
570	    default:
571	      if (!strncmp (&str[strl - 4], "(fp", 3))
572		mode = 24;
573	      else if (!strncmp (&str[strl - 4], "(sp", 3))
574		mode = 25;
575	      else if (!strncmp (&str[strl - 4], "(sb", 3))
576		mode = 26;
577	      else if (!strncmp (&str[strl - 4], "(pc", 3))
578		mode = 27;
579
580	      if (mode != DEFAULT)
581		{
582		  addrmodeP->mode = mode;
583		  addrmodeP->disp[0] = str;
584		  str[strl - 4] = '\0';
585
586		  return -1;		/* Memory space.  */
587		}
588	    }
589	}
590
591      /* No trailing ')' do we have a ']' ?  */
592      if (str[strl - 1] == ']')
593	{
594	  switch (str[strl - 2])
595	    {
596	    case 'b':
597	      mode = 28;
598	      break;
599	    case 'w':
600	      mode = 29;
601	      break;
602	    case 'd':
603	      mode = 30;
604	      break;
605	    case 'q':
606	      mode = 31;
607	      break;
608	    default:
609	      as_bad (_("Invalid scaled-indexed mode, use (b,w,d,q)"));
610
611	      if (str[strl - 3] != ':' || str[strl - 6] != '['
612		  || str[strl - 5] == 'r' || str[strl - 4] < '0'
613		  || str[strl - 4] > '7')
614		as_bad (_("Syntax in scaled-indexed mode, use [Rn:m] where n=[0..7] m={b,w,d,q}"));
615	    } /* Scaled index.  */
616
617	  if (recursive_level > 0)
618	    {
619	      as_bad (_("Scaled-indexed addressing mode combined with scaled-index"));
620	      return 0;
621	    }
622
623	  addrmodeP->am_size += 1;	/* scaled index byte.  */
624	  j = str[strl - 4] - '0';	/* store temporary.  */
625	  str[strl - 6] = '\000';	/* nullterminate for recursive call.  */
626	  i = addr_mode (str, addrmodeP, 1);
627
628	  if (!i || addrmodeP->mode == 20)
629	    {
630	      as_bad (_("Invalid or illegal addressing mode combined with scaled-index"));
631	      return 0;
632	    }
633
634	  addrmodeP->scaled_mode = addrmodeP->mode;	/* Store the inferior mode.  */
635	  addrmodeP->mode = mode;
636	  addrmodeP->scaled_reg = j + 1;
637
638	  return -1;
639	}
640    }
641
642  addrmodeP->mode = DEFAULT;	/* Default to whatever.  */
643  addrmodeP->disp[0] = str;
644
645  return -1;
646}
647
648static void
649evaluate_expr (expressionS *resultP, char *ptr)
650{
651  char *tmp_line;
652
653  tmp_line = input_line_pointer;
654  input_line_pointer = ptr;
655  expression (resultP);
656  input_line_pointer = tmp_line;
657}
658
659/* ptr points at string addr_modeP points at struct with result This
660   routine calls addr_mode to determine the general addr.mode of the
661   operand. When this is ready it parses the displacements for size
662   specifying suffixes and determines size of immediate mode via
663   ns32k-opcode.  Also builds index bytes if needed.  */
664
665static int
666get_addr_mode (char *ptr, addr_modeS *addrmodeP)
667{
668  int tmp;
669
670  addr_mode (ptr, addrmodeP, 0);
671
672  if (addrmodeP->mode == DEFAULT || addrmodeP->scaled_mode == -1)
673    {
674      /* Resolve ambiguous operands, this shouldn't be necessary if
675	 one uses standard NSC operand syntax. But the sequent
676	 compiler doesn't!!!  This finds a proper addressing mode
677	 if it is implicitly stated. See ns32k-opcode.h.  */
678      (void) evaluate_expr (&exprP, ptr); /* This call takes time Sigh!  */
679
680      if (addrmodeP->mode == DEFAULT)
681	{
682	  if (exprP.X_add_symbol || exprP.X_op_symbol)
683	    addrmodeP->mode = desc->default_model; /* We have a label.  */
684	  else
685	    addrmodeP->mode = desc->default_modec; /* We have a constant.  */
686	}
687      else
688	{
689	  if (exprP.X_add_symbol || exprP.X_op_symbol)
690	    addrmodeP->scaled_mode = desc->default_model;
691	  else
692	    addrmodeP->scaled_mode = desc->default_modec;
693	}
694
695      /* Must put this mess down in addr_mode to handle the scaled
696         case better.  */
697    }
698
699  /* It appears as the sequent compiler wants an absolute when we have
700     a label without @. Constants becomes immediates besides the addr
701     case.  Think it does so with local labels too, not optimum, pcrel
702     is better.  When I have time I will make gas check this and
703     select pcrel when possible Actually that is trivial.  */
704  if ((tmp = addrmodeP->scaled_reg))
705    {				/* Build indexbyte.  */
706      tmp--;			/* Remember regnumber comes incremented for
707				   flagpurpose.  */
708      tmp |= addrmodeP->scaled_mode << 3;
709      addrmodeP->index_byte = (char) tmp;
710      addrmodeP->am_size += 1;
711    }
712
713  gas_assert (addrmodeP->mode >= 0);
714  if (disp_test[(unsigned int) addrmodeP->mode])
715    {
716      char c;
717      char suffix;
718      char suffix_sub;
719      int i;
720      char *toP;
721      char *fromP;
722
723      /* There was a displacement, probe for length  specifying suffix.  */
724      addrmodeP->pcrel = 0;
725
726      gas_assert (addrmodeP->mode >= 0);
727      if (disp_test[(unsigned int) addrmodeP->mode])
728	{
729	  /* There is a displacement.  */
730	  if (addrmodeP->mode == 27 || addrmodeP->scaled_mode == 27)
731	    /* Do we have pcrel. mode.  */
732	    addrmodeP->pcrel = 1;
733
734	  addrmodeP->im_disp = 1;
735
736	  for (i = 0; i < 2; i++)
737	    {
738	      suffix_sub = suffix = 0;
739
740	      if ((toP = addrmodeP->disp[i]))
741		{
742		  /* Suffix of expression, the largest size rules.  */
743		  fromP = toP;
744
745		  while ((c = *fromP++))
746		    {
747		      *toP++ = c;
748		      if (c == ':')
749			{
750			  switch (*fromP)
751			    {
752			    case '\0':
753			      as_warn (_("Premature end of suffix -- Defaulting to d"));
754			      suffix = 4;
755			      continue;
756			    case 'b':
757			      suffix_sub = 1;
758			      break;
759			    case 'w':
760			      suffix_sub = 2;
761			      break;
762			    case 'd':
763			      suffix_sub = 4;
764			      break;
765			    default:
766			      as_warn (_("Bad suffix after ':' use {b|w|d} Defaulting to d"));
767			      suffix = 4;
768			    }
769
770			  fromP ++;
771			  toP --;	/* So we write over the ':' */
772
773			  if (suffix < suffix_sub)
774			    suffix = suffix_sub;
775			}
776		    }
777
778		  *toP = '\0'; /* Terminate properly.  */
779		  addrmodeP->disp_suffix[i] = suffix;
780		  addrmodeP->am_size += suffix ? suffix : 4;
781		}
782	    }
783	}
784    }
785  else
786    {
787      if (addrmodeP->mode == 20)
788	{
789	  /* Look in ns32k_opcode for size.  */
790	  addrmodeP->disp_suffix[0] = addrmodeP->am_size = desc->im_size;
791	  addrmodeP->im_disp = 0;
792	}
793    }
794
795  return addrmodeP->mode;
796}
797
798/* Read an optionlist.  */
799
800static void
801optlist (char *str,			/* The string to extract options from.  */
802	 struct ns32k_option *optionP,	/* How to search the string.  */
803	 unsigned long *default_map)	/* Default pattern and output.  */
804{
805  int i, j, k, strlen1, strlen2;
806  const char *patternP, *strP;
807
808  strlen1 = strlen (str);
809
810  if (strlen1 < 1)
811    as_fatal (_("Very short instr to option, ie you can't do it on a NULLstr"));
812
813  for (i = 0; optionP[i].pattern != 0; i++)
814    {
815      strlen2 = strlen (optionP[i].pattern);
816
817      for (j = 0; j < strlen1; j++)
818	{
819	  patternP = optionP[i].pattern;
820	  strP = &str[j];
821
822	  for (k = 0; k < strlen2; k++)
823	    {
824	      if (*(strP++) != *(patternP++))
825		break;
826	    }
827
828	  if (k == strlen2)
829	    {			/* match */
830	      *default_map |= optionP[i].or;
831	      *default_map &= optionP[i].and;
832	    }
833	}
834    }
835}
836
837/* Search struct for symbols.
838   This function is used to get the short integer form of reg names in
839   the instructions lmr, smr, lpr, spr return true if str is found in
840   list.  */
841
842static int
843list_search (char *str,				/* The string to match.  */
844	     struct ns32k_option *optionP,	/* List to search.  */
845	     unsigned long *default_map)	/* Default pattern and output.  */
846{
847  int i;
848
849  for (i = 0; optionP[i].pattern != 0; i++)
850    {
851      if (!strncmp (optionP[i].pattern, str, 20))
852	{
853	  /* Use strncmp to be safe.  */
854	  *default_map |= optionP[i].or;
855	  *default_map &= optionP[i].and;
856
857	  return -1;
858	}
859    }
860
861  as_bad (_("No such entry in list. (cpu/mmu register)"));
862  return 0;
863}
864
865/* Create a bit_fixS in obstack 'notes'.
866   This struct is used to profile the normal fix. If the bit_fixP is a
867   valid pointer (not NULL) the bit_fix data will be used to format
868   the fix.  */
869
870static bit_fixS *
871bit_fix_new (int size,		/* Length of bitfield.  */
872	     int offset,	/* Bit offset to bitfield.  */
873	     long min,		/* Signextended min for bitfield.  */
874	     long max,		/* Signextended max for bitfield.  */
875	     long add,		/* Add mask, used for huffman prefix.  */
876	     long base_type,	/* 0 or 1, if 1 it's exploded to opcode ptr.  */
877	     long base_adj)
878{
879  bit_fixS *bit_fixP;
880
881  bit_fixP = XOBNEW (&notes, bit_fixS);
882
883  bit_fixP->fx_bit_size = size;
884  bit_fixP->fx_bit_offset = offset;
885  bit_fixP->fx_bit_base = base_type;
886  bit_fixP->fx_bit_base_adj = base_adj;
887  bit_fixP->fx_bit_max = max;
888  bit_fixP->fx_bit_min = min;
889  bit_fixP->fx_bit_add = add;
890
891  return bit_fixP;
892}
893
894/* Convert operands to iif-format and adds bitfields to the opcode.
895   Operands are parsed in such an order that the opcode is updated from
896   its most significant bit, that is when the operand need to alter the
897   opcode.
898   Be careful not to put to objects in the same iif-slot.  */
899
900static void
901encode_operand (int argc,
902		char **argv,
903		const char *operandsP,
904		const char *suffixP,
905		char im_size ATTRIBUTE_UNUSED,
906		char opcode_bit_ptr)
907{
908  int i, j;
909  char d;
910  int pcrel, b, loop, pcrel_adjust;
911  unsigned long tmp;
912
913  for (loop = 0; loop < argc; loop++)
914    {
915      /* What operand are we supposed to work on.  */
916      i = operandsP[loop << 1] - '1';
917      if (i > 3)
918	as_fatal (_("Internal consistency error.  check ns32k-opcode.h"));
919
920      pcrel = 0;
921      pcrel_adjust = 0;
922      tmp = 0;
923
924      switch ((d = operandsP[(loop << 1) + 1]))
925	{
926	case 'f':		/* Operand of sfsr turns out to be a nasty
927				   specialcase.  */
928	  opcode_bit_ptr -= 5;
929	  /* Fall through.  */
930	case 'Z':		/* Float not immediate.  */
931	case 'F':		/* 32 bit float	general form.  */
932	case 'L':		/* 64 bit float.  */
933	case 'I':		/* Integer not immediate.  */
934	case 'B':		/* Byte	 */
935	case 'W':		/* Word	 */
936	case 'D':		/* Double-word.  */
937	case 'A':		/* Double-word	gen-address-form ie no regs
938				   allowed.  */
939	  get_addr_mode (argv[i], &addr_modeP);
940
941	  if ((addr_modeP.mode == 20) &&
942	     (d == 'I' || d == 'Z' || d == 'A'))
943	    as_fatal (d == 'A'? _("Address of immediate operand"):
944			_("Invalid immediate write operand."));
945
946	  if (opcode_bit_ptr == desc->opcode_size)
947	    b = 4;
948	  else
949	    b = 6;
950
951	  for (j = b; j < (b + 2); j++)
952	    {
953	      if (addr_modeP.disp[j - b])
954		{
955		  IIF (j,
956		       2,
957		       addr_modeP.disp_suffix[j - b],
958		       (unsigned long) addr_modeP.disp[j - b],
959		       0,
960		       addr_modeP.pcrel,
961		       iif.instr_size,
962		       addr_modeP.im_disp,
963		       IND (BRANCH, BYTE),
964		       NULL,
965		       (addr_modeP.scaled_reg ? addr_modeP.scaled_mode
966			: addr_modeP.mode),
967		       0);
968		}
969	    }
970
971	  opcode_bit_ptr -= 5;
972	  iif.iifP[1].object |= ((long) addr_modeP.mode) << opcode_bit_ptr;
973
974	  if (addr_modeP.scaled_reg)
975	    {
976	      j = b / 2;
977	      IIF (j, 1, 1, (unsigned long) addr_modeP.index_byte,
978		   0, 0, 0, 0, 0, NULL, -1, 0);
979	    }
980	  break;
981
982	case 'b':		/* Multiple instruction disp.  */
983	  freeptr++;		/* OVE:this is an useful hack.  */
984	  sprintf (freeptr, "((%s-1)*%d)", argv[i], desc->im_size);
985	  argv[i] = freeptr;
986	  pcrel -= 1;		/* Make pcrel 0 in spite of what case 'p':
987				   wants.  */
988	  /* fallthru */
989	case 'p':		/* Displacement - pc relative addressing.  */
990	  pcrel += 1;
991	  /* fallthru */
992	case 'd':		/* Displacement.  */
993	  iif.instr_size += suffixP[i] ? suffixP[i] : 4;
994	  IIF (12, 2, suffixP[i], (unsigned long) argv[i], 0,
995	       pcrel, pcrel_adjust, 1, IND (BRANCH, BYTE), NULL, -1, 0);
996	  break;
997	case 'H':		/* Sequent-hack: the linker wants a bit set
998				   when bsr.  */
999	  pcrel = 1;
1000	  iif.instr_size += suffixP[i] ? suffixP[i] : 4;
1001	  IIF (12, 2, suffixP[i], (unsigned long) argv[i], 0,
1002	       pcrel, pcrel_adjust, 1, IND (BRANCH, BYTE), NULL, -1, 1);
1003	  break;
1004	case 'q':		/* quick */
1005	  opcode_bit_ptr -= 4;
1006	  IIF (11, 2, 42, (unsigned long) argv[i], 0, 0, 0, 0, 0,
1007	       bit_fix_new (4, opcode_bit_ptr, -8, 7, 0, 1, 0), -1, 0);
1008	  break;
1009	case 'r':		/* Register number (3 bits).  */
1010	  list_search (argv[i], opt6, &tmp);
1011	  opcode_bit_ptr -= 3;
1012	  iif.iifP[1].object |= tmp << opcode_bit_ptr;
1013	  break;
1014	case 'O':		/* Setcfg instruction optionslist.  */
1015	  optlist (argv[i], opt3, &tmp);
1016	  opcode_bit_ptr -= 4;
1017	  iif.iifP[1].object |= tmp << 15;
1018	  break;
1019	case 'C':		/* Cinv instruction optionslist.  */
1020	  optlist (argv[i], opt4, &tmp);
1021	  opcode_bit_ptr -= 4;
1022	  iif.iifP[1].object |= tmp << 15; /* Insert the regtype in opcode.  */
1023	  break;
1024	case 'S':		/* String instruction options list.  */
1025	  optlist (argv[i], opt5, &tmp);
1026	  opcode_bit_ptr -= 4;
1027	  iif.iifP[1].object |= tmp << 15;
1028	  break;
1029	case 'u':
1030	case 'U':		/* Register list.  */
1031	  IIF (10, 1, 1, 0, 0, 0, 0, 0, 0, NULL, -1, 0);
1032	  switch (operandsP[(i << 1) + 1])
1033	    {
1034	    case 'u':		/* Restore, exit.  */
1035	      optlist (argv[i], opt1, &iif.iifP[10].object);
1036	      break;
1037	    case 'U':		/* Save, enter.  */
1038	      optlist (argv[i], opt2, &iif.iifP[10].object);
1039	      break;
1040	    }
1041	  iif.instr_size += 1;
1042	  break;
1043	case 'M':		/* MMU register.  */
1044	  list_search (argv[i], mmureg, &tmp);
1045	  opcode_bit_ptr -= 4;
1046	  iif.iifP[1].object |= tmp << opcode_bit_ptr;
1047	  break;
1048	case 'P':		/* CPU register.  */
1049	  list_search (argv[i], cpureg, &tmp);
1050	  opcode_bit_ptr -= 4;
1051	  iif.iifP[1].object |= tmp << opcode_bit_ptr;
1052	  break;
1053	case 'g':		/* Inss exts.  */
1054	  iif.instr_size += 1;	/* 1 byte is allocated after the opcode.  */
1055	  IIF (10, 2, 1,
1056	       (unsigned long) argv[i],	/* i always 2 here.  */
1057	       0, 0, 0, 0, 0,
1058	       bit_fix_new (3, 5, 0, 7, 0, 0, 0), /* A bit_fix is targeted to
1059						     the byte.  */
1060	       -1, 0);
1061	  break;
1062	case 'G':
1063	  IIF (11, 2, 42,
1064	       (unsigned long) argv[i],	/* i always 3 here.  */
1065	       0, 0, 0, 0, 0,
1066	       bit_fix_new (5, 0, 1, 32, -1, 0, -1), -1, 0);
1067	  break;
1068	case 'i':
1069	  iif.instr_size += 1;
1070	  b = 2 + i;		/* Put the extension byte after opcode.  */
1071	  IIF (b, 2, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0);
1072	  break;
1073	default:
1074	  as_fatal (_("Bad opcode-table-option, check in file ns32k-opcode.h"));
1075	}
1076    }
1077}
1078
1079/* in:  instruction line
1080   out: internal structure of instruction
1081   that has been prepared for direct conversion to fragment(s) and
1082   fixes in a systematical fashion
1083   Return-value = recursive_level.  */
1084/* Build iif of one assembly text line.  */
1085
1086static int
1087parse (const char *line, int recursive_level)
1088{
1089  const char *lineptr;
1090  char c, suffix_separator;
1091  int i;
1092  unsigned int argc;
1093  int arg_type;
1094  char sqr, sep;
1095  char suffix[MAX_ARGS], *argv[MAX_ARGS];	/* No more than 4 operands.  */
1096
1097  if (recursive_level <= 0)
1098    {
1099      /* Called from md_assemble.  */
1100      for (lineptr = line; (*lineptr) != '\0' && (*lineptr) != ' '; lineptr++)
1101	continue;
1102
1103      c = *lineptr;
1104      *(char *) lineptr = '\0';
1105
1106      if (!(desc = (struct ns32k_opcode *) hash_find (inst_hash_handle, line)))
1107	as_fatal (_("No such opcode"));
1108
1109      *(char *) lineptr = c;
1110    }
1111  else
1112    lineptr = line;
1113
1114  argc = 0;
1115
1116  if (*desc->operands)
1117    {
1118      if (*lineptr++ != '\0')
1119	{
1120	  sqr = '[';
1121	  sep = ',';
1122
1123	  while (*lineptr != '\0')
1124	    {
1125	      if (desc->operands[argc << 1])
1126		{
1127		  suffix[argc] = 0;
1128		  arg_type = desc->operands[(argc << 1) + 1];
1129
1130		  switch (arg_type)
1131		    {
1132		    case 'd':
1133		    case 'b':
1134		    case 'p':
1135		    case 'H':
1136		      /* The operand is supposed to be a displacement.  */
1137		      /* Hackwarning: do not forget to update the 4
1138                         cases above when editing ns32k-opcode.h.  */
1139		      suffix_separator = ':';
1140		      break;
1141		    default:
1142		      /* If this char occurs we loose.  */
1143		      suffix_separator = '\255';
1144		      break;
1145		    }
1146
1147		  suffix[argc] = 0; /* 0 when no ':' is encountered.  */
1148		  argv[argc] = freeptr;
1149		  *freeptr = '\0';
1150
1151		  while ((c = *lineptr) != '\0' && c != sep)
1152		    {
1153		      if (c == sqr)
1154			{
1155			  if (sqr == '[')
1156			    {
1157			      sqr = ']';
1158			      sep = '\0';
1159			    }
1160			  else
1161			    {
1162			      sqr = '[';
1163			      sep = ',';
1164			    }
1165			}
1166
1167		      if (c == suffix_separator)
1168			{
1169			  /* ':' - label/suffix separator.  */
1170			  switch (lineptr[1])
1171			    {
1172			    case 'b':
1173			      suffix[argc] = 1;
1174			      break;
1175			    case 'w':
1176			      suffix[argc] = 2;
1177			      break;
1178			    case 'd':
1179			      suffix[argc] = 4;
1180			      break;
1181			    default:
1182			      as_warn (_("Bad suffix, defaulting to d"));
1183			      suffix[argc] = 4;
1184			      if (lineptr[1] == '\0' || lineptr[1] == sep)
1185				{
1186				  lineptr += 1;
1187				  continue;
1188				}
1189			      break;
1190			    }
1191
1192			  lineptr += 2;
1193			  continue;
1194			}
1195
1196		      *freeptr++ = c;
1197		      lineptr++;
1198		    }
1199
1200		  *freeptr++ = '\0';
1201		  argc += 1;
1202
1203		  if (*lineptr == '\0')
1204		    continue;
1205
1206		  lineptr += 1;
1207		}
1208	      else
1209		as_fatal (_("Too many operands passed to instruction"));
1210	    }
1211	}
1212    }
1213
1214  if (argc != strlen (desc->operands) / 2)
1215    {
1216      if (strlen (desc->default_args))
1217	{
1218	  /* We can apply default, don't goof.  */
1219	  if (parse (desc->default_args, 1) != 1)
1220	    /* Check error in default.  */
1221	    as_fatal (_("Wrong numbers of operands in default, check ns32k-opcodes.h"));
1222	}
1223      else
1224	as_fatal (_("Wrong number of operands"));
1225    }
1226
1227  for (i = 0; i < IIF_ENTRIES; i++)
1228    /* Mark all entries as void.  */
1229    iif.iifP[i].type = 0;
1230
1231  /* Build opcode iif-entry.  */
1232  iif.instr_size = desc->opcode_size / 8;
1233  IIF (1, 1, iif.instr_size, desc->opcode_seed, 0, 0, 0, 0, 0, 0, -1, 0);
1234
1235  /* This call encodes operands to iif format.  */
1236  if (argc)
1237    encode_operand (argc, argv, &desc->operands[0],
1238		    &suffix[0], desc->im_size, desc->opcode_size);
1239
1240  return recursive_level;
1241}
1242
1243/* This functionality should really be in the bfd library.  */
1244
1245static bfd_reloc_code_real_type
1246reloc (int size, int pcrel, int type)
1247{
1248  int length, rel_index;
1249  bfd_reloc_code_real_type relocs[] =
1250  {
1251    BFD_RELOC_NS32K_IMM_8,
1252    BFD_RELOC_NS32K_IMM_16,
1253    BFD_RELOC_NS32K_IMM_32,
1254    BFD_RELOC_NS32K_IMM_8_PCREL,
1255    BFD_RELOC_NS32K_IMM_16_PCREL,
1256    BFD_RELOC_NS32K_IMM_32_PCREL,
1257
1258    /* ns32k displacements.  */
1259    BFD_RELOC_NS32K_DISP_8,
1260    BFD_RELOC_NS32K_DISP_16,
1261    BFD_RELOC_NS32K_DISP_32,
1262    BFD_RELOC_NS32K_DISP_8_PCREL,
1263    BFD_RELOC_NS32K_DISP_16_PCREL,
1264    BFD_RELOC_NS32K_DISP_32_PCREL,
1265
1266    /* Normal 2's complement.  */
1267    BFD_RELOC_8,
1268    BFD_RELOC_16,
1269    BFD_RELOC_32,
1270    BFD_RELOC_8_PCREL,
1271    BFD_RELOC_16_PCREL,
1272    BFD_RELOC_32_PCREL
1273  };
1274
1275  switch (size)
1276    {
1277    case 1:
1278      length = 0;
1279      break;
1280    case 2:
1281      length = 1;
1282      break;
1283    case 4:
1284      length = 2;
1285      break;
1286    default:
1287      length = -1;
1288      break;
1289    }
1290
1291  rel_index = length + 3 * pcrel + 6 * type;
1292
1293  if (rel_index >= 0 && (unsigned int) rel_index < sizeof (relocs) / sizeof (relocs[0]))
1294    return relocs[rel_index];
1295
1296  if (pcrel)
1297    as_bad (_("Can not do %d byte pc-relative relocation for storage type %d"),
1298	    size, type);
1299  else
1300    as_bad (_("Can not do %d byte relocation for storage type %d"),
1301	    size, type);
1302
1303  return BFD_RELOC_NONE;
1304
1305}
1306
1307static void
1308fix_new_ns32k (fragS *frag,		/* Which frag? */
1309	       int where,		/* Where in that frag? */
1310	       int size,		/* 1, 2  or 4 usually.  */
1311	       symbolS *add_symbol,	/* X_add_symbol.  */
1312	       long offset,		/* X_add_number.  */
1313	       int pcrel,		/* True if PC-relative relocation.  */
1314	       char im_disp,		/* True if the value to write is a
1315					   displacement.  */
1316	       bit_fixS *bit_fixP,	/* Pointer at struct of bit_fix's, ignored if
1317					   NULL.  */
1318	       char bsr,		/* Sequent-linker-hack: 1 when relocobject is
1319					   a bsr.  */
1320	       fragS *opcode_frag,
1321	       unsigned int opcode_offset)
1322{
1323  fixS *fixP = fix_new (frag, where, size, add_symbol,
1324			offset, pcrel,
1325			bit_fixP ? NO_RELOC : reloc (size, pcrel, im_disp)
1326			);
1327
1328  fix_opcode_frag (fixP) = opcode_frag;
1329  fix_opcode_offset (fixP) = opcode_offset;
1330  fix_im_disp (fixP) = im_disp;
1331  fix_bsr (fixP) = bsr;
1332  fix_bit_fixP (fixP) = bit_fixP;
1333  /* We have a MD overflow check for displacements.  */
1334  fixP->fx_no_overflow = (im_disp != 0);
1335}
1336
1337static void
1338fix_new_ns32k_exp (fragS *frag,		/* Which frag? */
1339		   int where,		/* Where in that frag? */
1340		   int size,		/* 1, 2  or 4 usually.  */
1341		   expressionS *exp,	/* Expression.  */
1342		   int pcrel,		/* True if PC-relative relocation.  */
1343		   char im_disp,	/* True if the value to write is a
1344					   displacement.  */
1345		   bit_fixS *bit_fixP,	/* Pointer at struct of bit_fix's, ignored if
1346					   NULL.  */
1347		   char bsr,		/* Sequent-linker-hack: 1 when relocobject is
1348					   a bsr.  */
1349		   fragS *opcode_frag,
1350		   unsigned int opcode_offset)
1351{
1352  fixS *fixP = fix_new_exp (frag, where, size, exp, pcrel,
1353			    bit_fixP ? NO_RELOC : reloc (size, pcrel, im_disp)
1354			    );
1355
1356  fix_opcode_frag (fixP) = opcode_frag;
1357  fix_opcode_offset (fixP) = opcode_offset;
1358  fix_im_disp (fixP) = im_disp;
1359  fix_bsr (fixP) = bsr;
1360  fix_bit_fixP (fixP) = bit_fixP;
1361  /* We have a MD overflow check for displacements.  */
1362  fixP->fx_no_overflow = (im_disp != 0);
1363}
1364
1365/* Convert number to chars in correct order.  */
1366
1367void
1368md_number_to_chars (char *buf, valueT value, int nbytes)
1369{
1370  number_to_chars_littleendian (buf, value, nbytes);
1371}
1372
1373/* This is a variant of md_numbers_to_chars. The reason for its'
1374   existence is the fact that ns32k uses Huffman coded
1375   displacements. This implies that the bit order is reversed in
1376   displacements and that they are prefixed with a size-tag.
1377
1378   binary: msb -> lsb
1379   0xxxxxxx				byte
1380   10xxxxxx xxxxxxxx			word
1381   11xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx	double word
1382
1383   This must be taken care of and we do it here!  */
1384
1385static void
1386md_number_to_disp (char *buf, long val, int n)
1387{
1388  switch (n)
1389    {
1390    case 1:
1391      if (val < -64 || val > 63)
1392	as_bad (_("value of %ld out of byte displacement range."), val);
1393      val &= 0x7f;
1394#ifdef SHOW_NUM
1395      printf ("%x ", val & 0xff);
1396#endif
1397      *buf++ = val;
1398      break;
1399
1400    case 2:
1401      if (val < -8192 || val > 8191)
1402	as_bad (_("value of %ld out of word displacement range."), val);
1403      val &= 0x3fff;
1404      val |= 0x8000;
1405#ifdef SHOW_NUM
1406      printf ("%x ", val >> 8 & 0xff);
1407#endif
1408      *buf++ = (val >> 8);
1409#ifdef SHOW_NUM
1410      printf ("%x ", val & 0xff);
1411#endif
1412      *buf++ = val;
1413      break;
1414
1415    case 4:
1416      if (val < -0x20000000 || val >= 0x20000000)
1417	as_bad (_("value of %ld out of double word displacement range."), val);
1418      val |= 0xc0000000;
1419#ifdef SHOW_NUM
1420      printf ("%x ", val >> 24 & 0xff);
1421#endif
1422      *buf++ = (val >> 24);
1423#ifdef SHOW_NUM
1424      printf ("%x ", val >> 16 & 0xff);
1425#endif
1426      *buf++ = (val >> 16);
1427#ifdef SHOW_NUM
1428      printf ("%x ", val >> 8 & 0xff);
1429#endif
1430      *buf++ = (val >> 8);
1431#ifdef SHOW_NUM
1432      printf ("%x ", val & 0xff);
1433#endif
1434      *buf++ = val;
1435      break;
1436
1437    default:
1438      as_fatal (_("Internal logic error.  line %d, file \"%s\""),
1439		__LINE__, __FILE__);
1440    }
1441}
1442
1443static void
1444md_number_to_imm (char *buf, long val, int n)
1445{
1446  switch (n)
1447    {
1448    case 1:
1449#ifdef SHOW_NUM
1450      printf ("%x ", val & 0xff);
1451#endif
1452      *buf++ = val;
1453      break;
1454
1455    case 2:
1456#ifdef SHOW_NUM
1457      printf ("%x ", val >> 8 & 0xff);
1458#endif
1459      *buf++ = (val >> 8);
1460#ifdef SHOW_NUM
1461      printf ("%x ", val & 0xff);
1462#endif
1463      *buf++ = val;
1464      break;
1465
1466    case 4:
1467#ifdef SHOW_NUM
1468      printf ("%x ", val >> 24 & 0xff);
1469#endif
1470      *buf++ = (val >> 24);
1471#ifdef SHOW_NUM
1472      printf ("%x ", val >> 16 & 0xff);
1473#endif
1474      *buf++ = (val >> 16);
1475#ifdef SHOW_NUM
1476      printf ("%x ", val >> 8 & 0xff);
1477#endif
1478      *buf++ = (val >> 8);
1479#ifdef SHOW_NUM
1480      printf ("%x ", val & 0xff);
1481#endif
1482      *buf++ = val;
1483      break;
1484
1485    default:
1486      as_fatal (_("Internal logic error. line %d, file \"%s\""),
1487		__LINE__, __FILE__);
1488    }
1489}
1490
1491/* Fast bitfiddling support.  */
1492/* Mask used to zero bitfield before oring in the true field.  */
1493
1494static unsigned long l_mask[] =
1495{
1496  0xffffffff, 0xfffffffe, 0xfffffffc, 0xfffffff8,
1497  0xfffffff0, 0xffffffe0, 0xffffffc0, 0xffffff80,
1498  0xffffff00, 0xfffffe00, 0xfffffc00, 0xfffff800,
1499  0xfffff000, 0xffffe000, 0xffffc000, 0xffff8000,
1500  0xffff0000, 0xfffe0000, 0xfffc0000, 0xfff80000,
1501  0xfff00000, 0xffe00000, 0xffc00000, 0xff800000,
1502  0xff000000, 0xfe000000, 0xfc000000, 0xf8000000,
1503  0xf0000000, 0xe0000000, 0xc0000000, 0x80000000,
1504};
1505static unsigned long r_mask[] =
1506{
1507  0x00000000, 0x00000001, 0x00000003, 0x00000007,
1508  0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
1509  0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
1510  0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
1511  0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
1512  0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
1513  0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
1514  0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
1515};
1516#define MASK_BITS 31
1517/* Insert bitfield described by field_ptr and val at buf
1518   This routine is written for modification of the first 4 bytes pointed
1519   to by buf, to yield speed.
1520   The ifdef stuff is for selection between a ns32k-dependent routine
1521   and a general version. (My advice: use the general version!).  */
1522
1523static void
1524md_number_to_field (char *buf, long val, bit_fixS *field_ptr)
1525{
1526  unsigned long object;
1527  unsigned long mask;
1528  /* Define ENDIAN on a ns32k machine.  */
1529#ifdef ENDIAN
1530  unsigned long *mem_ptr;
1531#else
1532  char *mem_ptr;
1533#endif
1534
1535  if (field_ptr->fx_bit_min <= val && val <= field_ptr->fx_bit_max)
1536    {
1537#ifdef ENDIAN
1538      if (field_ptr->fx_bit_base)
1539	/* Override buf.  */
1540	mem_ptr = (unsigned long *) field_ptr->fx_bit_base;
1541      else
1542	mem_ptr = (unsigned long *) buf;
1543
1544      mem_ptr = ((unsigned long *)
1545		 ((char *) mem_ptr + field_ptr->fx_bit_base_adj));
1546#else
1547      if (field_ptr->fx_bit_base)
1548	mem_ptr = (char *) field_ptr->fx_bit_base;
1549      else
1550	mem_ptr = buf;
1551
1552      mem_ptr += field_ptr->fx_bit_base_adj;
1553#endif
1554#ifdef ENDIAN
1555      /* We have a nice ns32k machine with lowbyte at low-physical mem.  */
1556      object = *mem_ptr;	/* get some bytes */
1557#else /* OVE Goof! the machine is a m68k or dito.  */
1558      /* That takes more byte fiddling.  */
1559      object = 0;
1560      object |= mem_ptr[3] & 0xff;
1561      object <<= 8;
1562      object |= mem_ptr[2] & 0xff;
1563      object <<= 8;
1564      object |= mem_ptr[1] & 0xff;
1565      object <<= 8;
1566      object |= mem_ptr[0] & 0xff;
1567#endif
1568      mask = 0;
1569      mask |= (r_mask[field_ptr->fx_bit_offset]);
1570      mask |= (l_mask[field_ptr->fx_bit_offset + field_ptr->fx_bit_size]);
1571      object &= mask;
1572      val += field_ptr->fx_bit_add;
1573      object |= ((val << field_ptr->fx_bit_offset) & (mask ^ 0xffffffff));
1574#ifdef ENDIAN
1575      *mem_ptr = object;
1576#else
1577      mem_ptr[0] = (char) object;
1578      object >>= 8;
1579      mem_ptr[1] = (char) object;
1580      object >>= 8;
1581      mem_ptr[2] = (char) object;
1582      object >>= 8;
1583      mem_ptr[3] = (char) object;
1584#endif
1585    }
1586  else
1587    as_bad (_("Bit field out of range"));
1588}
1589
1590/* Convert iif to fragments.  From this point we start to dribble with
1591   functions in other files than this one.(Except hash.c) So, if it's
1592   possible to make an iif for an other CPU, you don't need to know
1593   what frags, relax, obstacks, etc is in order to port this
1594   assembler. You only need to know if it's possible to reduce your
1595   cpu-instruction to iif-format (takes some work) and adopt the other
1596   md_? parts according to given instructions Note that iif was
1597   invented for the clean ns32k`s architecture.  */
1598
1599/* GAS for the ns32k has a problem. PC relative displacements are
1600   relative to the address of the opcode, not the address of the
1601   operand. We used to keep track of the offset between the operand
1602   and the opcode in pcrel_adjust for each frag and each fix. However,
1603   we get into trouble where there are two or more pc-relative
1604   operands and the size of the first one can't be determined. Then in
1605   the relax phase, the size of the first operand will change and
1606   pcrel_adjust will no longer be correct.  The current solution is
1607   keep a pointer to the frag with the opcode in it and the offset in
1608   that frag for each frag and each fix. Then, when needed, we can
1609   always figure out how far it is between the opcode and the pcrel
1610   object.  See also md_pcrel_adjust and md_fix_pcrel_adjust.  For
1611   objects not part of an instruction, the pointer to the opcode frag
1612   is always zero.  */
1613
1614static void
1615convert_iif (void)
1616{
1617  int i;
1618  bit_fixS *j;
1619  fragS *inst_frag;
1620  unsigned int inst_offset;
1621  char *inst_opcode;
1622  char *memP;
1623  int l;
1624  int k;
1625  char type;
1626  char size = 0;
1627
1628  frag_grow (iif.instr_size);	/* This is important.  */
1629  memP = frag_more (0);
1630  inst_opcode = memP;
1631  inst_offset = (memP - frag_now->fr_literal);
1632  inst_frag = frag_now;
1633
1634  for (i = 0; i < IIF_ENTRIES; i++)
1635    {
1636      if ((type = iif.iifP[i].type))
1637	{
1638	  /* The object exist, so handle it.  */
1639	  switch (size = iif.iifP[i].size)
1640	    {
1641	    case 42:
1642	      size = 0;
1643	      /* It's a bitfix that operates on an existing object.  */
1644	      if (iif.iifP[i].bit_fixP->fx_bit_base)
1645		/* Expand fx_bit_base to point at opcode.  */
1646		iif.iifP[i].bit_fixP->fx_bit_base = (long) inst_opcode;
1647	      /* Fall through.  */
1648
1649	    case 8:		/* bignum or doublefloat.  */
1650	    case 1:
1651	    case 2:
1652	    case 3:
1653	    case 4:
1654	      /* The final size in objectmemory is known.  */
1655	      memP = frag_more (size);
1656	      j = iif.iifP[i].bit_fixP;
1657
1658	      switch (type)
1659		{
1660		case 1:	/* The object is pure binary.  */
1661		  if (j)
1662		    md_number_to_field (memP, exprP.X_add_number, j);
1663
1664		  else if (iif.iifP[i].pcrel)
1665		    fix_new_ns32k (frag_now,
1666				   (long) (memP - frag_now->fr_literal),
1667				   size,
1668				   0,
1669				   iif.iifP[i].object,
1670				   iif.iifP[i].pcrel,
1671				   iif.iifP[i].im_disp,
1672				   0,
1673				   iif.iifP[i].bsr,	/* Sequent hack.  */
1674				   inst_frag, inst_offset);
1675		  else
1676		    {
1677		      /* Good, just put them bytes out.  */
1678		      switch (iif.iifP[i].im_disp)
1679			{
1680			case 0:
1681			  md_number_to_chars (memP, iif.iifP[i].object, size);
1682			  break;
1683			case 1:
1684			  md_number_to_disp (memP, iif.iifP[i].object, size);
1685			  break;
1686			default:
1687			  as_fatal (_("iif convert internal pcrel/binary"));
1688			}
1689		    }
1690		  break;
1691
1692		case 2:
1693		  /* The object is a pointer at an expression, so
1694                     unpack it, note that bignums may result from the
1695                     expression.  */
1696		  evaluate_expr (&exprP, (char *) iif.iifP[i].object);
1697		  if (exprP.X_op == O_big || size == 8)
1698		    {
1699		      if ((k = exprP.X_add_number) > 0)
1700			{
1701			  /* We have a bignum ie a quad. This can only
1702                             happens in a long suffixed instruction.  */
1703			  if (k * 2 > size)
1704			    as_bad (_("Bignum too big for long"));
1705
1706			  if (k == 3)
1707			    memP += 2;
1708
1709			  for (l = 0; k > 0; k--, l += 2)
1710			    md_number_to_chars (memP + l,
1711						generic_bignum[l >> 1],
1712						sizeof (LITTLENUM_TYPE));
1713			}
1714		      else
1715			{
1716			  /* flonum.  */
1717			  LITTLENUM_TYPE words[4];
1718
1719			  switch (size)
1720			    {
1721			    case 4:
1722			      gen_to_words (words, 2, 8);
1723			      md_number_to_imm (memP, (long) words[0],
1724						sizeof (LITTLENUM_TYPE));
1725			      md_number_to_imm (memP + sizeof (LITTLENUM_TYPE),
1726						(long) words[1],
1727						sizeof (LITTLENUM_TYPE));
1728			      break;
1729			    case 8:
1730			      gen_to_words (words, 4, 11);
1731			      md_number_to_imm (memP, (long) words[0],
1732						sizeof (LITTLENUM_TYPE));
1733			      md_number_to_imm (memP + sizeof (LITTLENUM_TYPE),
1734						(long) words[1],
1735						sizeof (LITTLENUM_TYPE));
1736			      md_number_to_imm ((memP + 2
1737						 * sizeof (LITTLENUM_TYPE)),
1738						(long) words[2],
1739						sizeof (LITTLENUM_TYPE));
1740			      md_number_to_imm ((memP + 3
1741						 * sizeof (LITTLENUM_TYPE)),
1742						(long) words[3],
1743						sizeof (LITTLENUM_TYPE));
1744			      break;
1745			    }
1746			}
1747		      break;
1748		    }
1749		  if (exprP.X_add_symbol ||
1750		      exprP.X_op_symbol ||
1751		      iif.iifP[i].pcrel)
1752		    {
1753		      /* The expression was undefined due to an
1754                         undefined label. Create a fix so we can fix
1755                         the object later.  */
1756		      exprP.X_add_number += iif.iifP[i].object_adjust;
1757		      fix_new_ns32k_exp (frag_now,
1758					 (long) (memP - frag_now->fr_literal),
1759					 size,
1760					 &exprP,
1761					 iif.iifP[i].pcrel,
1762					 iif.iifP[i].im_disp,
1763					 j,
1764					 iif.iifP[i].bsr,
1765					 inst_frag, inst_offset);
1766		    }
1767		  else if (j)
1768		    md_number_to_field (memP, exprP.X_add_number, j);
1769		  else
1770		    {
1771		      /* Good, just put them bytes out.  */
1772		      switch (iif.iifP[i].im_disp)
1773			{
1774			case 0:
1775			  md_number_to_imm (memP, exprP.X_add_number, size);
1776			  break;
1777			case 1:
1778			  md_number_to_disp (memP, exprP.X_add_number, size);
1779			  break;
1780			default:
1781			  as_fatal (_("iif convert internal pcrel/pointer"));
1782			}
1783		    }
1784		  break;
1785		default:
1786		  as_fatal (_("Internal logic error in iif.iifP[n].type"));
1787		}
1788	      break;
1789
1790	    case 0:
1791	      /* Too bad, the object may be undefined as far as its
1792		 final nsize in object memory is concerned.  The size
1793		 of the object in objectmemory is not explicitly
1794		 given.  If the object is defined its length can be
1795		 determined and a fix can replace the frag.  */
1796	      {
1797		evaluate_expr (&exprP, (char *) iif.iifP[i].object);
1798
1799		if ((exprP.X_add_symbol || exprP.X_op_symbol) &&
1800		    !iif.iifP[i].pcrel)
1801		  {
1802		    /* Size is unknown until link time so have to default.  */
1803		    size = default_disp_size; /* Normally 4 bytes.  */
1804		    memP = frag_more (size);
1805		    fix_new_ns32k_exp (frag_now,
1806				       (long) (memP - frag_now->fr_literal),
1807				       size,
1808				       &exprP,
1809				       0, /* never iif.iifP[i].pcrel, */
1810				       1, /* always iif.iifP[i].im_disp */
1811				       (bit_fixS *) 0, 0,
1812				       inst_frag,
1813				       inst_offset);
1814		    break;		/* Exit this absolute hack.  */
1815		  }
1816
1817		if (exprP.X_add_symbol || exprP.X_op_symbol)
1818		  {
1819		    /* Frag it.  */
1820		    if (exprP.X_op_symbol)
1821		      /* We can't relax this case.  */
1822		      as_fatal (_("Can't relax difference"));
1823		    else
1824		      {
1825			/* Size is not important.  This gets fixed by
1826			   relax, but we assume 0 in what follows.  */
1827			memP = frag_more (4); /* Max size.  */
1828			size = 0;
1829
1830			{
1831			  fragS *old_frag = frag_now;
1832			  frag_variant (rs_machine_dependent,
1833					4, /* Max size.  */
1834					0, /* Size.  */
1835					IND (BRANCH, UNDEF), /* Expecting
1836                                                                the worst.  */
1837					exprP.X_add_symbol,
1838					exprP.X_add_number,
1839					inst_opcode);
1840			  frag_opcode_frag (old_frag) = inst_frag;
1841			  frag_opcode_offset (old_frag) = inst_offset;
1842			  frag_bsr (old_frag) = iif.iifP[i].bsr;
1843			}
1844		      }
1845		  }
1846		else
1847		  {
1848		    /* This duplicates code in md_number_to_disp.  */
1849		    if (-64 <= exprP.X_add_number && exprP.X_add_number <= 63)
1850		      size = 1;
1851		    else
1852		      {
1853			if (-8192 <= exprP.X_add_number
1854			    && exprP.X_add_number <= 8191)
1855			  size = 2;
1856			else
1857			  {
1858			    if (-0x20000000 <= exprP.X_add_number
1859				&& exprP.X_add_number<=0x1fffffff)
1860			      size = 4;
1861			    else
1862			      {
1863				as_bad (_("Displacement too large for :d"));
1864				size = 4;
1865			      }
1866			  }
1867		      }
1868
1869		    memP = frag_more (size);
1870		    md_number_to_disp (memP, exprP.X_add_number, size);
1871		  }
1872	      }
1873	      break;
1874
1875	    default:
1876	      as_fatal (_("Internal logic error in iif.iifP[].type"));
1877	    }
1878	}
1879    }
1880}
1881
1882void
1883md_assemble (char *line)
1884{
1885  freeptr = freeptr_static;
1886  parse (line, 0);		/* Explode line to more fix form in iif.  */
1887  convert_iif ();		/* Convert iif to frags, fix's etc.  */
1888#ifdef SHOW_NUM
1889  printf (" \t\t\t%s\n", line);
1890#endif
1891}
1892
1893void
1894md_begin (void)
1895{
1896  /* Build a hashtable of the instructions.  */
1897  const struct ns32k_opcode *ptr;
1898  const char *status;
1899  const struct ns32k_opcode *endop;
1900
1901  inst_hash_handle = hash_new ();
1902
1903  endop = ns32k_opcodes + sizeof (ns32k_opcodes) / sizeof (ns32k_opcodes[0]);
1904  for (ptr = ns32k_opcodes; ptr < endop; ptr++)
1905    {
1906      if ((status = hash_insert (inst_hash_handle, ptr->name, (char *) ptr)))
1907	/* Fatal.  */
1908	as_fatal (_("Can't hash %s: %s"), ptr->name, status);
1909    }
1910
1911  /* Some private space please!  */
1912  freeptr_static = XNEWVEC (char, PRIVATE_SIZE);
1913}
1914
1915/* Turn the string pointed to by litP into a floating point constant
1916   of type TYPE, and emit the appropriate bytes.  The number of
1917   LITTLENUMS emitted is stored in *SIZEP.  An error message is
1918   returned, or NULL on OK.  */
1919
1920const char *
1921md_atof (int type, char *litP, int *sizeP)
1922{
1923  return ieee_md_atof (type, litP, sizeP, FALSE);
1924}
1925
1926int
1927md_pcrel_adjust (fragS *fragP)
1928{
1929  fragS *opcode_frag;
1930  addressT opcode_address;
1931  unsigned int offset;
1932
1933  opcode_frag = frag_opcode_frag (fragP);
1934  if (opcode_frag == 0)
1935    return 0;
1936
1937  offset = frag_opcode_offset (fragP);
1938  opcode_address = offset + opcode_frag->fr_address;
1939
1940  return fragP->fr_address + fragP->fr_fix - opcode_address;
1941}
1942
1943static int
1944md_fix_pcrel_adjust (fixS *fixP)
1945{
1946  fragS *opcode_frag;
1947  addressT opcode_address;
1948  unsigned int offset;
1949
1950  opcode_frag = fix_opcode_frag (fixP);
1951  if (opcode_frag == 0)
1952    return 0;
1953
1954  offset = fix_opcode_offset (fixP);
1955  opcode_address = offset + opcode_frag->fr_address;
1956
1957  return fixP->fx_where + fixP->fx_frag->fr_address - opcode_address;
1958}
1959
1960/* Apply a fixS (fixup of an instruction or data that we didn't have
1961   enough info to complete immediately) to the data in a frag.
1962
1963   On the ns32k, everything is in a different format, so we have broken
1964   out separate functions for each kind of thing we could be fixing.
1965   They all get called from here.  */
1966
1967void
1968md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
1969{
1970  long val = * (long *) valP;
1971  char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
1972
1973  if (fix_bit_fixP (fixP))
1974    /* Bitfields to fix, sigh.  */
1975    md_number_to_field (buf, val, fix_bit_fixP (fixP));
1976  else switch (fix_im_disp (fixP))
1977    {
1978    case 0:
1979      /* Immediate field.  */
1980      md_number_to_imm (buf, val, fixP->fx_size);
1981      break;
1982
1983    case 1:
1984      /* Displacement field.  */
1985      /* Calculate offset.  */
1986      md_number_to_disp (buf,
1987			 (fixP->fx_pcrel ? val + md_fix_pcrel_adjust (fixP)
1988			  : val), fixP->fx_size);
1989      break;
1990
1991    case 2:
1992      /* Pointer in a data object.  */
1993      md_number_to_chars (buf, val, fixP->fx_size);
1994      break;
1995    }
1996
1997  if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
1998    fixP->fx_done = 1;
1999}
2000
2001/* Convert a relaxed displacement to ditto in final output.  */
2002
2003void
2004md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
2005		 segT sec ATTRIBUTE_UNUSED,
2006		 fragS *fragP)
2007{
2008  long disp;
2009  long ext = 0;
2010  /* Address in gas core of the place to store the displacement.  */
2011  char *buffer_address = fragP->fr_fix + fragP->fr_literal;
2012  /* Address in object code of the displacement.  */
2013  int object_address;
2014
2015  switch (fragP->fr_subtype)
2016    {
2017    case IND (BRANCH, BYTE):
2018      ext = 1;
2019      break;
2020    case IND (BRANCH, WORD):
2021      ext = 2;
2022      break;
2023    case IND (BRANCH, DOUBLE):
2024      ext = 4;
2025      break;
2026    }
2027
2028  if (ext == 0)
2029    return;
2030
2031  know (fragP->fr_symbol);
2032
2033  object_address = fragP->fr_fix + fragP->fr_address;
2034
2035  /* The displacement of the address, from current location.  */
2036  disp = (S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset) - object_address;
2037  disp += md_pcrel_adjust (fragP);
2038
2039  md_number_to_disp (buffer_address, (long) disp, (int) ext);
2040  fragP->fr_fix += ext;
2041}
2042
2043/* This function returns the estimated size a variable object will occupy,
2044   one can say that we tries to guess the size of the objects before we
2045   actually know it.  */
2046
2047int
2048md_estimate_size_before_relax (fragS *fragP, segT segment)
2049{
2050  if (fragP->fr_subtype == IND (BRANCH, UNDEF))
2051    {
2052      if (S_GET_SEGMENT (fragP->fr_symbol) != segment)
2053	{
2054	  /* We don't relax symbols defined in another segment.  The
2055	     thing to do is to assume the object will occupy 4 bytes.  */
2056	  fix_new_ns32k (fragP,
2057			 (int) (fragP->fr_fix),
2058			 4,
2059			 fragP->fr_symbol,
2060			 fragP->fr_offset,
2061			 1,
2062			 1,
2063			 0,
2064			 frag_bsr(fragP), /* Sequent hack.  */
2065			 frag_opcode_frag (fragP),
2066			 frag_opcode_offset (fragP));
2067	  fragP->fr_fix += 4;
2068	  frag_wane (fragP);
2069	  return 4;
2070	}
2071
2072      /* Relaxable case.  Set up the initial guess for the variable
2073	 part of the frag.  */
2074      fragP->fr_subtype = IND (BRANCH, BYTE);
2075    }
2076
2077  if (fragP->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
2078    abort ();
2079
2080  /* Return the size of the variable part of the frag.  */
2081  return md_relax_table[fragP->fr_subtype].rlx_length;
2082}
2083
2084int md_short_jump_size = 3;
2085int md_long_jump_size = 5;
2086
2087void
2088md_create_short_jump (char *ptr,
2089		      addressT from_addr,
2090		      addressT to_addr,
2091		      fragS *frag ATTRIBUTE_UNUSED,
2092		      symbolS *to_symbol ATTRIBUTE_UNUSED)
2093{
2094  valueT offset;
2095
2096  offset = to_addr - from_addr;
2097  md_number_to_chars (ptr, (valueT) 0xEA, 1);
2098  md_number_to_disp (ptr + 1, (valueT) offset, 2);
2099}
2100
2101void
2102md_create_long_jump (char *ptr,
2103		     addressT from_addr,
2104		     addressT to_addr,
2105		     fragS *frag ATTRIBUTE_UNUSED,
2106		     symbolS *to_symbol ATTRIBUTE_UNUSED)
2107{
2108  valueT offset;
2109
2110  offset = to_addr - from_addr;
2111  md_number_to_chars (ptr, (valueT) 0xEA, 1);
2112  md_number_to_disp (ptr + 1, (valueT) offset, 4);
2113}
2114
2115const char *md_shortopts = "m:";
2116
2117struct option md_longopts[] =
2118{
2119#define OPTION_DISP_SIZE (OPTION_MD_BASE)
2120  {"disp-size-default", required_argument , NULL, OPTION_DISP_SIZE},
2121  {NULL, no_argument, NULL, 0}
2122};
2123
2124size_t md_longopts_size = sizeof (md_longopts);
2125
2126int
2127md_parse_option (int c, const char *arg)
2128{
2129  switch (c)
2130    {
2131    case 'm':
2132      if (!strcmp (arg, "32032"))
2133	{
2134	  cpureg = cpureg_032;
2135	  mmureg = mmureg_032;
2136	}
2137      else if (!strcmp (arg, "32532"))
2138	{
2139	  cpureg = cpureg_532;
2140	  mmureg = mmureg_532;
2141	}
2142      else
2143	{
2144	  as_warn (_("invalid architecture option -m%s, ignored"), arg);
2145	  return 0;
2146	}
2147      break;
2148    case OPTION_DISP_SIZE:
2149      {
2150	int size = atoi(arg);
2151	switch (size)
2152	  {
2153	  case 1: case 2: case 4:
2154	    default_disp_size = size;
2155	    break;
2156	  default:
2157	    as_warn (_("invalid default displacement size \"%s\". Defaulting to %d."),
2158		     arg, default_disp_size);
2159	  }
2160	break;
2161      }
2162
2163    default:
2164      return 0;
2165    }
2166
2167  return 1;
2168}
2169
2170void
2171md_show_usage (FILE *stream)
2172{
2173  fprintf (stream, _("\
2174NS32K options:\n\
2175-m32032 | -m32532	select variant of NS32K architecture\n\
2176--disp-size-default=<1|2|4>\n"));
2177}
2178
2179/* This is TC_CONS_FIX_NEW, called by emit_expr in read.c.  */
2180
2181void
2182cons_fix_new_ns32k (fragS *frag,	/* Which frag? */
2183		    int where,		/* Where in that frag? */
2184		    int size,		/* 1, 2  or 4 usually.  */
2185		    expressionS *exp,	/* Expression.  */
2186		    bfd_reloc_code_real_type r ATTRIBUTE_UNUSED)
2187{
2188  fix_new_ns32k_exp (frag, where, size, exp,
2189		     0, 2, 0, 0, 0, 0);
2190}
2191
2192/* We have no need to default values of symbols.  */
2193
2194symbolS *
2195md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2196{
2197  return 0;
2198}
2199
2200/* Round up a section size to the appropriate boundary.  */
2201
2202valueT
2203md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
2204{
2205  return size;			/* Byte alignment is fine.  */
2206}
2207
2208/* Exactly what point is a PC-relative offset relative TO?  On the
2209   ns32k, they're relative to the start of the instruction.  */
2210
2211long
2212md_pcrel_from (fixS *fixP)
2213{
2214  long res;
2215
2216  res = fixP->fx_where + fixP->fx_frag->fr_address;
2217#ifdef SEQUENT_COMPATABILITY
2218  if (frag_bsr (fixP->fx_frag))
2219    res += 0x12			/* FOO Kludge alert!  */
2220#endif
2221      return res;
2222}
2223
2224arelent *
2225tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2226{
2227  arelent *rel;
2228  bfd_reloc_code_real_type code;
2229
2230  code = reloc (fixp->fx_size, fixp->fx_pcrel, fix_im_disp (fixp));
2231
2232  rel = XNEW (arelent);
2233  rel->sym_ptr_ptr = XNEW (asymbol *);
2234  *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2235  rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2236  if (fixp->fx_pcrel)
2237    rel->addend = fixp->fx_addnumber;
2238  else
2239    rel->addend = 0;
2240
2241  rel->howto = bfd_reloc_type_lookup (stdoutput, code);
2242  if (!rel->howto)
2243    {
2244      const char *name;
2245
2246      name = S_GET_NAME (fixp->fx_addsy);
2247      if (name == NULL)
2248	name = _("<unknown>");
2249      as_fatal (_("Cannot find relocation type for symbol %s, code %d"),
2250		name, (int) code);
2251    }
2252
2253  return rel;
2254}
2255