OSDN Git Service

* objc.dg/isa-field-1.m: Only run on darwin.
[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 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
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
10 version.
11
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
15 for more details.
16
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
20 02111-1307, USA.  */
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 /* Convert EXPR to some pointer or reference type TYPE.
37
38    EXPR must be pointer, reference, integer, enumeral, or literal zero;
39    in other cases error is called.  */
40
41 tree
42 convert_to_pointer (tree type, tree expr)
43 {
44   if (integer_zerop (expr))
45     {
46       expr = build_int_cst (type, 0);
47       return expr;
48     }
49
50   switch (TREE_CODE (TREE_TYPE (expr)))
51     {
52     case POINTER_TYPE:
53     case REFERENCE_TYPE:
54       return build1 (NOP_EXPR, type, expr);
55
56     case INTEGER_TYPE:
57     case ENUMERAL_TYPE:
58     case BOOLEAN_TYPE:
59     case CHAR_TYPE:
60       if (TYPE_PRECISION (TREE_TYPE (expr)) == POINTER_SIZE)
61         return build1 (CONVERT_EXPR, type, expr);
62
63       return
64         convert_to_pointer (type,
65                             convert (lang_hooks.types.type_for_size
66                                      (POINTER_SIZE, 0), expr));
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)
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 (TREE_CODE (exp) != NOP_EXPR
102       && TREE_CODE (exp) != CONVERT_EXPR)
103     return exp;
104
105   sub = TREE_OPERAND (exp, 0);
106   subt = TREE_TYPE (sub);
107   expt = TREE_TYPE (exp);
108
109   if (!FLOAT_TYPE_P (subt))
110     return exp;
111
112   if (TYPE_PRECISION (subt) > TYPE_PRECISION (expt))
113     return exp;
114
115   return strip_float_extensions (sub);
116 }
117
118
119 /* Convert EXPR to some floating-point type TYPE.
120
121    EXPR must be float, integer, or enumeral;
122    in other cases error is called.  */
123
124 tree
125 convert_to_real (tree type, tree expr)
126 {
127   enum built_in_function fcode = builtin_mathfn_code (expr);
128   tree itype = TREE_TYPE (expr);
129
130   /* Disable until we figure out how to decide whether the functions are
131      present in runtime.  */
132   /* Convert (float)sqrt((double)x) where x is float into sqrtf(x) */
133   if (optimize
134       && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
135           || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
136     {
137       switch (fcode)
138         {
139 #define CASE_MATHFN(FN) case BUILT_IN_##FN: case BUILT_IN_##FN##L:
140           CASE_MATHFN (ACOS)
141           CASE_MATHFN (ACOSH)
142           CASE_MATHFN (ASIN)
143           CASE_MATHFN (ASINH)
144           CASE_MATHFN (ATAN)
145           CASE_MATHFN (ATANH)
146           CASE_MATHFN (CBRT)
147           CASE_MATHFN (COS)
148           CASE_MATHFN (COSH)
149           CASE_MATHFN (ERF)
150           CASE_MATHFN (ERFC)
151           CASE_MATHFN (EXP)
152           CASE_MATHFN (EXP10)
153           CASE_MATHFN (EXP2)
154           CASE_MATHFN (EXPM1)
155           CASE_MATHFN (FABS)
156           CASE_MATHFN (GAMMA)
157           CASE_MATHFN (J0)
158           CASE_MATHFN (J1)
159           CASE_MATHFN (LGAMMA)
160           CASE_MATHFN (LOG)
161           CASE_MATHFN (LOG10)
162           CASE_MATHFN (LOG1P)
163           CASE_MATHFN (LOG2)
164           CASE_MATHFN (LOGB)
165           CASE_MATHFN (POW10)
166           CASE_MATHFN (SIN)
167           CASE_MATHFN (SINH)
168           CASE_MATHFN (SQRT)
169           CASE_MATHFN (TAN)
170           CASE_MATHFN (TANH)
171           CASE_MATHFN (TGAMMA)
172           CASE_MATHFN (Y0)
173           CASE_MATHFN (Y1)
174 #undef CASE_MATHFN
175             {
176               tree arg0 = strip_float_extensions (TREE_VALUE (TREE_OPERAND (expr, 1)));
177               tree newtype = type;
178
179               /* We have (outertype)sqrt((innertype)x).  Choose the wider mode from
180                  the both as the safe type for operation.  */
181               if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type))
182                 newtype = TREE_TYPE (arg0);
183
184               /* Be careful about integer to fp conversions.
185                  These may overflow still.  */
186               if (FLOAT_TYPE_P (TREE_TYPE (arg0))
187                   && TYPE_PRECISION (newtype) < TYPE_PRECISION (itype)
188                   && (TYPE_MODE (newtype) == TYPE_MODE (double_type_node)
189                       || TYPE_MODE (newtype) == TYPE_MODE (float_type_node)))
190                 {
191                   tree arglist;
192                   tree fn = mathfn_built_in (newtype, fcode);
193
194                   if (fn)
195                   {
196                     arglist = build_tree_list (NULL_TREE, fold (convert_to_real (newtype, arg0)));
197                     expr = build_function_call_expr (fn, arglist);
198                     if (newtype == type)
199                       return expr;
200                   }
201                 }
202             }
203         default:
204           break;
205         }
206     }
207   if (optimize
208       && (((fcode == BUILT_IN_FLOORL
209            || fcode == BUILT_IN_CEILL
210            || fcode == BUILT_IN_ROUNDL
211            || fcode == BUILT_IN_RINTL
212            || fcode == BUILT_IN_TRUNCL
213            || fcode == BUILT_IN_NEARBYINTL)
214           && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
215               || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
216           || ((fcode == BUILT_IN_FLOOR
217                || fcode == BUILT_IN_CEIL
218                || fcode == BUILT_IN_ROUND
219                || fcode == BUILT_IN_RINT
220                || fcode == BUILT_IN_TRUNC
221                || fcode == BUILT_IN_NEARBYINT)
222               && (TYPE_MODE (type) == TYPE_MODE (float_type_node)))))
223     {
224       tree fn = mathfn_built_in (type, fcode);
225
226       if (fn)
227         {
228           tree arg0 = strip_float_extensions (TREE_VALUE (TREE_OPERAND (expr,
229                                                                         1)));
230           tree arglist = build_tree_list (NULL_TREE,
231                                           fold (convert_to_real (type, arg0)));
232
233           return build_function_call_expr (fn, arglist);
234         }
235     }
236
237   /* Propagate the cast into the operation.  */
238   if (itype != type && FLOAT_TYPE_P (type))
239     switch (TREE_CODE (expr))
240       {
241         /* Convert (float)-x into -(float)x.  This is always safe.  */
242         case ABS_EXPR:
243         case NEGATE_EXPR:
244           if (TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (expr)))
245             return build1 (TREE_CODE (expr), type,
246                            fold (convert_to_real (type,
247                                                   TREE_OPERAND (expr, 0))));
248           break;
249         /* Convert (outertype)((innertype0)a+(innertype1)b)
250            into ((newtype)a+(newtype)b) where newtype
251            is the widest mode from all of these.  */
252         case PLUS_EXPR:
253         case MINUS_EXPR:
254         case MULT_EXPR:
255         case RDIV_EXPR:
256            {
257              tree arg0 = strip_float_extensions (TREE_OPERAND (expr, 0));
258              tree arg1 = strip_float_extensions (TREE_OPERAND (expr, 1));
259
260              if (FLOAT_TYPE_P (TREE_TYPE (arg0))
261                  && FLOAT_TYPE_P (TREE_TYPE (arg1)))
262                {
263                   tree newtype = type;
264                   if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (newtype))
265                     newtype = TREE_TYPE (arg0);
266                   if (TYPE_PRECISION (TREE_TYPE (arg1)) > TYPE_PRECISION (newtype))
267                     newtype = TREE_TYPE (arg1);
268                   if (TYPE_PRECISION (newtype) < TYPE_PRECISION (itype))
269                     {
270                       expr = build2 (TREE_CODE (expr), newtype,
271                                      fold (convert_to_real (newtype, arg0)),
272                                      fold (convert_to_real (newtype, arg1)));
273                       if (newtype == type)
274                         return expr;
275                     }
276                }
277            }
278           break;
279         default:
280           break;
281       }
282
283   switch (TREE_CODE (TREE_TYPE (expr)))
284     {
285     case REAL_TYPE:
286       return build1 (flag_float_store ? CONVERT_EXPR : NOP_EXPR,
287                      type, expr);
288
289     case INTEGER_TYPE:
290     case ENUMERAL_TYPE:
291     case BOOLEAN_TYPE:
292     case CHAR_TYPE:
293       return build1 (FLOAT_EXPR, type, expr);
294
295     case COMPLEX_TYPE:
296       return convert (type,
297                       fold (build1 (REALPART_EXPR,
298                                     TREE_TYPE (TREE_TYPE (expr)), expr)));
299
300     case POINTER_TYPE:
301     case REFERENCE_TYPE:
302       error ("pointer value used where a floating point value was expected");
303       return convert_to_real (type, integer_zero_node);
304
305     default:
306       error ("aggregate value used where a float was expected");
307       return convert_to_real (type, integer_zero_node);
308     }
309 }
310
311 /* Convert EXPR to some integer (or enum) type TYPE.
312
313    EXPR must be pointer, integer, discrete (enum, char, or bool), float, or
314    vector; in other cases error is called.
315
316    The result of this is always supposed to be a newly created tree node
317    not in use in any existing structure.  */
318
319 tree
320 convert_to_integer (tree type, tree expr)
321 {
322   enum tree_code ex_form = TREE_CODE (expr);
323   tree intype = TREE_TYPE (expr);
324   unsigned int inprec = TYPE_PRECISION (intype);
325   unsigned int outprec = TYPE_PRECISION (type);
326
327   /* An INTEGER_TYPE cannot be incomplete, but an ENUMERAL_TYPE can
328      be.  Consider `enum E = { a, b = (enum E) 3 };'.  */
329   if (!COMPLETE_TYPE_P (type))
330     {
331       error ("conversion to incomplete type");
332       return error_mark_node;
333     }
334
335   /* Convert e.g. (long)round(d) -> lround(d).  */
336   /* If we're converting to char, we may encounter differing behavior
337      between converting from double->char vs double->long->char.
338      We're in "undefined" territory but we prefer to be conservative,
339      so only proceed in "unsafe" math mode.  */
340   if (optimize
341       && (flag_unsafe_math_optimizations
342           || (long_integer_type_node
343               && outprec >= TYPE_PRECISION (long_integer_type_node))))
344     {
345       tree s_expr = strip_float_extensions (expr);
346       tree s_intype = TREE_TYPE (s_expr);
347       const enum built_in_function fcode = builtin_mathfn_code (s_expr);
348       tree fn = 0;
349       
350       switch (fcode)
351         {
352         case BUILT_IN_CEIL: case BUILT_IN_CEILF: case BUILT_IN_CEILL:
353           /* Only convert in ISO C99 mode.  */
354           if (!TARGET_C99_FUNCTIONS)
355             break;
356           if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (long_long_integer_type_node))
357             fn = mathfn_built_in (s_intype, BUILT_IN_LLCEIL);
358           else
359             fn = mathfn_built_in (s_intype, BUILT_IN_LCEIL);
360           break;
361
362         case BUILT_IN_FLOOR: case BUILT_IN_FLOORF: case BUILT_IN_FLOORL:
363           /* Only convert in ISO C99 mode.  */
364           if (!TARGET_C99_FUNCTIONS)
365             break;
366           if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (long_long_integer_type_node))
367             fn = mathfn_built_in (s_intype, BUILT_IN_LLFLOOR);
368           else
369             fn = mathfn_built_in (s_intype, BUILT_IN_LFLOOR);
370           break;
371
372         case BUILT_IN_ROUND: case BUILT_IN_ROUNDF: case BUILT_IN_ROUNDL:
373           if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (long_long_integer_type_node))
374             fn = mathfn_built_in (s_intype, BUILT_IN_LLROUND);
375           else
376             fn = mathfn_built_in (s_intype, BUILT_IN_LROUND);
377           break;
378
379         case BUILT_IN_RINT: case BUILT_IN_RINTF: case BUILT_IN_RINTL:
380           /* Only convert rint* if we can ignore math exceptions.  */
381           if (flag_trapping_math)
382             break;
383           /* ... Fall through ...  */
384         case BUILT_IN_NEARBYINT: case BUILT_IN_NEARBYINTF: case BUILT_IN_NEARBYINTL:
385           if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (long_long_integer_type_node))
386             fn = mathfn_built_in (s_intype, BUILT_IN_LLRINT);
387           else
388             fn = mathfn_built_in (s_intype, BUILT_IN_LRINT);
389           break;
390
391         case BUILT_IN_TRUNC: case BUILT_IN_TRUNCF: case BUILT_IN_TRUNCL:
392           {
393             tree arglist = TREE_OPERAND (s_expr, 1);
394             return convert_to_integer (type, TREE_VALUE (arglist));
395           }
396
397         default:
398           break;
399         }
400       
401       if (fn)
402         {
403           tree arglist = TREE_OPERAND (s_expr, 1);
404           tree newexpr = build_function_call_expr (fn, arglist);
405           return convert_to_integer (type, newexpr);
406         }
407     }
408
409   switch (TREE_CODE (intype))
410     {
411     case POINTER_TYPE:
412     case REFERENCE_TYPE:
413       if (integer_zerop (expr))
414         return build_int_cst (type, 0);
415
416       /* Convert to an unsigned integer of the correct width first,
417          and from there widen/truncate to the required type.  */
418       expr = fold_build1 (CONVERT_EXPR,
419                           lang_hooks.types.type_for_size (POINTER_SIZE, 0),
420                           expr);
421       return fold_build1 (NOP_EXPR, type, expr);
422
423     case INTEGER_TYPE:
424     case ENUMERAL_TYPE:
425     case BOOLEAN_TYPE:
426     case CHAR_TYPE:
427       /* If this is a logical operation, which just returns 0 or 1, we can
428          change the type of the expression.  */
429
430       if (TREE_CODE_CLASS (ex_form) == tcc_comparison)
431         {
432           expr = copy_node (expr);
433           TREE_TYPE (expr) = type;
434           return expr;
435         }
436
437       /* If we are widening the type, put in an explicit conversion.
438          Similarly if we are not changing the width.  After this, we know
439          we are truncating EXPR.  */
440
441       else if (outprec >= inprec)
442         {
443           enum tree_code code;
444
445           /* If the precision of the EXPR's type is K bits and the
446              destination mode has more bits, and the sign is changing,
447              it is not safe to use a NOP_EXPR.  For example, suppose
448              that EXPR's type is a 3-bit unsigned integer type, the
449              TYPE is a 3-bit signed integer type, and the machine mode
450              for the types is 8-bit QImode.  In that case, the
451              conversion necessitates an explicit sign-extension.  In
452              the signed-to-unsigned case the high-order bits have to
453              be cleared.  */
454           if (TYPE_UNSIGNED (type) != TYPE_UNSIGNED (TREE_TYPE (expr))
455               && (TYPE_PRECISION (TREE_TYPE (expr))
456                   != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (expr)))))
457             code = CONVERT_EXPR;
458           else
459             code = NOP_EXPR;
460
461           return build1 (code, type, expr);
462         }
463
464       /* If TYPE is an enumeral type or a type with a precision less
465          than the number of bits in its mode, do the conversion to the
466          type corresponding to its mode, then do a nop conversion
467          to TYPE.  */
468       else if (TREE_CODE (type) == ENUMERAL_TYPE
469                || outprec != GET_MODE_BITSIZE (TYPE_MODE (type)))
470         return build1 (NOP_EXPR, type,
471                        convert (lang_hooks.types.type_for_mode
472                                 (TYPE_MODE (type), TYPE_UNSIGNED (type)),
473                                 expr));
474
475       /* Here detect when we can distribute the truncation down past some
476          arithmetic.  For example, if adding two longs and converting to an
477          int, we can equally well convert both to ints and then add.
478          For the operations handled here, such truncation distribution
479          is always safe.
480          It is desirable in these cases:
481          1) when truncating down to full-word from a larger size
482          2) when truncating takes no work.
483          3) when at least one operand of the arithmetic has been extended
484          (as by C's default conversions).  In this case we need two conversions
485          if we do the arithmetic as already requested, so we might as well
486          truncate both and then combine.  Perhaps that way we need only one.
487
488          Note that in general we cannot do the arithmetic in a type
489          shorter than the desired result of conversion, even if the operands
490          are both extended from a shorter type, because they might overflow
491          if combined in that type.  The exceptions to this--the times when
492          two narrow values can be combined in their narrow type even to
493          make a wider result--are handled by "shorten" in build_binary_op.  */
494
495       switch (ex_form)
496         {
497         case RSHIFT_EXPR:
498           /* We can pass truncation down through right shifting
499              when the shift count is a nonpositive constant.  */
500           if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
501               && tree_int_cst_lt (TREE_OPERAND (expr, 1),
502                                   convert (TREE_TYPE (TREE_OPERAND (expr, 1)),
503                                            integer_one_node)))
504             goto trunc1;
505           break;
506
507         case LSHIFT_EXPR:
508           /* We can pass truncation down through left shifting
509              when the shift count is a nonnegative constant and
510              the target type is unsigned.  */
511           if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
512               && tree_int_cst_sgn (TREE_OPERAND (expr, 1)) >= 0
513               && TYPE_UNSIGNED (type)
514               && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
515             {
516               /* If shift count is less than the width of the truncated type,
517                  really shift.  */
518               if (tree_int_cst_lt (TREE_OPERAND (expr, 1), TYPE_SIZE (type)))
519                 /* In this case, shifting is like multiplication.  */
520                 goto trunc1;
521               else
522                 {
523                   /* If it is >= that width, result is zero.
524                      Handling this with trunc1 would give the wrong result:
525                      (int) ((long long) a << 32) is well defined (as 0)
526                      but (int) a << 32 is undefined and would get a
527                      warning.  */
528
529                   tree t = convert_to_integer (type, integer_zero_node);
530
531                   /* If the original expression had side-effects, we must
532                      preserve it.  */
533                   if (TREE_SIDE_EFFECTS (expr))
534                     return build2 (COMPOUND_EXPR, type, expr, t);
535                   else
536                     return t;
537                 }
538             }
539           break;
540
541         case MAX_EXPR:
542         case MIN_EXPR:
543         case MULT_EXPR:
544           {
545             tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
546             tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
547
548             /* Don't distribute unless the output precision is at least as big
549                as the actual inputs.  Otherwise, the comparison of the
550                truncated values will be wrong.  */
551             if (outprec >= TYPE_PRECISION (TREE_TYPE (arg0))
552                 && outprec >= TYPE_PRECISION (TREE_TYPE (arg1))
553                 /* If signedness of arg0 and arg1 don't match,
554                    we can't necessarily find a type to compare them in.  */
555                 && (TYPE_UNSIGNED (TREE_TYPE (arg0))
556                     == TYPE_UNSIGNED (TREE_TYPE (arg1))))
557               goto trunc1;
558             break;
559           }
560
561         case PLUS_EXPR:
562         case MINUS_EXPR:
563         case BIT_AND_EXPR:
564         case BIT_IOR_EXPR:
565         case BIT_XOR_EXPR:
566         trunc1:
567           {
568             tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
569             tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
570
571             if (outprec >= BITS_PER_WORD
572                 || TRULY_NOOP_TRUNCATION (outprec, inprec)
573                 || inprec > TYPE_PRECISION (TREE_TYPE (arg0))
574                 || inprec > TYPE_PRECISION (TREE_TYPE (arg1)))
575               {
576                 /* Do the arithmetic in type TYPEX,
577                    then convert result to TYPE.  */
578                 tree typex = type;
579
580                 /* Can't do arithmetic in enumeral types
581                    so use an integer type that will hold the values.  */
582                 if (TREE_CODE (typex) == ENUMERAL_TYPE)
583                   typex = lang_hooks.types.type_for_size
584                     (TYPE_PRECISION (typex), TYPE_UNSIGNED (typex));
585
586                 /* But now perhaps TYPEX is as wide as INPREC.
587                    In that case, do nothing special here.
588                    (Otherwise would recurse infinitely in convert.  */
589                 if (TYPE_PRECISION (typex) != inprec)
590                   {
591                     /* Don't do unsigned arithmetic where signed was wanted,
592                        or vice versa.
593                        Exception: if both of the original operands were
594                        unsigned then we can safely do the work as unsigned.
595                        Exception: shift operations take their type solely
596                        from the first argument.
597                        Exception: the LSHIFT_EXPR case above requires that
598                        we perform this operation unsigned lest we produce
599                        signed-overflow undefinedness.
600                        And we may need to do it as unsigned
601                        if we truncate to the original size.  */
602                     if (TYPE_UNSIGNED (TREE_TYPE (expr))
603                         || (TYPE_UNSIGNED (TREE_TYPE (arg0))
604                             && (TYPE_UNSIGNED (TREE_TYPE (arg1))
605                                 || ex_form == LSHIFT_EXPR
606                                 || ex_form == RSHIFT_EXPR
607                                 || ex_form == LROTATE_EXPR
608                                 || ex_form == RROTATE_EXPR))
609                         || ex_form == LSHIFT_EXPR)
610                       typex = lang_hooks.types.unsigned_type (typex);
611                     else
612                       typex = lang_hooks.types.signed_type (typex);
613                     return convert (type,
614                                     fold (build2 (ex_form, typex,
615                                                   convert (typex, arg0),
616                                                   convert (typex, arg1))));
617                   }
618               }
619           }
620           break;
621
622         case NEGATE_EXPR:
623         case BIT_NOT_EXPR:
624           /* This is not correct for ABS_EXPR,
625              since we must test the sign before truncation.  */
626           {
627             tree typex = type;
628
629             /* Can't do arithmetic in enumeral types
630                so use an integer type that will hold the values.  */
631             if (TREE_CODE (typex) == ENUMERAL_TYPE)
632               typex = lang_hooks.types.type_for_size
633                 (TYPE_PRECISION (typex), TYPE_UNSIGNED (typex));
634
635             /* But now perhaps TYPEX is as wide as INPREC.
636                In that case, do nothing special here.
637                (Otherwise would recurse infinitely in convert.  */
638             if (TYPE_PRECISION (typex) != inprec)
639               {
640                 /* Don't do unsigned arithmetic where signed was wanted,
641                    or vice versa.  */
642                 if (TYPE_UNSIGNED (TREE_TYPE (expr)))
643                   typex = lang_hooks.types.unsigned_type (typex);
644                 else
645                   typex = lang_hooks.types.signed_type (typex);
646                 return convert (type,
647                                 fold (build1 (ex_form, typex,
648                                               convert (typex,
649                                                        TREE_OPERAND (expr, 0)))));
650               }
651           }
652
653         case NOP_EXPR:
654           /* Don't introduce a
655              "can't convert between vector values of different size" error.  */
656           if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == VECTOR_TYPE
657               && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_OPERAND (expr, 0))))
658                   != GET_MODE_SIZE (TYPE_MODE (type))))
659             break;
660           /* If truncating after truncating, might as well do all at once.
661              If truncating after extending, we may get rid of wasted work.  */
662           return convert (type, get_unwidened (TREE_OPERAND (expr, 0), type));
663
664         case COND_EXPR:
665           /* It is sometimes worthwhile to push the narrowing down through
666              the conditional and never loses.  */
667           return fold (build3 (COND_EXPR, type, TREE_OPERAND (expr, 0),
668                                convert (type, TREE_OPERAND (expr, 1)),
669                                convert (type, TREE_OPERAND (expr, 2))));
670
671         default:
672           break;
673         }
674
675       return build1 (CONVERT_EXPR, type, expr);
676
677     case REAL_TYPE:
678       return build1 (FIX_TRUNC_EXPR, type, expr);
679
680     case COMPLEX_TYPE:
681       return convert (type,
682                       fold (build1 (REALPART_EXPR,
683                                     TREE_TYPE (TREE_TYPE (expr)), expr)));
684
685     case VECTOR_TYPE:
686       if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr))))
687         {
688           error ("can't convert between vector values of different size");
689           return error_mark_node;
690         }
691       return build1 (NOP_EXPR, type, expr);
692
693     default:
694       error ("aggregate value used where an integer was expected");
695       return convert (type, integer_zero_node);
696     }
697 }
698
699 /* Convert EXPR to the complex type TYPE in the usual ways.  */
700
701 tree
702 convert_to_complex (tree type, tree expr)
703 {
704   tree subtype = TREE_TYPE (type);
705
706   switch (TREE_CODE (TREE_TYPE (expr)))
707     {
708     case REAL_TYPE:
709     case INTEGER_TYPE:
710     case ENUMERAL_TYPE:
711     case BOOLEAN_TYPE:
712     case CHAR_TYPE:
713       return build2 (COMPLEX_EXPR, type, convert (subtype, expr),
714                      convert (subtype, integer_zero_node));
715
716     case COMPLEX_TYPE:
717       {
718         tree elt_type = TREE_TYPE (TREE_TYPE (expr));
719
720         if (TYPE_MAIN_VARIANT (elt_type) == TYPE_MAIN_VARIANT (subtype))
721           return expr;
722         else if (TREE_CODE (expr) == COMPLEX_EXPR)
723           return fold (build2 (COMPLEX_EXPR, type,
724                                convert (subtype, TREE_OPERAND (expr, 0)),
725                                convert (subtype, TREE_OPERAND (expr, 1))));
726         else
727           {
728             expr = save_expr (expr);
729             return
730               fold (build2 (COMPLEX_EXPR, type,
731                             convert (subtype,
732                                      fold (build1 (REALPART_EXPR,
733                                                    TREE_TYPE (TREE_TYPE (expr)),
734                                                    expr))),
735                             convert (subtype,
736                                      fold (build1 (IMAGPART_EXPR,
737                                                    TREE_TYPE (TREE_TYPE (expr)),
738                                                    expr)))));
739           }
740       }
741
742     case POINTER_TYPE:
743     case REFERENCE_TYPE:
744       error ("pointer value used where a complex was expected");
745       return convert_to_complex (type, integer_zero_node);
746
747     default:
748       error ("aggregate value used where a complex was expected");
749       return convert_to_complex (type, integer_zero_node);
750     }
751 }
752
753 /* Convert EXPR to the vector type TYPE in the usual ways.  */
754
755 tree
756 convert_to_vector (tree type, tree expr)
757 {
758   switch (TREE_CODE (TREE_TYPE (expr)))
759     {
760     case INTEGER_TYPE:
761     case VECTOR_TYPE:
762       if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr))))
763         {
764           error ("can't convert between vector values of different size");
765           return error_mark_node;
766         }
767       return build1 (NOP_EXPR, type, expr);
768
769     default:
770       error ("can't convert value to a vector");
771       return error_mark_node;
772     }
773 }