From 6a649eda40ae1e08ee555950d96f613ee2bb5dec Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 9 Nov 1995 01:01:44 +0000 Subject: * config/tc-a29k.c (md_operand): Handle $float, $double, and $extend. Based on code from Eric Freudenthal . * config/tc-a29k.h (LEX_DOLLAR): Define. * read.c (LEX_DOLLAR): Define if not defined. (lex_type): Use LEX_DOLLAR. --- gas/ChangeLog | 9 +++++++ gas/config/tc-a29k.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ gas/config/tc-a29k.h | 2 ++ 3 files changed, 82 insertions(+) (limited to 'gas') diff --git a/gas/ChangeLog b/gas/ChangeLog index d32872d..d939a07 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +Wed Nov 8 19:59:36 1995 Ian Lance Taylor + + * config/tc-a29k.c (md_operand): Handle $float, $double, and + $extend. Based on code from Eric Freudenthal + . + * config/tc-a29k.h (LEX_DOLLAR): Define. + * read.c (LEX_DOLLAR): Define if not defined. + (lex_type): Use LEX_DOLLAR. + Wed Nov 8 16:38:14 1995 Eric Freudenthal * configure.in (a29k-nyu-sym1): New target, just like other a29k diff --git a/gas/config/tc-a29k.c b/gas/config/tc-a29k.c index 96b13d9..6da39d0 100644 --- a/gas/config/tc-a29k.c +++ b/gas/config/tc-a29k.c @@ -1148,6 +1148,77 @@ md_operand (expressionP) else expressionP->X_op = O_constant; } + else if (input_line_pointer[0] == '$') + { + char *s; + char type; + int fieldnum, fieldlimit; + LITTLENUM_TYPE floatbuf[8]; + + /* $float(), $doubleN(), or $extendN() convert floating values + to integers. */ + + s = input_line_pointer; + + ++s; + + fieldnum = 0; + if (strncmp (s, "double", sizeof "double" - 1) == 0) + { + s += sizeof "double" - 1; + type = 'd'; + fieldlimit = 2; + } + else if (strncmp (s, "float", sizeof "float" - 1) == 0) + { + s += sizeof "float" - 1; + type = 'f'; + fieldlimit = 1; + } + else if (strncmp (s, "extend", sizeof "extend" - 1) == 0) + { + s += sizeof "extend" - 1; + type = 'x'; + fieldlimit = 4; + } + else + { + /* FIXME: We should handle a29k local labels here. */ + return; + } + + if (isdigit (*s)) + { + fieldnum = *s - '0'; + ++s; + } + if (fieldnum >= fieldlimit) + return; + + SKIP_WHITESPACE (); + if (*s != '(') + return; + ++s; + SKIP_WHITESPACE (); + + s = atof_ieee (s, type, floatbuf); + if (s == NULL) + return; + s = s; + + SKIP_WHITESPACE (); + if (*s != ')') + return; + ++s; + SKIP_WHITESPACE (); + + input_line_pointer = s; + expressionP->X_op = O_constant; + expressionP->X_unsigned = 1; + expressionP->X_add_number = ((floatbuf[fieldnum * 2] + << LITTLENUM_NUMBER_OF_BITS) + + floatbuf[fieldnum * 2 + 1]); + } } /* Round up a section size to the appropriate boundary. */ diff --git a/gas/config/tc-a29k.h b/gas/config/tc-a29k.h index 5f4f2b2..1c36f07 100644 --- a/gas/config/tc-a29k.h +++ b/gas/config/tc-a29k.h @@ -21,6 +21,8 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307 #define TARGET_BYTES_BIG_ENDIAN 1 +#define LEX_DOLLAR 1 + #define tc_headers_hook(a) ; /* not used */ #define tc_headers_hook(a) ; /* not used */ #define tc_crawl_symbol_chain(a) ; /* not used */ -- cgit v1.1