aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1995-11-09 01:01:44 +0000
committerIan Lance Taylor <ian@airs.com>1995-11-09 01:01:44 +0000
commit6a649eda40ae1e08ee555950d96f613ee2bb5dec (patch)
treef456aa328cd5b402006ac08347ad973443c2d85e /gas/config
parent3b168da47916c715d8ab67b1e6f2b6bf5de1a153 (diff)
downloadgdb-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.c71
-rw-r--r--gas/config/tc-a29k.h2
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 */