OSDN Git Service

2009-05-13 Jonathan Wakely <jwakely.gcc@gmail.com>
[pf3gnuchains/gcc-fork.git] / gcc / convert.c
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.
5
6 This file is part of GCC.
7
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.
12
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.
17
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/>.  */
21
22
23 /* These routines are somewhat language-independent utility function
24    intended to be called by the language-specific convert () functions.  */
25
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"
37
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.  */
41
42 tree
43 convert_to_pointer (tree type, tree expr)
44 {
45   if (TREE_TYPE (expr) == type)
46     return expr;
47
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));
51
52   switch (TREE_CODE (TREE_TYPE (expr)))
53     {
54     case POINTER_TYPE:
55     case REFERENCE_TYPE:
56       return fold_build1 (NOP_EXPR, type, expr);
57
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);
66
67
68     default:
69       error ("cannot convert to a pointer type");
70       return convert_to_pointer (type, integer_zero_node);
71     }
72 }
73
74 /* Avoid any floating point extensions from EXP.  */
75 tree
76 strip_float_extensions (tree exp)
77 {
78   tree sub, expt, subt;
79
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)))
85     {
86       REAL_VALUE_TYPE orig;
87       tree type = NULL;
88
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));
99     }
100
101   if (!CONVERT_EXPR_P (exp))
102     return exp;
103
104   sub = TREE_OPERAND (exp, 0);
105   subt = TREE_TYPE (sub);
106   expt = TREE_TYPE (exp);
107
108   if (!FLOAT_TYPE_P (subt))
109     return exp;
110
111   if (DECIMAL_FLOAT_TYPE_P (expt) != DECIMAL_FLOAT_TYPE_P (subt))
112     return exp;
113
114   if (TYPE_PRECISION (subt) > TYPE_PRECISION (expt))
115     return exp;
116
117   return strip_float_extensions (sub);
118 }
119
120
121 /* Convert EXPR to some floating-point type TYPE.
122
123    EXPR must be float, fixed-point, integer, or enumeral;
124    in other cases error is called.  */
125
126 tree
127 convert_to_real (tree type, tree expr)
128 {
129   enum built_in_function fcode = builtin_mathfn_code (expr);
130   tree itype = TREE_TYPE (expr);
131
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)))
138     {
139       switch (fcode)
140         {
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
182             {
183               tree arg0 = strip_float_extensions (CALL_EXPR_ARG (expr, 0));
184               tree newtype = type;
185
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);
190
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)))
197                 {
198                   tree fn = mathfn_built_in (newtype, fcode);
199
200                   if (fn)
201                   {
202                     tree arg = fold (convert_to_real (newtype, arg0));
203                     expr = build_call_expr (fn, 1, arg);
204                     if (newtype == type)
205                       return expr;
206                   }
207                 }
208             }
209         default:
210           break;
211         }
212     }
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)))))
229     {
230       tree fn = mathfn_built_in (type, fcode);
231
232       if (fn)
233         {
234           tree arg = strip_float_extensions (CALL_EXPR_ARG (expr, 0));
235
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)));
242         }
243     }
244
245   /* Propagate the cast into the operation.  */
246   if (itype != type && FLOAT_TYPE_P (type))
247     switch (TREE_CODE (expr))
248       {
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:
266            {
267              tree arg0 = strip_float_extensions (TREE_OPERAND (expr, 0));
268              tree arg1 = strip_float_extensions (TREE_OPERAND (expr, 1));
269
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))
273                {
274                   tree newtype = type;
275
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)
291                     {
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;
298                     }
299
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))))
331                     {
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;
337                     }
338                }
339            }
340           break;
341         default:
342           break;
343       }
344
345   switch (TREE_CODE (TREE_TYPE (expr)))
346     {
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);
354
355     case INTEGER_TYPE:
356     case ENUMERAL_TYPE:
357     case BOOLEAN_TYPE:
358       return build1 (FLOAT_EXPR, type, expr);
359
360     case FIXED_POINT_TYPE:
361       return build1 (FIXED_CONVERT_EXPR, type, expr);
362
363     case COMPLEX_TYPE:
364       return convert (type,
365                       fold_build1 (REALPART_EXPR,
366                                    TREE_TYPE (TREE_TYPE (expr)), expr));
367
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);
372
373     default:
374       error ("aggregate value used where a float was expected");
375       return convert_to_real (type, integer_zero_node);
376     }
377 }
378
379 /* Convert EXPR to some integer (or enum) type TYPE.
380
381    EXPR must be pointer, integer, discrete (enum, char, or bool), float,
382    fixed-point or vector; in other cases error is called.
383
384    The result of this is always supposed to be a newly created tree node
385    not in use in any existing structure.  */
386
387 tree
388 convert_to_integer (tree type, tree expr)
389 {
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);
394
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))
398     {
399       error ("conversion to incomplete type");
400       return error_mark_node;
401     }
402
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))))
412     {
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;
417       
418       switch (fcode)
419         {
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;
432
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;
445
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;
455
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;
470
471         CASE_FLT_FN (BUILT_IN_TRUNC):
472           return convert_to_integer (type, CALL_EXPR_ARG (s_expr, 0));
473
474         default:
475           break;
476         }
477       
478       if (fn)
479         {
480           tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0));
481           return convert_to_integer (type, newexpr);
482         }
483     }
484
485   switch (TREE_CODE (intype))
486     {
487     case POINTER_TYPE:
488     case REFERENCE_TYPE:
489       if (integer_zerop (expr))
490         return build_int_cst (type, 0);
491
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);
498
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.  */
505
506       if (TREE_CODE_CLASS (ex_form) == tcc_comparison)
507         {
508           expr = copy_node (expr);
509           TREE_TYPE (expr) = type;
510           return expr;
511         }
512
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.  */
516
517       else if (outprec >= inprec)
518         {
519           enum tree_code code;
520           tree tem;
521
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;
537
538           tem = fold_unary (code, type, expr);
539           if (tem)
540             return tem;
541
542           tem = build1 (code, type, expr);
543           TREE_NO_WARNING (tem) = 1;
544           return tem;
545         }
546
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));
557
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.
570
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.  */
577
578       switch (ex_form)
579         {
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;
587
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)
596             {
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
603                 {
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.  */
609
610                   tree t = build_int_cst (type, 0);
611
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;
618                 }
619             }
620           break;
621
622         case MAX_EXPR:
623         case MIN_EXPR:
624         case MULT_EXPR:
625           {
626             tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
627             tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
628
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;
640           }
641
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:
648           {
649             tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
650             tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
651
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)))
656               {
657                 /* Do the arithmetic in type TYPEX,
658                    then convert result to TYPE.  */
659                 tree typex = type;
660
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));
666
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)
671                   {
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)));
707                   }
708               }
709           }
710           break;
711
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.  */
716           {
717             tree typex;
718
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))));
729           }
730
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));
741
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)));
748
749         default:
750           break;
751         }
752
753       return build1 (CONVERT_EXPR, type, expr);
754
755     case REAL_TYPE:
756       return build1 (FIX_TRUNC_EXPR, type, expr);
757
758     case FIXED_POINT_TYPE:
759       return build1 (FIXED_CONVERT_EXPR, type, expr);
760
761     case COMPLEX_TYPE:
762       return convert (type,
763                       fold_build1 (REALPART_EXPR,
764                                    TREE_TYPE (TREE_TYPE (expr)), expr));
765
766     case VECTOR_TYPE:
767       if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr))))
768         {
769           error ("can't convert between vector values of different size");
770           return error_mark_node;
771         }
772       return build1 (VIEW_CONVERT_EXPR, type, expr);
773
774     default:
775       error ("aggregate value used where an integer was expected");
776       return convert (type, integer_zero_node);
777     }
778 }
779
780 /* Convert EXPR to the complex type TYPE in the usual ways.  */
781
782 tree
783 convert_to_complex (tree type, tree expr)
784 {
785   tree subtype = TREE_TYPE (type);
786
787   switch (TREE_CODE (TREE_TYPE (expr)))
788     {
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));
796
797     case COMPLEX_TYPE:
798       {
799         tree elt_type = TREE_TYPE (TREE_TYPE (expr));
800
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
808           {
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)));
820           }
821       }
822
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);
827
828     default:
829       error ("aggregate value used where a complex was expected");
830       return convert_to_complex (type, integer_zero_node);
831     }
832 }
833
834 /* Convert EXPR to the vector type TYPE in the usual ways.  */
835
836 tree
837 convert_to_vector (tree type, tree expr)
838 {
839   switch (TREE_CODE (TREE_TYPE (expr)))
840     {
841     case INTEGER_TYPE:
842     case VECTOR_TYPE:
843       if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr))))
844         {
845           error ("can't convert between vector values of different size");
846           return error_mark_node;
847         }
848       return build1 (VIEW_CONVERT_EXPR, type, expr);
849
850     default:
851       error ("can't convert value to a vector");
852       return error_mark_node;
853     }
854 }
855
856 /* Convert EXPR to some fixed-point type TYPE.
857
858    EXPR must be fixed-point, float, integer, or enumeral;
859    in other cases error is called.  */
860
861 tree
862 convert_to_fixed (tree type, tree expr)
863 {
864   if (integer_zerop (expr))
865     {
866       tree fixed_zero_node = build_fixed (type, FCONST0 (TYPE_MODE (type)));
867       return fixed_zero_node;
868     }
869   else if (integer_onep (expr) && ALL_SCALAR_ACCUM_MODE_P (TYPE_MODE (type)))
870     {
871       tree fixed_one_node = build_fixed (type, FCONST1 (TYPE_MODE (type)));
872       return fixed_one_node;
873     }
874
875   switch (TREE_CODE (TREE_TYPE (expr)))
876     {
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);
883
884     case COMPLEX_TYPE:
885       return convert (type,
886                       fold_build1 (REALPART_EXPR,
887                                    TREE_TYPE (TREE_TYPE (expr)), expr));
888
889     default:
890       error ("aggregate value used where a fixed-point was expected");
891       return error_mark_node;
892     }
893 }