#include "coretypes.h"
#include "tm.h"
#include "real.h"
+#include "fixed-value.h"
#include "c-pretty-print.h"
#include "c-tree.h"
#include "tree-iterator.h"
case BOOLEAN_TYPE:
case INTEGER_TYPE:
case REAL_TYPE:
+ case FIXED_POINT_TYPE:
if (TYPE_NAME (t))
{
t = TYPE_NAME (t);
else
{
int prec = TYPE_PRECISION (t);
- t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
+ if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (t)))
+ t = c_common_type_for_mode (TYPE_MODE (t), TYPE_SATURATING (t));
+ else
+ t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
if (TYPE_NAME (t))
{
pp_c_type_specifier (pp, t);
case REAL_TYPE:
pp_string (pp, "<unnamed-float:");
break;
+ case FIXED_POINT_TYPE:
+ pp_string (pp, "<unnamed-fixed:");
+ break;
default:
gcc_unreachable ();
}
case BOOLEAN_TYPE:
case INTEGER_TYPE:
case REAL_TYPE:
+ case FIXED_POINT_TYPE:
case ENUMERAL_TYPE:
case RECORD_TYPE:
case UNION_TYPE:
case INTEGER_TYPE:
case REAL_TYPE:
+ case FIXED_POINT_TYPE:
case ENUMERAL_TYPE:
case UNION_TYPE:
case RECORD_TYPE:
{
case INTEGER_TYPE:
case REAL_TYPE:
+ case FIXED_POINT_TYPE:
case ENUMERAL_TYPE:
case UNION_TYPE:
case RECORD_TYPE:
pp_string (pp, "df");
}
+/* Print out a FIXED value as a decimal-floating-constant. */
+
+static void
+pp_c_fixed_constant (c_pretty_printer *pp, tree r)
+{
+ fixed_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_FIXED_CST (r),
+ sizeof (pp_buffer (pp)->digit_buffer));
+ pp_string (pp, pp_buffer(pp)->digit_buffer);
+}
+
/* Pretty-print a compound literal expression. GNU extensions include
vector constants. */
/* constant:
integer-constant
floating-constant
+ fixed-point-constant
enumeration-constant
character-constant */
pp_c_floating_constant (pp, e);
break;
+ case FIXED_CST:
+ pp_c_fixed_constant (pp, e);
+ break;
+
case STRING_CST:
pp_c_string_literal (pp, e);
break;
case INTEGER_CST:
case REAL_CST:
+ case FIXED_CST:
case STRING_CST:
pp_c_constant (pp, e);
break;
enum tree_code code = TREE_CODE (e);
switch (code)
{
+ case POINTER_PLUS_EXPR:
case PLUS_EXPR:
case MINUS_EXPR:
pp_c_additive_expression (pp, TREE_OPERAND (e, 0));
pp_c_whitespace (pp);
- if (code == PLUS_EXPR)
+ if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
pp_plus (pp);
else
pp_minus (pp);
pp_c_floating_constant (pp, e);
break;
+ case FIXED_CST:
+ pp_c_fixed_constant (pp, e);
+ break;
+
case STRING_CST:
pp_c_string_literal (pp, e);
break;
pp_conditional_expression (pp, e);
break;
+ case POINTER_PLUS_EXPR:
case PLUS_EXPR:
case MINUS_EXPR:
pp_c_additive_expression (pp, e);