2009-04-16 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / convert.c
blobb6a9d3dc5315595c24d5a4f9d5c4c8ea97eae10b
1 /* Utility routines for data type conversion for GCC.
2 Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1997, 1998,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
23 /* These routines are somewhat language-independent utility function
24 intended to be called by the language-specific convert () functions. */
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "tree.h"
31 #include "flags.h"
32 #include "convert.h"
33 #include "toplev.h"
34 #include "langhooks.h"
35 #include "real.h"
36 #include "fixed-value.h"
38 /* Convert EXPR to some pointer or reference type TYPE.
39 EXPR must be pointer, reference, integer, enumeral, or literal zero;
40 in other cases error is called. */
42 tree
43 convert_to_pointer (tree type, tree expr)
45 if (TREE_TYPE (expr) == type)
46 return expr;
48 /* Propagate overflow to the NULL pointer. */
49 if (integer_zerop (expr))
50 return force_fit_type_double (type, 0, 0, 0, TREE_OVERFLOW (expr));
52 switch (TREE_CODE (TREE_TYPE (expr)))
54 case POINTER_TYPE:
55 case REFERENCE_TYPE:
56 return fold_build1 (NOP_EXPR, type, expr);
58 case INTEGER_TYPE:
59 case ENUMERAL_TYPE:
60 case BOOLEAN_TYPE:
61 if (TYPE_PRECISION (TREE_TYPE (expr)) != POINTER_SIZE)
62 expr = fold_build1 (NOP_EXPR,
63 lang_hooks.types.type_for_size (POINTER_SIZE, 0),
64 expr);
65 return fold_build1 (CONVERT_EXPR, type, expr);
68 default:
69 error ("cannot convert to a pointer type");
70 return convert_to_pointer (type, integer_zero_node);
74 /* Avoid any floating point extensions from EXP. */
75 tree
76 strip_float_extensions (tree exp)
78 tree sub, expt, subt;
80 /* For floating point constant look up the narrowest type that can hold
81 it properly and handle it like (type)(narrowest_type)constant.
82 This way we can optimize for instance a=a*2.0 where "a" is float
83 but 2.0 is double constant. */
84 if (TREE_CODE (exp) == REAL_CST && !DECIMAL_FLOAT_TYPE_P (TREE_TYPE (exp)))
86 REAL_VALUE_TYPE orig;
87 tree type = NULL;
89 orig = TREE_REAL_CST (exp);
90 if (TYPE_PRECISION (TREE_TYPE (exp)) > TYPE_PRECISION (float_type_node)
91 && exact_real_truncate (TYPE_MODE (float_type_node), &orig))
92 type = float_type_node;
93 else if (TYPE_PRECISION (TREE_TYPE (exp))
94 > TYPE_PRECISION (double_type_node)
95 && exact_real_truncate (TYPE_MODE (double_type_node), &orig))
96 type = double_type_node;
97 if (type)
98 return build_real (type, real_value_truncate (TYPE_MODE (type), orig));
101 if (!CONVERT_EXPR_P (exp))
102 return exp;
104 sub = TREE_OPERAND (exp, 0);
105 subt = TREE_TYPE (sub);
106 expt = TREE_TYPE (exp);
108 if (!FLOAT_TYPE_P (subt))
109 return exp;
111 if (DECIMAL_FLOAT_TYPE_P (expt) != DECIMAL_FLOAT_TYPE_P (subt))
112 return exp;
114 if (TYPE_PRECISION (subt) > TYPE_PRECISION (expt))
115 return exp;
117 return strip_float_extensions (sub);
121 /* Convert EXPR to some floating-point type TYPE.
123 EXPR must be float, fixed-point, integer, or enumeral;
124 in other cases error is called. */
126 tree
127 convert_to_real (tree type, tree expr)
129 enum built_in_function fcode = builtin_mathfn_code (expr);
130 tree itype = TREE_TYPE (expr);
132 /* Disable until we figure out how to decide whether the functions are
133 present in runtime. */
134 /* Convert (float)sqrt((double)x) where x is float into sqrtf(x) */
135 if (optimize
136 && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
137 || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
139 switch (fcode)
141 #define CASE_MATHFN(FN) case BUILT_IN_##FN: case BUILT_IN_##FN##L:
142 CASE_MATHFN (COSH)
143 CASE_MATHFN (EXP)
144 CASE_MATHFN (EXP10)
145 CASE_MATHFN (EXP2)
146 CASE_MATHFN (EXPM1)
147 CASE_MATHFN (GAMMA)
148 CASE_MATHFN (J0)
149 CASE_MATHFN (J1)
150 CASE_MATHFN (LGAMMA)
151 CASE_MATHFN (POW10)
152 CASE_MATHFN (SINH)
153 CASE_MATHFN (TGAMMA)
154 CASE_MATHFN (Y0)
155 CASE_MATHFN (Y1)
156 /* The above functions may set errno differently with float
157 input or output so this transformation is not safe with
158 -fmath-errno. */
159 if (flag_errno_math)
160 break;
161 CASE_MATHFN (ACOS)
162 CASE_MATHFN (ACOSH)
163 CASE_MATHFN (ASIN)
164 CASE_MATHFN (ASINH)
165 CASE_MATHFN (ATAN)
166 CASE_MATHFN (ATANH)
167 CASE_MATHFN (CBRT)
168 CASE_MATHFN (COS)
169 CASE_MATHFN (ERF)
170 CASE_MATHFN (ERFC)
171 CASE_MATHFN (FABS)
172 CASE_MATHFN (LOG)
173 CASE_MATHFN (LOG10)
174 CASE_MATHFN (LOG2)
175 CASE_MATHFN (LOG1P)
176 CASE_MATHFN (LOGB)
177 CASE_MATHFN (SIN)
178 CASE_MATHFN (SQRT)
179 CASE_MATHFN (TAN)
180 CASE_MATHFN (TANH)
181 #undef CASE_MATHFN
183 tree arg0 = strip_float_extensions (CALL_EXPR_ARG (expr, 0));
184 tree newtype = type;
186 /* We have (outertype)sqrt((innertype)x). Choose the wider mode from
187 the both as the safe type for operation. */
188 if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type))
189 newtype = TREE_TYPE (arg0);
191 /* Be careful about integer to fp conversions.
192 These may overflow still. */
193 if (FLOAT_TYPE_P (TREE_TYPE (arg0))
194 && TYPE_PRECISION (newtype) < TYPE_PRECISION (itype)
195 && (TYPE_MODE (newtype) == TYPE_MODE (double_type_node)
196 || TYPE_MODE (newtype) == TYPE_MODE (float_type_node)))
198 tree fn = mathfn_built_in (newtype, fcode);
200 if (fn)
202 tree arg = fold (convert_to_real (newtype, arg0));
203 expr = build_call_expr (fn, 1, arg);
204 if (newtype == type)
205 return expr;
209 default:
210 break;
213 if (optimize
214 && (((fcode == BUILT_IN_FLOORL
215 || fcode == BUILT_IN_CEILL
216 || fcode == BUILT_IN_ROUNDL
217 || fcode == BUILT_IN_RINTL
218 || fcode == BUILT_IN_TRUNCL
219 || fcode == BUILT_IN_NEARBYINTL)
220 && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
221 || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
222 || ((fcode == BUILT_IN_FLOOR
223 || fcode == BUILT_IN_CEIL
224 || fcode == BUILT_IN_ROUND
225 || fcode == BUILT_IN_RINT
226 || fcode == BUILT_IN_TRUNC
227 || fcode == BUILT_IN_NEARBYINT)
228 && (TYPE_MODE (type) == TYPE_MODE (float_type_node)))))
230 tree fn = mathfn_built_in (type, fcode);
232 if (fn)
234 tree arg = strip_float_extensions (CALL_EXPR_ARG (expr, 0));
236 /* Make sure (type)arg0 is an extension, otherwise we could end up
237 changing (float)floor(double d) into floorf((float)d), which is
238 incorrect because (float)d uses round-to-nearest and can round
239 up to the next integer. */
240 if (TYPE_PRECISION (type) >= TYPE_PRECISION (TREE_TYPE (arg)))
241 return build_call_expr (fn, 1, fold (convert_to_real (type, arg)));
245 /* Propagate the cast into the operation. */
246 if (itype != type && FLOAT_TYPE_P (type))
247 switch (TREE_CODE (expr))
249 /* Convert (float)-x into -(float)x. This is safe for
250 round-to-nearest rounding mode. */
251 case ABS_EXPR:
252 case NEGATE_EXPR:
253 if (!flag_rounding_math
254 && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (expr)))
255 return build1 (TREE_CODE (expr), type,
256 fold (convert_to_real (type,
257 TREE_OPERAND (expr, 0))));
258 break;
259 /* Convert (outertype)((innertype0)a+(innertype1)b)
260 into ((newtype)a+(newtype)b) where newtype
261 is the widest mode from all of these. */
262 case PLUS_EXPR:
263 case MINUS_EXPR:
264 case MULT_EXPR:
265 case RDIV_EXPR:
267 tree arg0 = strip_float_extensions (TREE_OPERAND (expr, 0));
268 tree arg1 = strip_float_extensions (TREE_OPERAND (expr, 1));
270 if (FLOAT_TYPE_P (TREE_TYPE (arg0))
271 && FLOAT_TYPE_P (TREE_TYPE (arg1))
272 && DECIMAL_FLOAT_TYPE_P (itype) == DECIMAL_FLOAT_TYPE_P (type))
274 tree newtype = type;
276 if (TYPE_MODE (TREE_TYPE (arg0)) == SDmode
277 || TYPE_MODE (TREE_TYPE (arg1)) == SDmode
278 || TYPE_MODE (type) == SDmode)
279 newtype = dfloat32_type_node;
280 if (TYPE_MODE (TREE_TYPE (arg0)) == DDmode
281 || TYPE_MODE (TREE_TYPE (arg1)) == DDmode
282 || TYPE_MODE (type) == DDmode)
283 newtype = dfloat64_type_node;
284 if (TYPE_MODE (TREE_TYPE (arg0)) == TDmode
285 || TYPE_MODE (TREE_TYPE (arg1)) == TDmode
286 || TYPE_MODE (type) == TDmode)
287 newtype = dfloat128_type_node;
288 if (newtype == dfloat32_type_node
289 || newtype == dfloat64_type_node
290 || newtype == dfloat128_type_node)
292 expr = build2 (TREE_CODE (expr), newtype,
293 fold (convert_to_real (newtype, arg0)),
294 fold (convert_to_real (newtype, arg1)));
295 if (newtype == type)
296 return expr;
297 break;
300 if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (newtype))
301 newtype = TREE_TYPE (arg0);
302 if (TYPE_PRECISION (TREE_TYPE (arg1)) > TYPE_PRECISION (newtype))
303 newtype = TREE_TYPE (arg1);
304 /* Sometimes this transformation is safe (cannot
305 change results through affecting double rounding
306 cases) and sometimes it is not. If NEWTYPE is
307 wider than TYPE, e.g. (float)((long double)double
308 + (long double)double) converted to
309 (float)(double + double), the transformation is
310 unsafe regardless of the details of the types
311 involved; double rounding can arise if the result
312 of NEWTYPE arithmetic is a NEWTYPE value half way
313 between two representable TYPE values but the
314 exact value is sufficiently different (in the
315 right direction) for this difference to be
316 visible in ITYPE arithmetic. If NEWTYPE is the
317 same as TYPE, however, the transformation may be
318 safe depending on the types involved: it is safe
319 if the ITYPE has strictly more than twice as many
320 mantissa bits as TYPE, can represent infinities
321 and NaNs if the TYPE can, and has sufficient
322 exponent range for the product or ratio of two
323 values representable in the TYPE to be within the
324 range of normal values of ITYPE. */
325 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (itype)
326 && (flag_unsafe_math_optimizations
327 || (TYPE_PRECISION (newtype) == TYPE_PRECISION (type)
328 && real_can_shorten_arithmetic (TYPE_MODE (itype),
329 TYPE_MODE (type))
330 && !excess_precision_type (newtype))))
332 expr = build2 (TREE_CODE (expr), newtype,
333 fold (convert_to_real (newtype, arg0)),
334 fold (convert_to_real (newtype, arg1)));
335 if (newtype == type)
336 return expr;
340 break;
341 default:
342 break;
345 switch (TREE_CODE (TREE_TYPE (expr)))
347 case REAL_TYPE:
348 /* Ignore the conversion if we don't need to store intermediate
349 results and neither type is a decimal float. */
350 return build1 ((flag_float_store
351 || DECIMAL_FLOAT_TYPE_P (type)
352 || DECIMAL_FLOAT_TYPE_P (itype))
353 ? CONVERT_EXPR : NOP_EXPR, type, expr);
355 case INTEGER_TYPE:
356 case ENUMERAL_TYPE:
357 case BOOLEAN_TYPE:
358 return build1 (FLOAT_EXPR, type, expr);
360 case FIXED_POINT_TYPE:
361 return build1 (FIXED_CONVERT_EXPR, type, expr);
363 case COMPLEX_TYPE:
364 return convert (type,
365 fold_build1 (REALPART_EXPR,
366 TREE_TYPE (TREE_TYPE (expr)), expr));
368 case POINTER_TYPE:
369 case REFERENCE_TYPE:
370 error ("pointer value used where a floating point value was expected");
371 return convert_to_real (type, integer_zero_node);
373 default:
374 error ("aggregate value used where a float was expected");
375 return convert_to_real (type, integer_zero_node);
379 /* Convert EXPR to some integer (or enum) type TYPE.
381 EXPR must be pointer, integer, discrete (enum, char, or bool), float,
382 fixed-point or vector; in other cases error is called.
384 The result of this is always supposed to be a newly created tree node
385 not in use in any existing structure. */
387 tree
388 convert_to_integer (tree type, tree expr)
390 enum tree_code ex_form = TREE_CODE (expr);
391 tree intype = TREE_TYPE (expr);
392 unsigned int inprec = TYPE_PRECISION (intype);
393 unsigned int outprec = TYPE_PRECISION (type);
395 /* An INTEGER_TYPE cannot be incomplete, but an ENUMERAL_TYPE can
396 be. Consider `enum E = { a, b = (enum E) 3 };'. */
397 if (!COMPLETE_TYPE_P (type))
399 error ("conversion to incomplete type");
400 return error_mark_node;
403 /* Convert e.g. (long)round(d) -> lround(d). */
404 /* If we're converting to char, we may encounter differing behavior
405 between converting from double->char vs double->long->char.
406 We're in "undefined" territory but we prefer to be conservative,
407 so only proceed in "unsafe" math mode. */
408 if (optimize
409 && (flag_unsafe_math_optimizations
410 || (long_integer_type_node
411 && outprec >= TYPE_PRECISION (long_integer_type_node))))
413 tree s_expr = strip_float_extensions (expr);
414 tree s_intype = TREE_TYPE (s_expr);
415 const enum built_in_function fcode = builtin_mathfn_code (s_expr);
416 tree fn = 0;
418 switch (fcode)
420 CASE_FLT_FN (BUILT_IN_CEIL):
421 /* Only convert in ISO C99 mode. */
422 if (!TARGET_C99_FUNCTIONS)
423 break;
424 if (outprec < TYPE_PRECISION (long_integer_type_node)
425 || (outprec == TYPE_PRECISION (long_integer_type_node)
426 && !TYPE_UNSIGNED (type)))
427 fn = mathfn_built_in (s_intype, BUILT_IN_LCEIL);
428 else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
429 && !TYPE_UNSIGNED (type))
430 fn = mathfn_built_in (s_intype, BUILT_IN_LLCEIL);
431 break;
433 CASE_FLT_FN (BUILT_IN_FLOOR):
434 /* Only convert in ISO C99 mode. */
435 if (!TARGET_C99_FUNCTIONS)
436 break;
437 if (outprec < TYPE_PRECISION (long_integer_type_node)
438 || (outprec == TYPE_PRECISION (long_integer_type_node)
439 && !TYPE_UNSIGNED (type)))
440 fn = mathfn_built_in (s_intype, BUILT_IN_LFLOOR);
441 else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
442 && !TYPE_UNSIGNED (type))
443 fn = mathfn_built_in (s_intype, BUILT_IN_LLFLOOR);
444 break;
446 CASE_FLT_FN (BUILT_IN_ROUND):
447 if (outprec < TYPE_PRECISION (long_integer_type_node)
448 || (outprec == TYPE_PRECISION (long_integer_type_node)
449 && !TYPE_UNSIGNED (type)))
450 fn = mathfn_built_in (s_intype, BUILT_IN_LROUND);
451 else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
452 && !TYPE_UNSIGNED (type))
453 fn = mathfn_built_in (s_intype, BUILT_IN_LLROUND);
454 break;
456 CASE_FLT_FN (BUILT_IN_NEARBYINT):
457 /* Only convert nearbyint* if we can ignore math exceptions. */
458 if (flag_trapping_math)
459 break;
460 /* ... Fall through ... */
461 CASE_FLT_FN (BUILT_IN_RINT):
462 if (outprec < TYPE_PRECISION (long_integer_type_node)
463 || (outprec == TYPE_PRECISION (long_integer_type_node)
464 && !TYPE_UNSIGNED (type)))
465 fn = mathfn_built_in (s_intype, BUILT_IN_LRINT);
466 else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
467 && !TYPE_UNSIGNED (type))
468 fn = mathfn_built_in (s_intype, BUILT_IN_LLRINT);
469 break;
471 CASE_FLT_FN (BUILT_IN_TRUNC):
472 return convert_to_integer (type, CALL_EXPR_ARG (s_expr, 0));
474 default:
475 break;
478 if (fn)
480 tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0));
481 return convert_to_integer (type, newexpr);
485 switch (TREE_CODE (intype))
487 case POINTER_TYPE:
488 case REFERENCE_TYPE:
489 if (integer_zerop (expr))
490 return build_int_cst (type, 0);
492 /* Convert to an unsigned integer of the correct width first,
493 and from there widen/truncate to the required type. */
494 expr = fold_build1 (CONVERT_EXPR,
495 lang_hooks.types.type_for_size (POINTER_SIZE, 0),
496 expr);
497 return fold_convert (type, expr);
499 case INTEGER_TYPE:
500 case ENUMERAL_TYPE:
501 case BOOLEAN_TYPE:
502 case OFFSET_TYPE:
503 /* If this is a logical operation, which just returns 0 or 1, we can
504 change the type of the expression. */
506 if (TREE_CODE_CLASS (ex_form) == tcc_comparison)
508 expr = copy_node (expr);
509 TREE_TYPE (expr) = type;
510 return expr;
513 /* If we are widening the type, put in an explicit conversion.
514 Similarly if we are not changing the width. After this, we know
515 we are truncating EXPR. */
517 else if (outprec >= inprec)
519 enum tree_code code;
520 tree tem;
522 /* If the precision of the EXPR's type is K bits and the
523 destination mode has more bits, and the sign is changing,
524 it is not safe to use a NOP_EXPR. For example, suppose
525 that EXPR's type is a 3-bit unsigned integer type, the
526 TYPE is a 3-bit signed integer type, and the machine mode
527 for the types is 8-bit QImode. In that case, the
528 conversion necessitates an explicit sign-extension. In
529 the signed-to-unsigned case the high-order bits have to
530 be cleared. */
531 if (TYPE_UNSIGNED (type) != TYPE_UNSIGNED (TREE_TYPE (expr))
532 && (TYPE_PRECISION (TREE_TYPE (expr))
533 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (expr)))))
534 code = CONVERT_EXPR;
535 else
536 code = NOP_EXPR;
538 tem = fold_unary (code, type, expr);
539 if (tem)
540 return tem;
542 tem = build1 (code, type, expr);
543 TREE_NO_WARNING (tem) = 1;
544 return tem;
547 /* If TYPE is an enumeral type or a type with a precision less
548 than the number of bits in its mode, do the conversion to the
549 type corresponding to its mode, then do a nop conversion
550 to TYPE. */
551 else if (TREE_CODE (type) == ENUMERAL_TYPE
552 || outprec != GET_MODE_BITSIZE (TYPE_MODE (type)))
553 return build1 (NOP_EXPR, type,
554 convert (lang_hooks.types.type_for_mode
555 (TYPE_MODE (type), TYPE_UNSIGNED (type)),
556 expr));
558 /* Here detect when we can distribute the truncation down past some
559 arithmetic. For example, if adding two longs and converting to an
560 int, we can equally well convert both to ints and then add.
561 For the operations handled here, such truncation distribution
562 is always safe.
563 It is desirable in these cases:
564 1) when truncating down to full-word from a larger size
565 2) when truncating takes no work.
566 3) when at least one operand of the arithmetic has been extended
567 (as by C's default conversions). In this case we need two conversions
568 if we do the arithmetic as already requested, so we might as well
569 truncate both and then combine. Perhaps that way we need only one.
571 Note that in general we cannot do the arithmetic in a type
572 shorter than the desired result of conversion, even if the operands
573 are both extended from a shorter type, because they might overflow
574 if combined in that type. The exceptions to this--the times when
575 two narrow values can be combined in their narrow type even to
576 make a wider result--are handled by "shorten" in build_binary_op. */
578 switch (ex_form)
580 case RSHIFT_EXPR:
581 /* We can pass truncation down through right shifting
582 when the shift count is a nonpositive constant. */
583 if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
584 && tree_int_cst_sgn (TREE_OPERAND (expr, 1)) <= 0)
585 goto trunc1;
586 break;
588 case LSHIFT_EXPR:
589 /* We can pass truncation down through left shifting
590 when the shift count is a nonnegative constant and
591 the target type is unsigned. */
592 if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
593 && tree_int_cst_sgn (TREE_OPERAND (expr, 1)) >= 0
594 && TYPE_UNSIGNED (type)
595 && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
597 /* If shift count is less than the width of the truncated type,
598 really shift. */
599 if (tree_int_cst_lt (TREE_OPERAND (expr, 1), TYPE_SIZE (type)))
600 /* In this case, shifting is like multiplication. */
601 goto trunc1;
602 else
604 /* If it is >= that width, result is zero.
605 Handling this with trunc1 would give the wrong result:
606 (int) ((long long) a << 32) is well defined (as 0)
607 but (int) a << 32 is undefined and would get a
608 warning. */
610 tree t = build_int_cst (type, 0);
612 /* If the original expression had side-effects, we must
613 preserve it. */
614 if (TREE_SIDE_EFFECTS (expr))
615 return build2 (COMPOUND_EXPR, type, expr, t);
616 else
617 return t;
620 break;
622 case MAX_EXPR:
623 case MIN_EXPR:
624 case MULT_EXPR:
626 tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
627 tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
629 /* Don't distribute unless the output precision is at least as big
630 as the actual inputs. Otherwise, the comparison of the
631 truncated values will be wrong. */
632 if (outprec >= TYPE_PRECISION (TREE_TYPE (arg0))
633 && outprec >= TYPE_PRECISION (TREE_TYPE (arg1))
634 /* If signedness of arg0 and arg1 don't match,
635 we can't necessarily find a type to compare them in. */
636 && (TYPE_UNSIGNED (TREE_TYPE (arg0))
637 == TYPE_UNSIGNED (TREE_TYPE (arg1))))
638 goto trunc1;
639 break;
642 case PLUS_EXPR:
643 case MINUS_EXPR:
644 case BIT_AND_EXPR:
645 case BIT_IOR_EXPR:
646 case BIT_XOR_EXPR:
647 trunc1:
649 tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
650 tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
652 if (outprec >= BITS_PER_WORD
653 || TRULY_NOOP_TRUNCATION (outprec, inprec)
654 || inprec > TYPE_PRECISION (TREE_TYPE (arg0))
655 || inprec > TYPE_PRECISION (TREE_TYPE (arg1)))
657 /* Do the arithmetic in type TYPEX,
658 then convert result to TYPE. */
659 tree typex = type;
661 /* Can't do arithmetic in enumeral types
662 so use an integer type that will hold the values. */
663 if (TREE_CODE (typex) == ENUMERAL_TYPE)
664 typex = lang_hooks.types.type_for_size
665 (TYPE_PRECISION (typex), TYPE_UNSIGNED (typex));
667 /* But now perhaps TYPEX is as wide as INPREC.
668 In that case, do nothing special here.
669 (Otherwise would recurse infinitely in convert. */
670 if (TYPE_PRECISION (typex) != inprec)
672 /* Don't do unsigned arithmetic where signed was wanted,
673 or vice versa.
674 Exception: if both of the original operands were
675 unsigned then we can safely do the work as unsigned.
676 Exception: shift operations take their type solely
677 from the first argument.
678 Exception: the LSHIFT_EXPR case above requires that
679 we perform this operation unsigned lest we produce
680 signed-overflow undefinedness.
681 And we may need to do it as unsigned
682 if we truncate to the original size. */
683 if (TYPE_UNSIGNED (TREE_TYPE (expr))
684 || (TYPE_UNSIGNED (TREE_TYPE (arg0))
685 && (TYPE_UNSIGNED (TREE_TYPE (arg1))
686 || ex_form == LSHIFT_EXPR
687 || ex_form == RSHIFT_EXPR
688 || ex_form == LROTATE_EXPR
689 || ex_form == RROTATE_EXPR))
690 || ex_form == LSHIFT_EXPR
691 /* If we have !flag_wrapv, and either ARG0 or
692 ARG1 is of a signed type, we have to do
693 PLUS_EXPR or MINUS_EXPR in an unsigned
694 type. Otherwise, we would introduce
695 signed-overflow undefinedness. */
696 || ((!TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))
697 || !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1)))
698 && (ex_form == PLUS_EXPR
699 || ex_form == MINUS_EXPR)))
700 typex = unsigned_type_for (typex);
701 else
702 typex = signed_type_for (typex);
703 return convert (type,
704 fold_build2 (ex_form, typex,
705 convert (typex, arg0),
706 convert (typex, arg1)));
710 break;
712 case NEGATE_EXPR:
713 case BIT_NOT_EXPR:
714 /* This is not correct for ABS_EXPR,
715 since we must test the sign before truncation. */
717 tree typex;
719 /* Don't do unsigned arithmetic where signed was wanted,
720 or vice versa. */
721 if (TYPE_UNSIGNED (TREE_TYPE (expr)))
722 typex = unsigned_type_for (type);
723 else
724 typex = signed_type_for (type);
725 return convert (type,
726 fold_build1 (ex_form, typex,
727 convert (typex,
728 TREE_OPERAND (expr, 0))));
731 case NOP_EXPR:
732 /* Don't introduce a
733 "can't convert between vector values of different size" error. */
734 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == VECTOR_TYPE
735 && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_OPERAND (expr, 0))))
736 != GET_MODE_SIZE (TYPE_MODE (type))))
737 break;
738 /* If truncating after truncating, might as well do all at once.
739 If truncating after extending, we may get rid of wasted work. */
740 return convert (type, get_unwidened (TREE_OPERAND (expr, 0), type));
742 case COND_EXPR:
743 /* It is sometimes worthwhile to push the narrowing down through
744 the conditional and never loses. */
745 return fold_build3 (COND_EXPR, type, TREE_OPERAND (expr, 0),
746 convert (type, TREE_OPERAND (expr, 1)),
747 convert (type, TREE_OPERAND (expr, 2)));
749 default:
750 break;
753 return build1 (CONVERT_EXPR, type, expr);
755 case REAL_TYPE:
756 return build1 (FIX_TRUNC_EXPR, type, expr);
758 case FIXED_POINT_TYPE:
759 return build1 (FIXED_CONVERT_EXPR, type, expr);
761 case COMPLEX_TYPE:
762 return convert (type,
763 fold_build1 (REALPART_EXPR,
764 TREE_TYPE (TREE_TYPE (expr)), expr));
766 case VECTOR_TYPE:
767 if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr))))
769 error ("can't convert between vector values of different size");
770 return error_mark_node;
772 return build1 (VIEW_CONVERT_EXPR, type, expr);
774 default:
775 error ("aggregate value used where an integer was expected");
776 return convert (type, integer_zero_node);
780 /* Convert EXPR to the complex type TYPE in the usual ways. */
782 tree
783 convert_to_complex (tree type, tree expr)
785 tree subtype = TREE_TYPE (type);
787 switch (TREE_CODE (TREE_TYPE (expr)))
789 case REAL_TYPE:
790 case FIXED_POINT_TYPE:
791 case INTEGER_TYPE:
792 case ENUMERAL_TYPE:
793 case BOOLEAN_TYPE:
794 return build2 (COMPLEX_EXPR, type, convert (subtype, expr),
795 convert (subtype, integer_zero_node));
797 case COMPLEX_TYPE:
799 tree elt_type = TREE_TYPE (TREE_TYPE (expr));
801 if (TYPE_MAIN_VARIANT (elt_type) == TYPE_MAIN_VARIANT (subtype))
802 return expr;
803 else if (TREE_CODE (expr) == COMPLEX_EXPR)
804 return fold_build2 (COMPLEX_EXPR, type,
805 convert (subtype, TREE_OPERAND (expr, 0)),
806 convert (subtype, TREE_OPERAND (expr, 1)));
807 else
809 expr = save_expr (expr);
810 return
811 fold_build2 (COMPLEX_EXPR, type,
812 convert (subtype,
813 fold_build1 (REALPART_EXPR,
814 TREE_TYPE (TREE_TYPE (expr)),
815 expr)),
816 convert (subtype,
817 fold_build1 (IMAGPART_EXPR,
818 TREE_TYPE (TREE_TYPE (expr)),
819 expr)));
823 case POINTER_TYPE:
824 case REFERENCE_TYPE:
825 error ("pointer value used where a complex was expected");
826 return convert_to_complex (type, integer_zero_node);
828 default:
829 error ("aggregate value used where a complex was expected");
830 return convert_to_complex (type, integer_zero_node);
834 /* Convert EXPR to the vector type TYPE in the usual ways. */
836 tree
837 convert_to_vector (tree type, tree expr)
839 switch (TREE_CODE (TREE_TYPE (expr)))
841 case INTEGER_TYPE:
842 case VECTOR_TYPE:
843 if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr))))
845 error ("can't convert between vector values of different size");
846 return error_mark_node;
848 return build1 (VIEW_CONVERT_EXPR, type, expr);
850 default:
851 error ("can't convert value to a vector");
852 return error_mark_node;
856 /* Convert EXPR to some fixed-point type TYPE.
858 EXPR must be fixed-point, float, integer, or enumeral;
859 in other cases error is called. */
861 tree
862 convert_to_fixed (tree type, tree expr)
864 if (integer_zerop (expr))
866 tree fixed_zero_node = build_fixed (type, FCONST0 (TYPE_MODE (type)));
867 return fixed_zero_node;
869 else if (integer_onep (expr) && ALL_SCALAR_ACCUM_MODE_P (TYPE_MODE (type)))
871 tree fixed_one_node = build_fixed (type, FCONST1 (TYPE_MODE (type)));
872 return fixed_one_node;
875 switch (TREE_CODE (TREE_TYPE (expr)))
877 case FIXED_POINT_TYPE:
878 case INTEGER_TYPE:
879 case ENUMERAL_TYPE:
880 case BOOLEAN_TYPE:
881 case REAL_TYPE:
882 return build1 (FIXED_CONVERT_EXPR, type, expr);
884 case COMPLEX_TYPE:
885 return convert (type,
886 fold_build1 (REALPART_EXPR,
887 TREE_TYPE (TREE_TYPE (expr)), expr));
889 default:
890 error ("aggregate value used where a fixed-point was expected");
891 return error_mark_node;