Add code to support FR30 instrucitons which contain a colon in their mnemonic

This commit is contained in:
Nick Clifton
1998-11-12 18:55:57 +00:00
parent 78cec885d7
commit 5ed0e368c6
3 changed files with 80 additions and 0 deletions

View File

@ -1,3 +1,10 @@
Thu Nov 12 10:54:16 1998 Nick Clifton <nickc@cygnus.com>
* config/tc-fr30.c (fr30_is_label_start): New function: Handle
FR30 instructions which contain a colon in the mnemonic.
* config/tc-fr30.h (TC_START_LABEL): Define this macro.
start-sanitize-fr30 start-sanitize-fr30
Wed Nov 11 09:58:21 1998 Nick Clifton <nickc@cygnus.com> Wed Nov 11 09:58:21 1998 Nick Clifton <nickc@cygnus.com>

View File

@ -557,3 +557,65 @@ md_atof (type, litP, sizeP)
return 0; return 0;
} }
/* Determines if the symbol starting at START and ending in
a colon that was at the location pointed to by INPUT_LINE_POINTER
(but which has now been replaced bu a NUL) is in fact an
LDI:8, LDI:20 or LDI:32 instruction. If it is, then it
restores the colon, adbvances INPUT_LINE_POINTER to the real end
of the instruction/symbol, and returns the character that really
terminated the symbol. Otherwise it returns 0. */
char
fr30_is_label_start (start)
char * start;
{
char * i_l_p = input_line_pointer;
char c;
/* Check to see if the symbol parsed so far is 'ldi' */
if ( (start[0] != 'l' && start[0] != 'L')
|| (start[1] != 'd' && start[1] != 'D')
|| (start[2] != 'i' && start[2] != 'I')
|| start[3] != 0)
return 0;
/* Check to see if the text following the colon is '8' */
if (i_l_p[1] == '8' && (i_l_p[2] == ' ' || i_l_p[2] == '\t'))
{
/* Restore the colon, and advance input_line_pointer to
the end of the new symbol. */
* i_l_p = ':';
input_line_pointer += 2;
c = * input_line_pointer;
* input_line_pointer = 0;
return c;
}
/* Check to see if the text following the colon is '20' */
if (i_l_p[1] == '2' && i_l_p[2] =='0' && (i_l_p[3] == ' ' || i_l_p[3] == '\t'))
{
/* Restore the colon, and advance input_line_pointer to
the end of the new symbol. */
* i_l_p = ':';
input_line_pointer += 3;
c = * input_line_pointer;
* input_line_pointer = 0;
return c;
}
/* Check to see if the text following the colon is '32' */
if (i_l_p[1] == '3' && i_l_p[2] =='2' && (i_l_p[3] == ' ' || i_l_p[3] == '\t'))
{
/* Restore the colon, and advance input_line_pointer to
the end of the new symbol. */
* i_l_p = ':';
input_line_pointer += 3;
c = * input_line_pointer;
* input_line_pointer = 0;
return c;
}
return 0;
}

View File

@ -73,3 +73,14 @@ extern long md_pcrel_from_section PARAMS ((struct fix *, segT));
#define TC_GENERIC_RELAX_TABLE md_relax_table #define TC_GENERIC_RELAX_TABLE md_relax_table
extern const struct relax_type md_relax_table[]; extern const struct relax_type md_relax_table[];
/* We need a special version of the TC_START_LABEL macro so that we
allow the LDI:8, LDI:20 and LDI:32 instructions to be parsed as
such. Note - in a HORRIBLE HACK, we make use of the knowledge that
this marco is only ever evaluated in one place (read_a_source_file
in read.c) where we can access the local variable 's' - the start
of the symbol that was terminated by 'character'. Also we need to
be able to change the contents of the local variable 'c' which is
passed to this macro as 'character'. */
#define TC_START_LABEL(character, i_l_p) \
((character) != ':' ? 0 : (character = fr30_is_label_start (s)) ? 0 : ((character = ':'), 1))
extern char fr30_is_label_start PARAMS ((char *));