From 8eb86ab78d19cc9e97b09cd6107397221552817d Mon Sep 17 00:00:00 2001 From: Thomas Preud'homme Date: Thu, 6 May 2010 02:19:00 +0200 Subject: [PATCH] Add nan, snan and inf float constants --- tccgen.c | 25 +++++++++++++++++++++++++ tcctok.h | 9 +++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/tccgen.c b/tccgen.c index 6c8faa6b..bf171fb5 100644 --- a/tccgen.c +++ b/tccgen.c @@ -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; diff --git a/tcctok.h b/tcctok.h index 02ac7679..28c4236a 100644 --- a/tcctok.h +++ b/tcctok.h @@ -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") -- 2.11.4.GIT