1 /* Utility routines for data type conversion for GNU C.
2 Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1997, 1998,
3 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 /* These routines are somewhat language-independent utility function
24 intended to be called by the language-specific convert () functions. */
28 #include "coretypes.h"
34 #include "langhooks.h"
36 /* Convert EXPR to some pointer or reference type TYPE.
38 EXPR must be pointer, reference, integer, enumeral, or literal zero;
39 in other cases error is called. */
42 convert_to_pointer (type
, expr
)
45 if (integer_zerop (expr
))
47 expr
= build_int_2 (0, 0);
48 TREE_TYPE (expr
) = type
;
52 switch (TREE_CODE (TREE_TYPE (expr
)))
56 return build1 (NOP_EXPR
, type
, expr
);
62 if (TYPE_PRECISION (TREE_TYPE (expr
)) == POINTER_SIZE
)
63 return build1 (CONVERT_EXPR
, type
, expr
);
66 convert_to_pointer (type
,
67 convert ((*lang_hooks
.types
.type_for_size
)
68 (POINTER_SIZE
, 0), expr
));
71 error ("cannot convert to a pointer type");
72 return convert_to_pointer (type
, integer_zero_node
);
76 /* Avoid any floating point extensions from EXP. */
78 strip_float_extensions (exp
)
83 /* For floating point constant look up the narrowest type that can hold
84 it properly and handle it like (type)(narrowest_type)constant.
85 This way we can optimize for instance a=a*2.0 where "a" is float
86 but 2.0 is double constant. */
87 if (TREE_CODE (exp
) == REAL_CST
)
92 orig
= TREE_REAL_CST (exp
);
93 if (TYPE_PRECISION (TREE_TYPE (exp
)) > TYPE_PRECISION (float_type_node
)
94 && exact_real_truncate (TYPE_MODE (float_type_node
), &orig
))
95 type
= float_type_node
;
96 else if (TYPE_PRECISION (TREE_TYPE (exp
))
97 > TYPE_PRECISION (double_type_node
)
98 && exact_real_truncate (TYPE_MODE (double_type_node
), &orig
))
99 type
= double_type_node
;
101 return build_real (type
, real_value_truncate (TYPE_MODE (type
), orig
));
104 if (TREE_CODE (exp
) != NOP_EXPR
)
107 sub
= TREE_OPERAND (exp
, 0);
108 subt
= TREE_TYPE (sub
);
109 expt
= TREE_TYPE (exp
);
111 if (!FLOAT_TYPE_P (subt
))
114 if (TYPE_PRECISION (subt
) > TYPE_PRECISION (expt
))
117 return strip_float_extensions (sub
);
121 /* Convert EXPR to some floating-point type TYPE.
123 EXPR must be float, integer, or enumeral;
124 in other cases error is called. */
127 convert_to_real (type
, expr
)
130 enum built_in_function fcode
= builtin_mathfn_code (expr
);
131 tree itype
= TREE_TYPE (expr
);
133 /* Disable until we figure out how to decide whether the functions are
134 present in runtime. */
135 /* Convert (float)sqrt((double)x) where x is float into sqrtf(x) */
137 && (fcode
== BUILT_IN_SQRT
138 || fcode
== BUILT_IN_SQRTL
139 || fcode
== BUILT_IN_SIN
140 || fcode
== BUILT_IN_SINL
141 || fcode
== BUILT_IN_COS
142 || fcode
== BUILT_IN_COSL
143 || fcode
== BUILT_IN_EXP
144 || fcode
== BUILT_IN_EXPL
145 || fcode
== BUILT_IN_LOG
146 || fcode
== BUILT_IN_LOGL
)
147 && (TYPE_MODE (type
) == TYPE_MODE (double_type_node
)
148 || TYPE_MODE (type
) == TYPE_MODE (float_type_node
)))
150 tree arg0
= strip_float_extensions (TREE_VALUE (TREE_OPERAND (expr
, 1)));
153 /* We have (outertype)sqrt((innertype)x). Choose the wider mode from
154 the both as the safe type for operation. */
155 if (TYPE_PRECISION (TREE_TYPE (arg0
)) > TYPE_PRECISION (type
))
156 newtype
= TREE_TYPE (arg0
);
158 /* Be curefull about integer to fp conversions.
159 These may overflow still. */
160 if (FLOAT_TYPE_P (TREE_TYPE (arg0
))
161 && TYPE_PRECISION (newtype
) < TYPE_PRECISION (itype
)
162 && (TYPE_MODE (newtype
) == TYPE_MODE (double_type_node
)
163 || TYPE_MODE (newtype
) == TYPE_MODE (float_type_node
)))
166 tree fn
= mathfn_built_in (newtype
, fcode
);
170 arglist
= build_tree_list (NULL_TREE
, fold (convert_to_real (newtype
, arg0
)));
171 expr
= build_function_call_expr (fn
, arglist
);
178 && (((fcode
== BUILT_IN_FLOORL
179 || fcode
== BUILT_IN_CEILL
180 || fcode
== BUILT_IN_ROUND
181 || fcode
== BUILT_IN_TRUNC
182 || fcode
== BUILT_IN_NEARBYINT
)
183 && (TYPE_MODE (type
) == TYPE_MODE (double_type_node
)
184 || TYPE_MODE (type
) == TYPE_MODE (float_type_node
)))
185 || ((fcode
== BUILT_IN_FLOOR
186 || fcode
== BUILT_IN_CEIL
187 || fcode
== BUILT_IN_ROUND
188 || fcode
== BUILT_IN_TRUNC
189 || fcode
== BUILT_IN_NEARBYINT
)
190 && (TYPE_MODE (type
) == TYPE_MODE (float_type_node
)))))
192 tree fn
= mathfn_built_in (type
, fcode
);
196 tree arg0
= strip_float_extensions (TREE_VALUE (TREE_OPERAND (expr
,
198 tree arglist
= build_tree_list (NULL_TREE
,
199 fold (convert_to_real (type
, arg0
)));
201 return build_function_call_expr (fn
, arglist
);
205 /* Propagate the cast into the operation. */
206 if (itype
!= type
&& FLOAT_TYPE_P (type
))
207 switch (TREE_CODE (expr
))
209 /* convert (float)-x into -(float)x. This is always safe. */
212 if (TYPE_PRECISION (type
) < TYPE_PRECISION (TREE_TYPE (expr
)))
213 return build1 (TREE_CODE (expr
), type
,
214 fold (convert_to_real (type
,
215 TREE_OPERAND (expr
, 0))));
217 /* convert (outertype)((innertype0)a+(innertype1)b)
218 into ((newtype)a+(newtype)b) where newtype
219 is the widest mode from all of these. */
225 tree arg0
= strip_float_extensions (TREE_OPERAND (expr
, 0));
226 tree arg1
= strip_float_extensions (TREE_OPERAND (expr
, 1));
228 if (FLOAT_TYPE_P (TREE_TYPE (arg0
))
229 && FLOAT_TYPE_P (TREE_TYPE (arg1
)))
232 if (TYPE_PRECISION (TREE_TYPE (arg0
)) > TYPE_PRECISION (newtype
))
233 newtype
= TREE_TYPE (arg0
);
234 if (TYPE_PRECISION (TREE_TYPE (arg1
)) > TYPE_PRECISION (newtype
))
235 newtype
= TREE_TYPE (arg1
);
236 if (TYPE_PRECISION (newtype
) < TYPE_PRECISION (itype
))
238 expr
= build (TREE_CODE (expr
), newtype
,
239 fold (convert_to_real (newtype
, arg0
)),
240 fold (convert_to_real (newtype
, arg1
)));
251 switch (TREE_CODE (TREE_TYPE (expr
)))
254 return build1 (flag_float_store
? CONVERT_EXPR
: NOP_EXPR
,
261 return build1 (FLOAT_EXPR
, type
, expr
);
264 return convert (type
,
265 fold (build1 (REALPART_EXPR
,
266 TREE_TYPE (TREE_TYPE (expr
)), expr
)));
270 error ("pointer value used where a floating point value was expected");
271 return convert_to_real (type
, integer_zero_node
);
274 error ("aggregate value used where a float was expected");
275 return convert_to_real (type
, integer_zero_node
);
279 /* Convert EXPR to some integer (or enum) type TYPE.
281 EXPR must be pointer, integer, discrete (enum, char, or bool), float, or
282 vector; in other cases error is called.
284 The result of this is always supposed to be a newly created tree node
285 not in use in any existing structure. */
288 convert_to_integer (type
, expr
)
291 enum tree_code ex_form
= TREE_CODE (expr
);
292 tree intype
= TREE_TYPE (expr
);
293 unsigned int inprec
= TYPE_PRECISION (intype
);
294 unsigned int outprec
= TYPE_PRECISION (type
);
296 /* An INTEGER_TYPE cannot be incomplete, but an ENUMERAL_TYPE can
297 be. Consider `enum E = { a, b = (enum E) 3 };'. */
298 if (!COMPLETE_TYPE_P (type
))
300 error ("conversion to incomplete type");
301 return error_mark_node
;
304 switch (TREE_CODE (intype
))
308 if (integer_zerop (expr
))
309 expr
= integer_zero_node
;
311 expr
= fold (build1 (CONVERT_EXPR
, (*lang_hooks
.types
.type_for_size
)
312 (POINTER_SIZE
, 0), expr
));
314 return convert_to_integer (type
, expr
);
320 /* If this is a logical operation, which just returns 0 or 1, we can
321 change the type of the expression. For some logical operations,
322 we must also change the types of the operands to maintain type
325 if (TREE_CODE_CLASS (ex_form
) == '<')
327 TREE_TYPE (expr
) = type
;
331 else if (ex_form
== TRUTH_AND_EXPR
|| ex_form
== TRUTH_ANDIF_EXPR
332 || ex_form
== TRUTH_OR_EXPR
|| ex_form
== TRUTH_ORIF_EXPR
333 || ex_form
== TRUTH_XOR_EXPR
)
335 TREE_OPERAND (expr
, 0) = convert (type
, TREE_OPERAND (expr
, 0));
336 TREE_OPERAND (expr
, 1) = convert (type
, TREE_OPERAND (expr
, 1));
337 TREE_TYPE (expr
) = type
;
341 else if (ex_form
== TRUTH_NOT_EXPR
)
343 TREE_OPERAND (expr
, 0) = convert (type
, TREE_OPERAND (expr
, 0));
344 TREE_TYPE (expr
) = type
;
348 /* If we are widening the type, put in an explicit conversion.
349 Similarly if we are not changing the width. After this, we know
350 we are truncating EXPR. */
352 else if (outprec
>= inprec
)
353 return build1 (NOP_EXPR
, type
, expr
);
355 /* If TYPE is an enumeral type or a type with a precision less
356 than the number of bits in its mode, do the conversion to the
357 type corresponding to its mode, then do a nop conversion
359 else if (TREE_CODE (type
) == ENUMERAL_TYPE
360 || outprec
!= GET_MODE_BITSIZE (TYPE_MODE (type
)))
361 return build1 (NOP_EXPR
, type
,
362 convert ((*lang_hooks
.types
.type_for_mode
)
363 (TYPE_MODE (type
), TREE_UNSIGNED (type
)),
366 /* Here detect when we can distribute the truncation down past some
367 arithmetic. For example, if adding two longs and converting to an
368 int, we can equally well convert both to ints and then add.
369 For the operations handled here, such truncation distribution
371 It is desirable in these cases:
372 1) when truncating down to full-word from a larger size
373 2) when truncating takes no work.
374 3) when at least one operand of the arithmetic has been extended
375 (as by C's default conversions). In this case we need two conversions
376 if we do the arithmetic as already requested, so we might as well
377 truncate both and then combine. Perhaps that way we need only one.
379 Note that in general we cannot do the arithmetic in a type
380 shorter than the desired result of conversion, even if the operands
381 are both extended from a shorter type, because they might overflow
382 if combined in that type. The exceptions to this--the times when
383 two narrow values can be combined in their narrow type even to
384 make a wider result--are handled by "shorten" in build_binary_op. */
389 /* We can pass truncation down through right shifting
390 when the shift count is a nonpositive constant. */
391 if (TREE_CODE (TREE_OPERAND (expr
, 1)) == INTEGER_CST
392 && tree_int_cst_lt (TREE_OPERAND (expr
, 1),
393 convert (TREE_TYPE (TREE_OPERAND (expr
, 1)),
399 /* We can pass truncation down through left shifting
400 when the shift count is a nonnegative constant and
401 the target type is unsigned. */
402 if (TREE_CODE (TREE_OPERAND (expr
, 1)) == INTEGER_CST
403 && tree_int_cst_sgn (TREE_OPERAND (expr
, 1)) >= 0
404 && TREE_UNSIGNED (type
)
405 && TREE_CODE (TYPE_SIZE (type
)) == INTEGER_CST
)
407 /* If shift count is less than the width of the truncated type,
409 if (tree_int_cst_lt (TREE_OPERAND (expr
, 1), TYPE_SIZE (type
)))
410 /* In this case, shifting is like multiplication. */
414 /* If it is >= that width, result is zero.
415 Handling this with trunc1 would give the wrong result:
416 (int) ((long long) a << 32) is well defined (as 0)
417 but (int) a << 32 is undefined and would get a
420 tree t
= convert_to_integer (type
, integer_zero_node
);
422 /* If the original expression had side-effects, we must
424 if (TREE_SIDE_EFFECTS (expr
))
425 return build (COMPOUND_EXPR
, type
, expr
, t
);
436 tree arg0
= get_unwidened (TREE_OPERAND (expr
, 0), type
);
437 tree arg1
= get_unwidened (TREE_OPERAND (expr
, 1), type
);
439 /* Don't distribute unless the output precision is at least as big
440 as the actual inputs. Otherwise, the comparison of the
441 truncated values will be wrong. */
442 if (outprec
>= TYPE_PRECISION (TREE_TYPE (arg0
))
443 && outprec
>= TYPE_PRECISION (TREE_TYPE (arg1
))
444 /* If signedness of arg0 and arg1 don't match,
445 we can't necessarily find a type to compare them in. */
446 && (TREE_UNSIGNED (TREE_TYPE (arg0
))
447 == TREE_UNSIGNED (TREE_TYPE (arg1
))))
460 tree arg0
= get_unwidened (TREE_OPERAND (expr
, 0), type
);
461 tree arg1
= get_unwidened (TREE_OPERAND (expr
, 1), type
);
463 if (outprec
>= BITS_PER_WORD
464 || TRULY_NOOP_TRUNCATION (outprec
, inprec
)
465 || inprec
> TYPE_PRECISION (TREE_TYPE (arg0
))
466 || inprec
> TYPE_PRECISION (TREE_TYPE (arg1
)))
468 /* Do the arithmetic in type TYPEX,
469 then convert result to TYPE. */
472 /* Can't do arithmetic in enumeral types
473 so use an integer type that will hold the values. */
474 if (TREE_CODE (typex
) == ENUMERAL_TYPE
)
475 typex
= (*lang_hooks
.types
.type_for_size
)
476 (TYPE_PRECISION (typex
), TREE_UNSIGNED (typex
));
478 /* But now perhaps TYPEX is as wide as INPREC.
479 In that case, do nothing special here.
480 (Otherwise would recurse infinitely in convert. */
481 if (TYPE_PRECISION (typex
) != inprec
)
483 /* Don't do unsigned arithmetic where signed was wanted,
485 Exception: if both of the original operands were
486 unsigned then we can safely do the work as unsigned.
487 Exception: shift operations take their type solely
488 from the first argument.
489 Exception: the LSHIFT_EXPR case above requires that
490 we perform this operation unsigned lest we produce
491 signed-overflow undefinedness.
492 And we may need to do it as unsigned
493 if we truncate to the original size. */
494 if (TREE_UNSIGNED (TREE_TYPE (expr
))
495 || (TREE_UNSIGNED (TREE_TYPE (arg0
))
496 && (TREE_UNSIGNED (TREE_TYPE (arg1
))
497 || ex_form
== LSHIFT_EXPR
498 || ex_form
== RSHIFT_EXPR
499 || ex_form
== LROTATE_EXPR
500 || ex_form
== RROTATE_EXPR
))
501 || ex_form
== LSHIFT_EXPR
)
502 typex
= (*lang_hooks
.types
.unsigned_type
) (typex
);
504 typex
= (*lang_hooks
.types
.signed_type
) (typex
);
505 return convert (type
,
506 fold (build (ex_form
, typex
,
507 convert (typex
, arg0
),
508 convert (typex
, arg1
),
517 /* This is not correct for ABS_EXPR,
518 since we must test the sign before truncation. */
522 /* Can't do arithmetic in enumeral types
523 so use an integer type that will hold the values. */
524 if (TREE_CODE (typex
) == ENUMERAL_TYPE
)
525 typex
= (*lang_hooks
.types
.type_for_size
)
526 (TYPE_PRECISION (typex
), TREE_UNSIGNED (typex
));
528 /* But now perhaps TYPEX is as wide as INPREC.
529 In that case, do nothing special here.
530 (Otherwise would recurse infinitely in convert. */
531 if (TYPE_PRECISION (typex
) != inprec
)
533 /* Don't do unsigned arithmetic where signed was wanted,
535 if (TREE_UNSIGNED (TREE_TYPE (expr
)))
536 typex
= (*lang_hooks
.types
.unsigned_type
) (typex
);
538 typex
= (*lang_hooks
.types
.signed_type
) (typex
);
539 return convert (type
,
540 fold (build1 (ex_form
, typex
,
542 TREE_OPERAND (expr
, 0)))));
548 "can't convert between vector values of different size" error. */
549 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr
, 0))) == VECTOR_TYPE
550 && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_OPERAND (expr
, 0))))
551 != GET_MODE_SIZE (TYPE_MODE (type
))))
553 /* If truncating after truncating, might as well do all at once.
554 If truncating after extending, we may get rid of wasted work. */
555 return convert (type
, get_unwidened (TREE_OPERAND (expr
, 0), type
));
558 /* It is sometimes worthwhile to push the narrowing down through
559 the conditional and never loses. */
560 return fold (build (COND_EXPR
, type
, TREE_OPERAND (expr
, 0),
561 convert (type
, TREE_OPERAND (expr
, 1)),
562 convert (type
, TREE_OPERAND (expr
, 2))));
568 return build1 (NOP_EXPR
, type
, expr
);
571 return build1 (FIX_TRUNC_EXPR
, type
, expr
);
574 return convert (type
,
575 fold (build1 (REALPART_EXPR
,
576 TREE_TYPE (TREE_TYPE (expr
)), expr
)));
579 if (GET_MODE_SIZE (TYPE_MODE (type
))
580 != GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr
))))
582 error ("can't convert between vector values of different size");
583 return error_mark_node
;
585 return build1 (NOP_EXPR
, type
, expr
);
588 error ("aggregate value used where an integer was expected");
589 return convert (type
, integer_zero_node
);
593 /* Convert EXPR to the complex type TYPE in the usual ways. */
596 convert_to_complex (type
, expr
)
599 tree subtype
= TREE_TYPE (type
);
601 switch (TREE_CODE (TREE_TYPE (expr
)))
608 return build (COMPLEX_EXPR
, type
, convert (subtype
, expr
),
609 convert (subtype
, integer_zero_node
));
613 tree elt_type
= TREE_TYPE (TREE_TYPE (expr
));
615 if (TYPE_MAIN_VARIANT (elt_type
) == TYPE_MAIN_VARIANT (subtype
))
617 else if (TREE_CODE (expr
) == COMPLEX_EXPR
)
618 return fold (build (COMPLEX_EXPR
,
620 convert (subtype
, TREE_OPERAND (expr
, 0)),
621 convert (subtype
, TREE_OPERAND (expr
, 1))));
624 expr
= save_expr (expr
);
626 fold (build (COMPLEX_EXPR
,
627 type
, convert (subtype
,
628 fold (build1 (REALPART_EXPR
,
629 TREE_TYPE (TREE_TYPE (expr
)),
632 fold (build1 (IMAGPART_EXPR
,
633 TREE_TYPE (TREE_TYPE (expr
)),
640 error ("pointer value used where a complex was expected");
641 return convert_to_complex (type
, integer_zero_node
);
644 error ("aggregate value used where a complex was expected");
645 return convert_to_complex (type
, integer_zero_node
);
649 /* Convert EXPR to the vector type TYPE in the usual ways. */
652 convert_to_vector (type
, expr
)
655 switch (TREE_CODE (TREE_TYPE (expr
)))
659 if (GET_MODE_SIZE (TYPE_MODE (type
))
660 != GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr
))))
662 error ("can't convert between vector values of different size");
663 return error_mark_node
;
665 return build1 (NOP_EXPR
, type
, expr
);
668 error ("can't convert value to a vector");
669 return convert_to_vector (type
, integer_zero_node
);