Add nan, snan and inf float constants

master
Thomas Preud'homme 2010-05-06 02:19:00 +02:00
parent 2220467fcf
commit 8eb86ab78d
2 changed files with 32 additions and 2 deletions

View File

@ -310,6 +310,16 @@ static void vpushll(long long v)
vsetc(&ctype, VT_CONST, &cval);
}
/* push arbitrary 64bit constant */
void vpush64(int ty, unsigned long long v)
{
CValue cval;
CType ctype;
ctype.t = ty;
cval.ull = v;
vsetc(&ctype, VT_CONST, &cval);
}
/* Return a static symbol pointing to a section */
ST_FUNC Sym *get_sym_ref(CType *type, Section *sec, unsigned long offset, unsigned long size)
{
@ -3535,6 +3545,21 @@ ST_FUNC void unary(void)
vtop->sym = s;
next();
break;
// special qnan , snan and infinity values
case TOK___NAN__:
vpush64(VT_DOUBLE, 0x7ff8000000000000);
next();
break;
case TOK___SNAN__:
vpush64(VT_DOUBLE, 0x7ff0000000000001);
next();
break;
case TOK___INF__:
vpush64(VT_DOUBLE, 0x7ff0000000000000);
next();
break;
default:
tok_identifier:
t = tok;

View File

@ -81,10 +81,15 @@
DEF(TOK___TIME__, "__TIME__")
DEF(TOK___FUNCTION__, "__FUNCTION__")
DEF(TOK___VA_ARGS__, "__VA_ARGS__")
/* special identifiers */
DEF(TOK___FUNC__, "__func__")
/* special floating point values */
DEF(TOK___NAN__, "__nan__")
DEF(TOK___SNAN__, "__snan__")
DEF(TOK___INF__, "__inf__")
/* attribute identifiers */
/* XXX: handle all tokens generically since speed is not critical */
DEF(TOK_SECTION1, "section")