cpplib.h (CPP_N_WIDTH_MD, [...]): Add new constants.

libcpp/ChangeLog:

	* include/cpplib.h (CPP_N_WIDTH_MD, CPP_N_MD_W, CPP_N_MD_Q):
	Add new constants.
	* expr.c (interpret_float_suffix): Process 'w', 'W', 'q' and 'Q'
	suffixes.  Return CPP_N_MD_W for 'w' or 'W' suffixes and CPP_N_MD_Q
	for 'q' or 'Q' suffixes.

gcc/ChangeLog:

	* targhooks.h (default_mode_for_suffix): New function declaration.
	* targhooks.c (default_mode_for_suffix): New default target hook.
	* target.h (struct c): New structure in the targetm struct.
	(mode_for_suffix): New target hook as part of struct c.
	target-def.h (TARGET_C_MODE_FOR_SUFFIX): Define as
	default_mode_for_suffix.
	(TARGET_C): New define.
	* c-lex.c: Include "target.h".
	(interpret_float): Use targetm.c.mode_for_suffix to determine
	the mode for a given non-standard suffix.
	Makefile.in (c-lex.o): Depend on $(TARGET_H).

	* config/i386/i386.c (ix86_c_mode_for_suffix): New static function.
	(TARGET_C_MODE_FOR_SUFFIX): Define to ix86_c_mode_for_suffix.

	* doc/extend.texi (Floating Types): New node.  Document __float80 and
	__float128 types.  Document 'w', 'W', 'q' and 'Q' suffixes.

testsuite/ChangeLog:

	* gcc.dg/const-float80.c : New test.
	* gcc.dg/const-float128.c : New test.
	* gcc.dg/const-float80-ped.c : New test.
	* gcc.dg/const-float128-ped.c : New test.

From-SVN: r126244
This commit is contained in:
Uros Bizjak
2007-07-03 07:53:58 +02:00
committed by Uros Bizjak
parent 1ed50f7194
commit c77cd3d140
17 changed files with 182 additions and 7 deletions

View File

@@ -82,7 +82,9 @@ static void check_promotion (cpp_reader *, const struct op *);
static unsigned int
interpret_float_suffix (const uchar *s, size_t len)
{
size_t f = 0, l = 0, i = 0, d = 0;
size_t f, l, w, q, i, d;
f = l = w = q = i = d = 0;
while (len--)
switch (s[len])
@@ -97,6 +99,16 @@ interpret_float_suffix (const uchar *s, size_t len)
return 0;
l++;
break;
case 'w': case 'W':
if (d > 0)
return 0;
w++;
break;
case 'q': case 'Q':
if (d > 0)
return 0;
q++;
break;
case 'i': case 'I':
case 'j': case 'J': i++; break;
case 'd': case 'D': d++; break;
@@ -104,7 +116,7 @@ interpret_float_suffix (const uchar *s, size_t len)
return 0;
}
if (f + l > 1 || i > 1)
if (f + l + w + q > 1 || i > 1)
return 0;
/* Allow dd, df, dl suffixes for decimal float constants. */
@@ -113,7 +125,9 @@ interpret_float_suffix (const uchar *s, size_t len)
return ((i ? CPP_N_IMAGINARY : 0)
| (f ? CPP_N_SMALL :
l ? CPP_N_LARGE : CPP_N_MEDIUM)
l ? CPP_N_LARGE :
w ? CPP_N_MD_W :
q ? CPP_N_MD_Q : CPP_N_MEDIUM)
| (d ? CPP_N_DFLOAT : 0));
}