diff options
author | Ian Lance Taylor <ian@airs.com> | 1995-11-09 01:01:44 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1995-11-09 01:01:44 +0000 |
commit | 6a649eda40ae1e08ee555950d96f613ee2bb5dec (patch) | |
tree | f456aa328cd5b402006ac08347ad973443c2d85e /gas/config | |
parent | 3b168da47916c715d8ab67b1e6f2b6bf5de1a153 (diff) | |
download | gdb-6a649eda40ae1e08ee555950d96f613ee2bb5dec.zip gdb-6a649eda40ae1e08ee555950d96f613ee2bb5dec.tar.gz gdb-6a649eda40ae1e08ee555950d96f613ee2bb5dec.tar.bz2 |
* config/tc-a29k.c (md_operand): Handle $float, $double, and
$extend. Based on code from Eric Freudenthal
<freudenthal@nyu.edu>.
* config/tc-a29k.h (LEX_DOLLAR): Define.
* read.c (LEX_DOLLAR): Define if not defined.
(lex_type): Use LEX_DOLLAR.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-a29k.c | 71 | ||||
-rw-r--r-- | gas/config/tc-a29k.h | 2 |
2 files changed, 73 insertions, 0 deletions
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 */ |