/* ns32k.c -- Assemble on the National Semiconductor 32k series
- Copyright (C) 1987-2016 Free Software Foundation, Inc.
+ Copyright (C) 1987-2021 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
typedef struct addr_mode addr_modeS;
char *freeptr, *freeptr_static; /* Points at some number of free bytes. */
-struct hash_control *inst_hash_handle;
+htab_t inst_hash_handle;
struct ns32k_opcode *desc; /* Pointer at description of instruction. */
addr_modeS addr_modeP;
10 implied1
11 implied2
- For every entry there is a datalength in bytes. This is stored in size[n].
- 0, the objectlength is not explicitly given by the instruction
+ For every entry there is a data length in bytes. This is stored in size[n].
+ 0, the object length is not explicitly given by the instruction
and the operand is undefined. This is a case for relaxation.
Reserve 4 bytes for the final object.
The low-order-byte corresponds to low physical memory.
Obviously a FRAGment must be created for each valid disp in PART whose
- datalength is undefined (to bad) .
+ data length is undefined (to bad) .
The case where just the expression is undefined is less severe and is
- handled by fix. Here the number of bytes in the objectfile is known.
+ handled by fix. Here the number of bytes in the object file is known.
With this representation we simplify the assembly and separates the
machine dependent/independent parts in a more clean way (said OE). */
\f
char disp_size[] =
{4, 1, 2, 0, 4};
\f
-/* Parse a general operand into an addressingmode struct
+/* Parse a general operand into an addressing mode struct
In: pointer at operand in ascii form
pointer at addr_mode struct for result
case 'e':
if (str[strl - 1] != ']')
{
- if ((!strncmp (str, "ext(", 4)) && strl > 7)
+ if ((startswith (str, "ext(")) && strl > 7)
{ /* external */
addrmodeP->disp[0] = str + 4;
i = 0;
default:
break;
}
- /* Drop through. */
+ /* Fall through. */
case 3:
- if (!strncmp (str, "tos", 3))
+ if (startswith (str, "tos"))
{
addrmodeP->mode = 23; /* TopOfStack */
return -1;
{
if (str[strl - 2] == ')')
{
- if (!strncmp (&str[strl - 5], "(fp", 3))
+ if (startswith (&str[strl - 5], "(fp"))
mode = 16; /* Memory Relative. */
- else if (!strncmp (&str[strl - 5], "(sp", 3))
+ else if (startswith (&str[strl - 5], "(sp"))
mode = 17;
- else if (!strncmp (&str[strl - 5], "(sb", 3))
+ else if (startswith (&str[strl - 5], "(sb"))
mode = 18;
if (mode != DEFAULT)
/* Fall through. */
default:
- if (!strncmp (&str[strl - 4], "(fp", 3))
+ if (startswith (&str[strl - 4], "(fp"))
mode = 24;
- else if (!strncmp (&str[strl - 4], "(sp", 3))
+ else if (startswith (&str[strl - 4], "(sp"))
mode = 25;
- else if (!strncmp (&str[strl - 4], "(sb", 3))
+ else if (startswith (&str[strl - 4], "(sb"))
mode = 26;
- else if (!strncmp (&str[strl - 4], "(pc", 3))
+ else if (startswith (&str[strl - 4], "(pc"))
mode = 27;
if (mode != DEFAULT)
addrmodeP->am_size += 1; /* scaled index byte. */
j = str[strl - 4] - '0'; /* store temporary. */
- str[strl - 6] = '\000'; /* nullterminate for recursive call. */
+ str[strl - 6] = '\000'; /* null terminate for recursive call. */
i = addr_mode (str, addrmodeP, 1);
if (!i || addrmodeP->mode == 20)
if ((tmp = addrmodeP->scaled_reg))
{ /* Build indexbyte. */
tmp--; /* Remember regnumber comes incremented for
- flagpurpose. */
+ flag purpose. */
tmp |= addrmodeP->scaled_mode << 3;
addrmodeP->index_byte = (char) tmp;
addrmodeP->am_size += 1;
return addrmodeP->mode;
}
-/* Read an optionlist. */
+/* Read an option list. */
static void
optlist (char *str, /* The string to extract options from. */
switch ((d = operandsP[(loop << 1) + 1]))
{
case 'f': /* Operand of sfsr turns out to be a nasty
- specialcase. */
+ special-case. */
opcode_bit_ptr -= 5;
/* Fall through. */
case 'Z': /* Float not immediate. */
opcode_bit_ptr -= 3;
iif.iifP[1].object |= tmp << opcode_bit_ptr;
break;
- case 'O': /* Setcfg instruction optionslist. */
+ case 'O': /* Setcfg instruction options list. */
optlist (argv[i], opt3, &tmp);
opcode_bit_ptr -= 4;
iif.iifP[1].object |= tmp << 15;
break;
- case 'C': /* Cinv instruction optionslist. */
+ case 'C': /* Cinv instruction options list. */
optlist (argv[i], opt4, &tmp);
opcode_bit_ptr -= 4;
iif.iifP[1].object |= tmp << 15; /* Insert the regtype in opcode. */
c = *lineptr;
*(char *) lineptr = '\0';
- if (!(desc = (struct ns32k_opcode *) hash_find (inst_hash_handle, line)))
+ desc = (struct ns32k_opcode *) str_hash_find (inst_hash_handle, line);
+ if (!desc)
as_fatal (_("No such opcode"));
*(char *) lineptr = c;
fix_bsr (fixP) = bsr;
fix_bit_fixP (fixP) = bit_fixP;
/* We have a MD overflow check for displacements. */
- fixP->fx_no_overflow = (im_disp != 0);
+ fixP->fx_no_overflow = im_disp != 0 || bit_fixP != NULL;
}
static void
fix_bsr (fixP) = bsr;
fix_bit_fixP (fixP) = bit_fixP;
/* We have a MD overflow check for displacements. */
- fixP->fx_no_overflow = (im_disp != 0);
+ fixP->fx_no_overflow = im_disp != 0 || bit_fixP != NULL;
}
/* Convert number to chars in correct order. */
number_to_chars_littleendian (buf, value, nbytes);
}
-/* This is a variant of md_numbers_to_chars. The reason for its'
+/* This is a variant of md_numbers_to_chars. The reason for its
existence is the fact that ns32k uses Huffman coded
displacements. This implies that the bit order is reversed in
displacements and that they are prefixed with a size-tag.
break;
default:
- as_fatal (_("Internal logic error. line %d, file \"%s\""),
+ as_fatal (_("Internal logic error. Line %d, file: \"%s\""),
__LINE__, __FILE__);
}
}
{
/* Build a hashtable of the instructions. */
const struct ns32k_opcode *ptr;
- const char *status;
const struct ns32k_opcode *endop;
- inst_hash_handle = hash_new ();
+ inst_hash_handle = str_htab_create ();
endop = ns32k_opcodes + sizeof (ns32k_opcodes) / sizeof (ns32k_opcodes[0]);
for (ptr = ns32k_opcodes; ptr < endop; ptr++)
- {
- if ((status = hash_insert (inst_hash_handle, ptr->name, (char *) ptr)))
- /* Fatal. */
- as_fatal (_("Can't hash %s: %s"), ptr->name, status);
- }
+ if (str_hash_insert (inst_hash_handle, ptr->name, ptr, 0) != NULL)
+ as_fatal (_("duplicate %s"), ptr->name);
/* Some private space please! */
freeptr_static = XNEWVEC (char, PRIVATE_SIZE);
const char *
md_atof (int type, char *litP, int *sizeP)
{
- return ieee_md_atof (type, litP, sizeP, FALSE);
+ return ieee_md_atof (type, litP, sizeP, false);
}
\f
int