/* ns32k.c -- Assemble on the National Semiconductor 32k series
Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2005
+ 2001, 2002, 2003, 2005, 2006, 2007
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
+ the Free Software Foundation; either version 3, or (at your option)
any later version.
GAS is distributed in the hope that it will be useful,
You should have received a copy of the GNU General Public License
along with GAS; see the file COPYING. If not, write to the Free
- Software Foundation, 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+ 02110-1301, USA. */
/*#define SHOW_NUM 1*//* Uncomment for debugging. */
-#include <stdio.h>
-
#include "as.h"
#include "opcode/ns32k.h"
{
bit_fixS *bit_fixP;
- bit_fixP = (bit_fixS *) obstack_alloc (¬es, sizeof (bit_fixS));
+ bit_fixP = obstack_alloc (¬es, sizeof (bit_fixS));
bit_fixP->fx_bit_size = size;
bit_fixP->fx_bit_offset = offset;
return recursive_level;
}
\f
-#ifdef BFD_ASSEMBLER
/* This functionality should really be in the bfd library. */
static bfd_reloc_code_real_type
return BFD_RELOC_NONE;
}
-#endif
static void
fix_new_ns32k (fragS *frag, /* Which frag? */
{
fixS *fixP = fix_new (frag, where, size, add_symbol,
offset, pcrel,
-#ifdef BFD_ASSEMBLER
bit_fixP ? NO_RELOC : reloc (size, pcrel, im_disp)
-#else
- NO_RELOC
-#endif
);
fix_opcode_frag (fixP) = opcode_frag;
unsigned int opcode_offset)
{
fixS *fixP = fix_new_exp (frag, where, size, exp, pcrel,
-#ifdef BFD_ASSEMBLER
bit_fixP ? NO_RELOC : reloc (size, pcrel, im_disp)
-#else
- NO_RELOC
-#endif
);
fix_opcode_frag (fixP) = opcode_frag;
size = 4;
else
{
- as_bad (_("Displacement to large for :d"));
+ as_bad (_("Displacement too large for :d"));
size = 4;
}
}
freeptr_static = (char *) malloc (PRIVATE_SIZE);
}
-/* Must be equal to MAX_PRECISON in atof-ieee.c. */
-#define MAX_LITTLENUMS 6
-
/* Turn the string pointed to by litP into a floating point constant
of type TYPE, and emit the appropriate bytes. The number of
LITTLENUMS emitted is stored in *SIZEP. An error message is
char *
md_atof (int type, char *litP, int *sizeP)
{
- int prec;
- LITTLENUM_TYPE words[MAX_LITTLENUMS];
- LITTLENUM_TYPE *wordP;
- char *t;
-
- switch (type)
- {
- case 'f':
- prec = 2;
- break;
-
- case 'd':
- prec = 4;
- break;
- default:
- *sizeP = 0;
- return _("Bad call to MD_ATOF()");
- }
-
- t = atof_ieee (input_line_pointer, type, words);
- if (t)
- input_line_pointer = t;
-
- *sizeP = prec * sizeof (LITTLENUM_TYPE);
-
- for (wordP = words + prec; prec--;)
- {
- md_number_to_chars (litP, (long) (*--wordP), sizeof (LITTLENUM_TYPE));
- litP += sizeof (LITTLENUM_TYPE);
- }
-
- return 0;
+ return ieee_md_atof (type, litP, sizeP, FALSE);
}
\f
int
They all get called from here. */
void
-md_apply_fix3 (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
+md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
{
long val = * (long *) valP;
char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
\f
/* Convert a relaxed displacement to ditto in final output. */
-#ifndef BFD_ASSEMBLER
-void
-md_convert_frag (object_headers *headers,
- segT sec,
- fragS *fragP)
-#else
void
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
segT sec ATTRIBUTE_UNUSED,
fragS *fragP)
-#endif
{
long disp;
long ext = 0;
int md_short_jump_size = 3;
int md_long_jump_size = 5;
-const int md_reloc_size = 8; /* Size of relocation record. */
void
md_create_short_jump (char *ptr,
return res;
}
-#ifdef BFD_ASSEMBLER
-
arelent *
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
{
return rel;
}
-#else /* BFD_ASSEMBLER */
-
-#ifdef OBJ_AOUT
-void
-cons_fix_new_ns32k (char *where,
- struct fix *fixP,
- relax_addressT segment_address_in_file)
-{
- /* In: Length of relocation (or of address) in chars: 1, 2 or 4.
- Out: GNU LD relocation length code: 0, 1, or 2. */
-
- static unsigned char nbytes_r_length[] = { 42, 0, 1, 42, 2 };
- long r_symbolnum;
-
- know (fixP->fx_addsy != NULL);
-
- md_number_to_chars (where,
- fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file,
- 4);
-
- r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy)
- ? S_GET_TYPE (fixP->fx_addsy)
- : fixP->fx_addsy->sy_number);
-
- md_number_to_chars (where + 4,
- ((long) (r_symbolnum)
- | (long) (fixP->fx_pcrel << 24)
- | (long) (nbytes_r_length[fixP->fx_size] << 25)
- | (long) ((!S_IS_DEFINED (fixP->fx_addsy)) << 27)
- | (long) (fix_bsr (fixP) << 28)
- | (long) (fix_im_disp (fixP) << 29)),
- 4);
-}
-
-#endif /* OBJ_AOUT */
-#endif /* BFD_ASSEMBLER */