xref: /dragonfly/contrib/gcc-4.7/gcc/convert.c (revision e4b17023)
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, 2010
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 "diagnostic-core.h"
34 #include "langhooks.h"
35 
36 /* Convert EXPR to some pointer or reference type TYPE.
37    EXPR must be pointer, reference, integer, enumeral, or literal zero;
38    in other cases error is called.  */
39 
40 tree
convert_to_pointer(tree type,tree expr)41 convert_to_pointer (tree type, tree expr)
42 {
43   location_t loc = EXPR_LOCATION (expr);
44   if (TREE_TYPE (expr) == type)
45     return expr;
46 
47   switch (TREE_CODE (TREE_TYPE (expr)))
48     {
49     case POINTER_TYPE:
50     case REFERENCE_TYPE:
51       {
52         /* If the pointers point to different address spaces, conversion needs
53 	   to be done via a ADDR_SPACE_CONVERT_EXPR instead of a NOP_EXPR.  */
54 	addr_space_t to_as = TYPE_ADDR_SPACE (TREE_TYPE (type));
55 	addr_space_t from_as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (expr)));
56 
57 	if (to_as == from_as)
58 	  return fold_build1_loc (loc, NOP_EXPR, type, expr);
59 	else
60 	  return fold_build1_loc (loc, ADDR_SPACE_CONVERT_EXPR, type, expr);
61       }
62 
63     case INTEGER_TYPE:
64     case ENUMERAL_TYPE:
65     case BOOLEAN_TYPE:
66       {
67 	/* If the input precision differs from the target pointer type
68 	   precision, first convert the input expression to an integer type of
69 	   the target precision.  Some targets, e.g. VMS, need several pointer
70 	   sizes to coexist so the latter isn't necessarily POINTER_SIZE.  */
71 	unsigned int pprec = TYPE_PRECISION (type);
72 	unsigned int eprec = TYPE_PRECISION (TREE_TYPE (expr));
73 
74  	if (eprec != pprec)
75 	  expr = fold_build1_loc (loc, NOP_EXPR,
76 			      lang_hooks.types.type_for_size (pprec, 0),
77 			      expr);
78       }
79 
80       return fold_build1_loc (loc, CONVERT_EXPR, type, expr);
81 
82     default:
83       error ("cannot convert to a pointer type");
84       return convert_to_pointer (type, integer_zero_node);
85     }
86 }
87 
88 /* Avoid any floating point extensions from EXP.  */
89 tree
strip_float_extensions(tree exp)90 strip_float_extensions (tree exp)
91 {
92   tree sub, expt, subt;
93 
94   /*  For floating point constant look up the narrowest type that can hold
95       it properly and handle it like (type)(narrowest_type)constant.
96       This way we can optimize for instance a=a*2.0 where "a" is float
97       but 2.0 is double constant.  */
98   if (TREE_CODE (exp) == REAL_CST && !DECIMAL_FLOAT_TYPE_P (TREE_TYPE (exp)))
99     {
100       REAL_VALUE_TYPE orig;
101       tree type = NULL;
102 
103       orig = TREE_REAL_CST (exp);
104       if (TYPE_PRECISION (TREE_TYPE (exp)) > TYPE_PRECISION (float_type_node)
105 	  && exact_real_truncate (TYPE_MODE (float_type_node), &orig))
106 	type = float_type_node;
107       else if (TYPE_PRECISION (TREE_TYPE (exp))
108 	       > TYPE_PRECISION (double_type_node)
109 	       && exact_real_truncate (TYPE_MODE (double_type_node), &orig))
110 	type = double_type_node;
111       if (type)
112 	return build_real (type, real_value_truncate (TYPE_MODE (type), orig));
113     }
114 
115   if (!CONVERT_EXPR_P (exp))
116     return exp;
117 
118   sub = TREE_OPERAND (exp, 0);
119   subt = TREE_TYPE (sub);
120   expt = TREE_TYPE (exp);
121 
122   if (!FLOAT_TYPE_P (subt))
123     return exp;
124 
125   if (DECIMAL_FLOAT_TYPE_P (expt) != DECIMAL_FLOAT_TYPE_P (subt))
126     return exp;
127 
128   if (TYPE_PRECISION (subt) > TYPE_PRECISION (expt))
129     return exp;
130 
131   return strip_float_extensions (sub);
132 }
133 
134 
135 /* Convert EXPR to some floating-point type TYPE.
136 
137    EXPR must be float, fixed-point, integer, or enumeral;
138    in other cases error is called.  */
139 
140 tree
convert_to_real(tree type,tree expr)141 convert_to_real (tree type, tree expr)
142 {
143   enum built_in_function fcode = builtin_mathfn_code (expr);
144   tree itype = TREE_TYPE (expr);
145 
146   /* Disable until we figure out how to decide whether the functions are
147      present in runtime.  */
148   /* Convert (float)sqrt((double)x) where x is float into sqrtf(x) */
149   if (optimize
150       && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
151           || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
152     {
153       switch (fcode)
154         {
155 #define CASE_MATHFN(FN) case BUILT_IN_##FN: case BUILT_IN_##FN##L:
156 	  CASE_MATHFN (COSH)
157 	  CASE_MATHFN (EXP)
158 	  CASE_MATHFN (EXP10)
159 	  CASE_MATHFN (EXP2)
160  	  CASE_MATHFN (EXPM1)
161 	  CASE_MATHFN (GAMMA)
162 	  CASE_MATHFN (J0)
163 	  CASE_MATHFN (J1)
164 	  CASE_MATHFN (LGAMMA)
165 	  CASE_MATHFN (POW10)
166 	  CASE_MATHFN (SINH)
167 	  CASE_MATHFN (TGAMMA)
168 	  CASE_MATHFN (Y0)
169 	  CASE_MATHFN (Y1)
170 	    /* The above functions may set errno differently with float
171 	       input or output so this transformation is not safe with
172 	       -fmath-errno.  */
173 	    if (flag_errno_math)
174 	      break;
175 	  CASE_MATHFN (ACOS)
176 	  CASE_MATHFN (ACOSH)
177 	  CASE_MATHFN (ASIN)
178  	  CASE_MATHFN (ASINH)
179  	  CASE_MATHFN (ATAN)
180 	  CASE_MATHFN (ATANH)
181  	  CASE_MATHFN (CBRT)
182  	  CASE_MATHFN (COS)
183  	  CASE_MATHFN (ERF)
184  	  CASE_MATHFN (ERFC)
185  	  CASE_MATHFN (FABS)
186 	  CASE_MATHFN (LOG)
187 	  CASE_MATHFN (LOG10)
188 	  CASE_MATHFN (LOG2)
189  	  CASE_MATHFN (LOG1P)
190  	  CASE_MATHFN (LOGB)
191  	  CASE_MATHFN (SIN)
192 	  CASE_MATHFN (SQRT)
193  	  CASE_MATHFN (TAN)
194  	  CASE_MATHFN (TANH)
195 #undef CASE_MATHFN
196 	    {
197 	      tree arg0 = strip_float_extensions (CALL_EXPR_ARG (expr, 0));
198 	      tree newtype = type;
199 
200 	      /* We have (outertype)sqrt((innertype)x).  Choose the wider mode from
201 		 the both as the safe type for operation.  */
202 	      if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type))
203 		newtype = TREE_TYPE (arg0);
204 
205 	      /* Be careful about integer to fp conversions.
206 		 These may overflow still.  */
207 	      if (FLOAT_TYPE_P (TREE_TYPE (arg0))
208 		  && TYPE_PRECISION (newtype) < TYPE_PRECISION (itype)
209 		  && (TYPE_MODE (newtype) == TYPE_MODE (double_type_node)
210 		      || TYPE_MODE (newtype) == TYPE_MODE (float_type_node)))
211 	        {
212 		  tree fn = mathfn_built_in (newtype, fcode);
213 
214 		  if (fn)
215 		  {
216 		    tree arg = fold (convert_to_real (newtype, arg0));
217 		    expr = build_call_expr (fn, 1, arg);
218 		    if (newtype == type)
219 		      return expr;
220 		  }
221 		}
222 	    }
223 	default:
224 	  break;
225 	}
226     }
227   if (optimize
228       && (((fcode == BUILT_IN_FLOORL
229 	   || fcode == BUILT_IN_CEILL
230 	   || fcode == BUILT_IN_ROUNDL
231 	   || fcode == BUILT_IN_RINTL
232 	   || fcode == BUILT_IN_TRUNCL
233 	   || fcode == BUILT_IN_NEARBYINTL)
234 	  && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
235 	      || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
236 	  || ((fcode == BUILT_IN_FLOOR
237 	       || fcode == BUILT_IN_CEIL
238 	       || fcode == BUILT_IN_ROUND
239 	       || fcode == BUILT_IN_RINT
240 	       || fcode == BUILT_IN_TRUNC
241 	       || fcode == BUILT_IN_NEARBYINT)
242 	      && (TYPE_MODE (type) == TYPE_MODE (float_type_node)))))
243     {
244       tree fn = mathfn_built_in (type, fcode);
245 
246       if (fn)
247 	{
248 	  tree arg = strip_float_extensions (CALL_EXPR_ARG (expr, 0));
249 
250 	  /* Make sure (type)arg0 is an extension, otherwise we could end up
251 	     changing (float)floor(double d) into floorf((float)d), which is
252 	     incorrect because (float)d uses round-to-nearest and can round
253 	     up to the next integer.  */
254 	  if (TYPE_PRECISION (type) >= TYPE_PRECISION (TREE_TYPE (arg)))
255 	    return build_call_expr (fn, 1, fold (convert_to_real (type, arg)));
256 	}
257     }
258 
259   /* Propagate the cast into the operation.  */
260   if (itype != type && FLOAT_TYPE_P (type))
261     switch (TREE_CODE (expr))
262       {
263 	/* Convert (float)-x into -(float)x.  This is safe for
264 	   round-to-nearest rounding mode.  */
265 	case ABS_EXPR:
266 	case NEGATE_EXPR:
267 	  if (!flag_rounding_math
268 	      && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (expr)))
269 	    return build1 (TREE_CODE (expr), type,
270 			   fold (convert_to_real (type,
271 						  TREE_OPERAND (expr, 0))));
272 	  break;
273 	/* Convert (outertype)((innertype0)a+(innertype1)b)
274 	   into ((newtype)a+(newtype)b) where newtype
275 	   is the widest mode from all of these.  */
276 	case PLUS_EXPR:
277 	case MINUS_EXPR:
278 	case MULT_EXPR:
279 	case RDIV_EXPR:
280 	   {
281 	     tree arg0 = strip_float_extensions (TREE_OPERAND (expr, 0));
282 	     tree arg1 = strip_float_extensions (TREE_OPERAND (expr, 1));
283 
284 	     if (FLOAT_TYPE_P (TREE_TYPE (arg0))
285 		 && FLOAT_TYPE_P (TREE_TYPE (arg1))
286 		 && DECIMAL_FLOAT_TYPE_P (itype) == DECIMAL_FLOAT_TYPE_P (type))
287 	       {
288 		  tree newtype = type;
289 
290 		  if (TYPE_MODE (TREE_TYPE (arg0)) == SDmode
291 		      || TYPE_MODE (TREE_TYPE (arg1)) == SDmode
292 		      || TYPE_MODE (type) == SDmode)
293 		    newtype = dfloat32_type_node;
294 		  if (TYPE_MODE (TREE_TYPE (arg0)) == DDmode
295 		      || TYPE_MODE (TREE_TYPE (arg1)) == DDmode
296 		      || TYPE_MODE (type) == DDmode)
297 		    newtype = dfloat64_type_node;
298 		  if (TYPE_MODE (TREE_TYPE (arg0)) == TDmode
299 		      || TYPE_MODE (TREE_TYPE (arg1)) == TDmode
300 		      || TYPE_MODE (type) == TDmode)
301                     newtype = dfloat128_type_node;
302 		  if (newtype == dfloat32_type_node
303 		      || newtype == dfloat64_type_node
304 		      || newtype == dfloat128_type_node)
305 		    {
306 		      expr = build2 (TREE_CODE (expr), newtype,
307 				     fold (convert_to_real (newtype, arg0)),
308 				     fold (convert_to_real (newtype, arg1)));
309 		      if (newtype == type)
310 			return expr;
311 		      break;
312 		    }
313 
314 		  if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (newtype))
315 		    newtype = TREE_TYPE (arg0);
316 		  if (TYPE_PRECISION (TREE_TYPE (arg1)) > TYPE_PRECISION (newtype))
317 		    newtype = TREE_TYPE (arg1);
318 		  /* Sometimes this transformation is safe (cannot
319 		     change results through affecting double rounding
320 		     cases) and sometimes it is not.  If NEWTYPE is
321 		     wider than TYPE, e.g. (float)((long double)double
322 		     + (long double)double) converted to
323 		     (float)(double + double), the transformation is
324 		     unsafe regardless of the details of the types
325 		     involved; double rounding can arise if the result
326 		     of NEWTYPE arithmetic is a NEWTYPE value half way
327 		     between two representable TYPE values but the
328 		     exact value is sufficiently different (in the
329 		     right direction) for this difference to be
330 		     visible in ITYPE arithmetic.  If NEWTYPE is the
331 		     same as TYPE, however, the transformation may be
332 		     safe depending on the types involved: it is safe
333 		     if the ITYPE has strictly more than twice as many
334 		     mantissa bits as TYPE, can represent infinities
335 		     and NaNs if the TYPE can, and has sufficient
336 		     exponent range for the product or ratio of two
337 		     values representable in the TYPE to be within the
338 		     range of normal values of ITYPE.  */
339 		  if (TYPE_PRECISION (newtype) < TYPE_PRECISION (itype)
340 		      && (flag_unsafe_math_optimizations
341 			  || (TYPE_PRECISION (newtype) == TYPE_PRECISION (type)
342 			      && real_can_shorten_arithmetic (TYPE_MODE (itype),
343 							      TYPE_MODE (type))
344 			      && !excess_precision_type (newtype))))
345 		    {
346 		      expr = build2 (TREE_CODE (expr), newtype,
347 				     fold (convert_to_real (newtype, arg0)),
348 				     fold (convert_to_real (newtype, arg1)));
349 		      if (newtype == type)
350 			return expr;
351 		    }
352 	       }
353 	   }
354 	  break;
355 	default:
356 	  break;
357       }
358 
359   switch (TREE_CODE (TREE_TYPE (expr)))
360     {
361     case REAL_TYPE:
362       /* Ignore the conversion if we don't need to store intermediate
363 	 results and neither type is a decimal float.  */
364       return build1 ((flag_float_store
365 		     || DECIMAL_FLOAT_TYPE_P (type)
366 		     || DECIMAL_FLOAT_TYPE_P (itype))
367 		     ? CONVERT_EXPR : NOP_EXPR, type, expr);
368 
369     case INTEGER_TYPE:
370     case ENUMERAL_TYPE:
371     case BOOLEAN_TYPE:
372       return build1 (FLOAT_EXPR, type, expr);
373 
374     case FIXED_POINT_TYPE:
375       return build1 (FIXED_CONVERT_EXPR, type, expr);
376 
377     case COMPLEX_TYPE:
378       return convert (type,
379 		      fold_build1 (REALPART_EXPR,
380 				   TREE_TYPE (TREE_TYPE (expr)), expr));
381 
382     case POINTER_TYPE:
383     case REFERENCE_TYPE:
384       error ("pointer value used where a floating point value was expected");
385       return convert_to_real (type, integer_zero_node);
386 
387     default:
388       error ("aggregate value used where a float was expected");
389       return convert_to_real (type, integer_zero_node);
390     }
391 }
392 
393 /* Convert EXPR to some integer (or enum) type TYPE.
394 
395    EXPR must be pointer, integer, discrete (enum, char, or bool), float,
396    fixed-point or vector; in other cases error is called.
397 
398    The result of this is always supposed to be a newly created tree node
399    not in use in any existing structure.  */
400 
401 tree
convert_to_integer(tree type,tree expr)402 convert_to_integer (tree type, tree expr)
403 {
404   enum tree_code ex_form = TREE_CODE (expr);
405   tree intype = TREE_TYPE (expr);
406   unsigned int inprec = TYPE_PRECISION (intype);
407   unsigned int outprec = TYPE_PRECISION (type);
408 
409   /* An INTEGER_TYPE cannot be incomplete, but an ENUMERAL_TYPE can
410      be.  Consider `enum E = { a, b = (enum E) 3 };'.  */
411   if (!COMPLETE_TYPE_P (type))
412     {
413       error ("conversion to incomplete type");
414       return error_mark_node;
415     }
416 
417   /* Convert e.g. (long)round(d) -> lround(d).  */
418   /* If we're converting to char, we may encounter differing behavior
419      between converting from double->char vs double->long->char.
420      We're in "undefined" territory but we prefer to be conservative,
421      so only proceed in "unsafe" math mode.  */
422   if (optimize
423       && (flag_unsafe_math_optimizations
424 	  || (long_integer_type_node
425 	      && outprec >= TYPE_PRECISION (long_integer_type_node))))
426     {
427       tree s_expr = strip_float_extensions (expr);
428       tree s_intype = TREE_TYPE (s_expr);
429       const enum built_in_function fcode = builtin_mathfn_code (s_expr);
430       tree fn = 0;
431 
432       switch (fcode)
433         {
434 	CASE_FLT_FN (BUILT_IN_CEIL):
435 	  /* Only convert in ISO C99 mode.  */
436 	  if (!TARGET_C99_FUNCTIONS)
437 	    break;
438 	  if (outprec < TYPE_PRECISION (integer_type_node)
439 	      || (outprec == TYPE_PRECISION (integer_type_node)
440 		  && !TYPE_UNSIGNED (type)))
441 	    fn = mathfn_built_in (s_intype, BUILT_IN_ICEIL);
442 	  else if (outprec == TYPE_PRECISION (long_integer_type_node)
443 		   && !TYPE_UNSIGNED (type))
444 	    fn = mathfn_built_in (s_intype, BUILT_IN_LCEIL);
445 	  else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
446 		   && !TYPE_UNSIGNED (type))
447 	    fn = mathfn_built_in (s_intype, BUILT_IN_LLCEIL);
448 	  break;
449 
450 	CASE_FLT_FN (BUILT_IN_FLOOR):
451 	  /* Only convert in ISO C99 mode.  */
452 	  if (!TARGET_C99_FUNCTIONS)
453 	    break;
454 	  if (outprec < TYPE_PRECISION (integer_type_node)
455 	      || (outprec == TYPE_PRECISION (integer_type_node)
456 		  && !TYPE_UNSIGNED (type)))
457 	    fn = mathfn_built_in (s_intype, BUILT_IN_IFLOOR);
458 	  else if (outprec == TYPE_PRECISION (long_integer_type_node)
459 		   && !TYPE_UNSIGNED (type))
460 	    fn = mathfn_built_in (s_intype, BUILT_IN_LFLOOR);
461 	  else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
462 		   && !TYPE_UNSIGNED (type))
463 	    fn = mathfn_built_in (s_intype, BUILT_IN_LLFLOOR);
464 	  break;
465 
466 	CASE_FLT_FN (BUILT_IN_ROUND):
467 	  /* Only convert in ISO C99 mode.  */
468 	  if (!TARGET_C99_FUNCTIONS)
469 	    break;
470 	  if (outprec < TYPE_PRECISION (integer_type_node)
471 	      || (outprec == TYPE_PRECISION (integer_type_node)
472 		  && !TYPE_UNSIGNED (type)))
473 	    fn = mathfn_built_in (s_intype, BUILT_IN_IROUND);
474 	  else if (outprec == TYPE_PRECISION (long_integer_type_node)
475 		   && !TYPE_UNSIGNED (type))
476 	    fn = mathfn_built_in (s_intype, BUILT_IN_LROUND);
477 	  else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
478 		   && !TYPE_UNSIGNED (type))
479 	    fn = mathfn_built_in (s_intype, BUILT_IN_LLROUND);
480 	  break;
481 
482 	CASE_FLT_FN (BUILT_IN_NEARBYINT):
483 	  /* Only convert nearbyint* if we can ignore math exceptions.  */
484 	  if (flag_trapping_math)
485 	    break;
486 	  /* ... Fall through ...  */
487 	CASE_FLT_FN (BUILT_IN_RINT):
488 	  /* Only convert in ISO C99 mode.  */
489 	  if (!TARGET_C99_FUNCTIONS)
490 	    break;
491 	  if (outprec < TYPE_PRECISION (integer_type_node)
492 	      || (outprec == TYPE_PRECISION (integer_type_node)
493 		  && !TYPE_UNSIGNED (type)))
494 	    fn = mathfn_built_in (s_intype, BUILT_IN_IRINT);
495 	  else if (outprec == TYPE_PRECISION (long_integer_type_node)
496 		   && !TYPE_UNSIGNED (type))
497 	    fn = mathfn_built_in (s_intype, BUILT_IN_LRINT);
498 	  else if (outprec == TYPE_PRECISION (long_long_integer_type_node)
499 		   && !TYPE_UNSIGNED (type))
500 	    fn = mathfn_built_in (s_intype, BUILT_IN_LLRINT);
501 	  break;
502 
503 	CASE_FLT_FN (BUILT_IN_TRUNC):
504 	  return convert_to_integer (type, CALL_EXPR_ARG (s_expr, 0));
505 
506 	default:
507 	  break;
508 	}
509 
510       if (fn)
511         {
512 	  tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0));
513 	  return convert_to_integer (type, newexpr);
514 	}
515     }
516 
517   /* Convert (int)logb(d) -> ilogb(d).  */
518   if (optimize
519       && flag_unsafe_math_optimizations
520       && !flag_trapping_math && !flag_errno_math && flag_finite_math_only
521       && integer_type_node
522       && (outprec > TYPE_PRECISION (integer_type_node)
523 	  || (outprec == TYPE_PRECISION (integer_type_node)
524 	      && !TYPE_UNSIGNED (type))))
525     {
526       tree s_expr = strip_float_extensions (expr);
527       tree s_intype = TREE_TYPE (s_expr);
528       const enum built_in_function fcode = builtin_mathfn_code (s_expr);
529       tree fn = 0;
530 
531       switch (fcode)
532 	{
533 	CASE_FLT_FN (BUILT_IN_LOGB):
534 	  fn = mathfn_built_in (s_intype, BUILT_IN_ILOGB);
535 	  break;
536 
537 	default:
538 	  break;
539 	}
540 
541       if (fn)
542         {
543 	  tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0));
544 	  return convert_to_integer (type, newexpr);
545 	}
546     }
547 
548   switch (TREE_CODE (intype))
549     {
550     case POINTER_TYPE:
551     case REFERENCE_TYPE:
552       if (integer_zerop (expr))
553 	return build_int_cst (type, 0);
554 
555       /* Convert to an unsigned integer of the correct width first, and from
556 	 there widen/truncate to the required type.  Some targets support the
557 	 coexistence of multiple valid pointer sizes, so fetch the one we need
558 	 from the type.  */
559       expr = fold_build1 (CONVERT_EXPR,
560 			  lang_hooks.types.type_for_size
561 			    (TYPE_PRECISION (intype), 0),
562 			  expr);
563       return fold_convert (type, expr);
564 
565     case INTEGER_TYPE:
566     case ENUMERAL_TYPE:
567     case BOOLEAN_TYPE:
568     case OFFSET_TYPE:
569       /* If this is a logical operation, which just returns 0 or 1, we can
570 	 change the type of the expression.  */
571 
572       if (TREE_CODE_CLASS (ex_form) == tcc_comparison)
573 	{
574 	  expr = copy_node (expr);
575 	  TREE_TYPE (expr) = type;
576 	  return expr;
577 	}
578 
579       /* If we are widening the type, put in an explicit conversion.
580 	 Similarly if we are not changing the width.  After this, we know
581 	 we are truncating EXPR.  */
582 
583       else if (outprec >= inprec)
584 	{
585 	  enum tree_code code;
586 	  tree tem;
587 
588 	  /* If the precision of the EXPR's type is K bits and the
589 	     destination mode has more bits, and the sign is changing,
590 	     it is not safe to use a NOP_EXPR.  For example, suppose
591 	     that EXPR's type is a 3-bit unsigned integer type, the
592 	     TYPE is a 3-bit signed integer type, and the machine mode
593 	     for the types is 8-bit QImode.  In that case, the
594 	     conversion necessitates an explicit sign-extension.  In
595 	     the signed-to-unsigned case the high-order bits have to
596 	     be cleared.  */
597 	  if (TYPE_UNSIGNED (type) != TYPE_UNSIGNED (TREE_TYPE (expr))
598 	      && (TYPE_PRECISION (TREE_TYPE (expr))
599 		  != GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (expr)))))
600 	    code = CONVERT_EXPR;
601 	  else
602 	    code = NOP_EXPR;
603 
604 	  tem = fold_unary (code, type, expr);
605 	  if (tem)
606 	    return tem;
607 
608 	  tem = build1 (code, type, expr);
609 	  TREE_NO_WARNING (tem) = 1;
610 	  return tem;
611 	}
612 
613       /* If TYPE is an enumeral type or a type with a precision less
614 	 than the number of bits in its mode, do the conversion to the
615 	 type corresponding to its mode, then do a nop conversion
616 	 to TYPE.  */
617       else if (TREE_CODE (type) == ENUMERAL_TYPE
618 	       || outprec != GET_MODE_PRECISION (TYPE_MODE (type)))
619 	return build1 (NOP_EXPR, type,
620 		       convert (lang_hooks.types.type_for_mode
621 				(TYPE_MODE (type), TYPE_UNSIGNED (type)),
622 				expr));
623 
624       /* Here detect when we can distribute the truncation down past some
625 	 arithmetic.  For example, if adding two longs and converting to an
626 	 int, we can equally well convert both to ints and then add.
627 	 For the operations handled here, such truncation distribution
628 	 is always safe.
629 	 It is desirable in these cases:
630 	 1) when truncating down to full-word from a larger size
631 	 2) when truncating takes no work.
632 	 3) when at least one operand of the arithmetic has been extended
633 	 (as by C's default conversions).  In this case we need two conversions
634 	 if we do the arithmetic as already requested, so we might as well
635 	 truncate both and then combine.  Perhaps that way we need only one.
636 
637 	 Note that in general we cannot do the arithmetic in a type
638 	 shorter than the desired result of conversion, even if the operands
639 	 are both extended from a shorter type, because they might overflow
640 	 if combined in that type.  The exceptions to this--the times when
641 	 two narrow values can be combined in their narrow type even to
642 	 make a wider result--are handled by "shorten" in build_binary_op.  */
643 
644       switch (ex_form)
645 	{
646 	case RSHIFT_EXPR:
647 	  /* We can pass truncation down through right shifting
648 	     when the shift count is a nonpositive constant.  */
649 	  if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
650 	      && tree_int_cst_sgn (TREE_OPERAND (expr, 1)) <= 0)
651 	    goto trunc1;
652 	  break;
653 
654 	case LSHIFT_EXPR:
655 	  /* We can pass truncation down through left shifting
656 	     when the shift count is a nonnegative constant and
657 	     the target type is unsigned.  */
658 	  if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
659 	      && tree_int_cst_sgn (TREE_OPERAND (expr, 1)) >= 0
660 	      && TYPE_UNSIGNED (type)
661 	      && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
662 	    {
663 	      /* If shift count is less than the width of the truncated type,
664 		 really shift.  */
665 	      if (tree_int_cst_lt (TREE_OPERAND (expr, 1), TYPE_SIZE (type)))
666 		/* In this case, shifting is like multiplication.  */
667 		goto trunc1;
668 	      else
669 		{
670 		  /* If it is >= that width, result is zero.
671 		     Handling this with trunc1 would give the wrong result:
672 		     (int) ((long long) a << 32) is well defined (as 0)
673 		     but (int) a << 32 is undefined and would get a
674 		     warning.  */
675 
676 		  tree t = build_int_cst (type, 0);
677 
678 		  /* If the original expression had side-effects, we must
679 		     preserve it.  */
680 		  if (TREE_SIDE_EFFECTS (expr))
681 		    return build2 (COMPOUND_EXPR, type, expr, t);
682 		  else
683 		    return t;
684 		}
685 	    }
686 	  break;
687 
688 	case TRUNC_DIV_EXPR:
689 	  {
690 	    tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
691 	    tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
692 
693 	    /* Don't distribute unless the output precision is at least as big
694 	       as the actual inputs and it has the same signedness.  */
695 	    if (outprec >= TYPE_PRECISION (TREE_TYPE (arg0))
696 		&& outprec >= TYPE_PRECISION (TREE_TYPE (arg1))
697 		/* If signedness of arg0 and arg1 don't match,
698 		   we can't necessarily find a type to compare them in.  */
699 		&& (TYPE_UNSIGNED (TREE_TYPE (arg0))
700 		    == TYPE_UNSIGNED (TREE_TYPE (arg1)))
701 		/* Do not change the sign of the division.  */
702 		&& (TYPE_UNSIGNED (TREE_TYPE (expr))
703 		    == TYPE_UNSIGNED (TREE_TYPE (arg0)))
704 		/* Either require unsigned division or a division by
705 		   a constant that is not -1.  */
706 		&& (TYPE_UNSIGNED (TREE_TYPE (arg0))
707 		    || (TREE_CODE (arg1) == INTEGER_CST
708 			&& !integer_all_onesp (arg1))))
709 	      goto trunc1;
710 	    break;
711 	  }
712 
713 	case MAX_EXPR:
714 	case MIN_EXPR:
715 	case MULT_EXPR:
716 	  {
717 	    tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
718 	    tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
719 
720 	    /* Don't distribute unless the output precision is at least as big
721 	       as the actual inputs.  Otherwise, the comparison of the
722 	       truncated values will be wrong.  */
723 	    if (outprec >= TYPE_PRECISION (TREE_TYPE (arg0))
724 		&& outprec >= TYPE_PRECISION (TREE_TYPE (arg1))
725 		/* If signedness of arg0 and arg1 don't match,
726 		   we can't necessarily find a type to compare them in.  */
727 		&& (TYPE_UNSIGNED (TREE_TYPE (arg0))
728 		    == TYPE_UNSIGNED (TREE_TYPE (arg1))))
729 	      goto trunc1;
730 	    break;
731 	  }
732 
733 	case PLUS_EXPR:
734 	case MINUS_EXPR:
735 	case BIT_AND_EXPR:
736 	case BIT_IOR_EXPR:
737 	case BIT_XOR_EXPR:
738 	trunc1:
739 	  {
740 	    tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
741 	    tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
742 
743 	    /* Do not try to narrow operands of pointer subtraction;
744 	       that will interfere with other folding.  */
745 	    if (ex_form == MINUS_EXPR
746 		&& CONVERT_EXPR_P (arg0)
747 		&& CONVERT_EXPR_P (arg1)
748 		&& POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0)))
749 		&& POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg1, 0))))
750 	      break;
751 
752 	    if (outprec >= BITS_PER_WORD
753 		|| TRULY_NOOP_TRUNCATION (outprec, inprec)
754 		|| inprec > TYPE_PRECISION (TREE_TYPE (arg0))
755 		|| inprec > TYPE_PRECISION (TREE_TYPE (arg1)))
756 	      {
757 		/* Do the arithmetic in type TYPEX,
758 		   then convert result to TYPE.  */
759 		tree typex = type;
760 
761 		/* Can't do arithmetic in enumeral types
762 		   so use an integer type that will hold the values.  */
763 		if (TREE_CODE (typex) == ENUMERAL_TYPE)
764 		  typex = lang_hooks.types.type_for_size
765 		    (TYPE_PRECISION (typex), TYPE_UNSIGNED (typex));
766 
767 		/* But now perhaps TYPEX is as wide as INPREC.
768 		   In that case, do nothing special here.
769 		   (Otherwise would recurse infinitely in convert.  */
770 		if (TYPE_PRECISION (typex) != inprec)
771 		  {
772 		    tree otypex = typex;
773 		    /* Don't do unsigned arithmetic where signed was wanted,
774 		       or vice versa.
775 		       Exception: if both of the original operands were
776 		       unsigned then we can safely do the work as unsigned.
777 		       Exception: shift operations take their type solely
778 		       from the first argument.
779 		       Exception: the LSHIFT_EXPR case above requires that
780 		       we perform this operation unsigned lest we produce
781 		       signed-overflow undefinedness.
782 		       And we may need to do it as unsigned
783 		       if we truncate to the original size.  */
784 		    if (TYPE_UNSIGNED (TREE_TYPE (expr))
785 			|| (TYPE_UNSIGNED (TREE_TYPE (arg0))
786 			    && (TYPE_UNSIGNED (TREE_TYPE (arg1))
787 				|| ex_form == LSHIFT_EXPR
788 				|| ex_form == RSHIFT_EXPR
789 				|| ex_form == LROTATE_EXPR
790 				|| ex_form == RROTATE_EXPR))
791 			|| ex_form == LSHIFT_EXPR
792 			/* If we have !flag_wrapv, and either ARG0 or
793 			   ARG1 is of a signed type, we have to do
794 			   PLUS_EXPR, MINUS_EXPR or MULT_EXPR in an unsigned
795 			   type in case the operation in outprec precision
796 			   could overflow.  Otherwise, we would introduce
797 			   signed-overflow undefinedness.  */
798 			|| ((!TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))
799 			     || !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1)))
800 			    && ((TYPE_PRECISION (TREE_TYPE (arg0)) * 2u
801 				 > outprec)
802 				|| (TYPE_PRECISION (TREE_TYPE (arg1)) * 2u
803 				    > outprec))
804 			    && (ex_form == PLUS_EXPR
805 				|| ex_form == MINUS_EXPR
806 				|| ex_form == MULT_EXPR)))
807 		      typex = unsigned_type_for (typex);
808 		    else
809 		      typex = signed_type_for (typex);
810 
811 		    if (TYPE_PRECISION (otypex) == TYPE_PRECISION (typex))
812 		      return convert (type,
813 				      fold_build2 (ex_form, typex,
814 						   convert (typex, arg0),
815 						   convert (typex, arg1)));
816 		  }
817 	      }
818 	  }
819 	  break;
820 
821 	case NEGATE_EXPR:
822 	case BIT_NOT_EXPR:
823 	  /* This is not correct for ABS_EXPR,
824 	     since we must test the sign before truncation.  */
825 	  {
826 	    tree typex = unsigned_type_for (type);
827 	    return convert (type,
828 			    fold_build1 (ex_form, typex,
829 					 convert (typex,
830 						  TREE_OPERAND (expr, 0))));
831 	  }
832 
833 	case NOP_EXPR:
834 	  /* Don't introduce a
835 	     "can't convert between vector values of different size" error.  */
836 	  if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == VECTOR_TYPE
837 	      && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_OPERAND (expr, 0))))
838 		  != GET_MODE_SIZE (TYPE_MODE (type))))
839 	    break;
840 	  /* If truncating after truncating, might as well do all at once.
841 	     If truncating after extending, we may get rid of wasted work.  */
842 	  return convert (type, get_unwidened (TREE_OPERAND (expr, 0), type));
843 
844 	case COND_EXPR:
845 	  /* It is sometimes worthwhile to push the narrowing down through
846 	     the conditional and never loses.  A COND_EXPR may have a throw
847 	     as one operand, which then has void type.  Just leave void
848 	     operands as they are.  */
849 	  return fold_build3 (COND_EXPR, type, TREE_OPERAND (expr, 0),
850 			      VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 1)))
851 			      ? TREE_OPERAND (expr, 1)
852 			      : convert (type, TREE_OPERAND (expr, 1)),
853 			      VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 2)))
854 			      ? TREE_OPERAND (expr, 2)
855 			      : convert (type, TREE_OPERAND (expr, 2)));
856 
857 	default:
858 	  break;
859 	}
860 
861       /* When parsing long initializers, we might end up with a lot of casts.
862 	 Shortcut this.  */
863       if (TREE_CODE (expr) == INTEGER_CST)
864 	return fold_convert (type, expr);
865       return build1 (CONVERT_EXPR, type, expr);
866 
867     case REAL_TYPE:
868       return build1 (FIX_TRUNC_EXPR, type, expr);
869 
870     case FIXED_POINT_TYPE:
871       return build1 (FIXED_CONVERT_EXPR, type, expr);
872 
873     case COMPLEX_TYPE:
874       return convert (type,
875 		      fold_build1 (REALPART_EXPR,
876 				   TREE_TYPE (TREE_TYPE (expr)), expr));
877 
878     case VECTOR_TYPE:
879       if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr))))
880 	{
881 	  error ("can%'t convert between vector values of different size");
882 	  return error_mark_node;
883 	}
884       return build1 (VIEW_CONVERT_EXPR, type, expr);
885 
886     default:
887       error ("aggregate value used where an integer was expected");
888       return convert (type, integer_zero_node);
889     }
890 }
891 
892 /* Convert EXPR to the complex type TYPE in the usual ways.  */
893 
894 tree
convert_to_complex(tree type,tree expr)895 convert_to_complex (tree type, tree expr)
896 {
897   tree subtype = TREE_TYPE (type);
898 
899   switch (TREE_CODE (TREE_TYPE (expr)))
900     {
901     case REAL_TYPE:
902     case FIXED_POINT_TYPE:
903     case INTEGER_TYPE:
904     case ENUMERAL_TYPE:
905     case BOOLEAN_TYPE:
906       return build2 (COMPLEX_EXPR, type, convert (subtype, expr),
907 		     convert (subtype, integer_zero_node));
908 
909     case COMPLEX_TYPE:
910       {
911 	tree elt_type = TREE_TYPE (TREE_TYPE (expr));
912 
913 	if (TYPE_MAIN_VARIANT (elt_type) == TYPE_MAIN_VARIANT (subtype))
914 	  return expr;
915 	else if (TREE_CODE (expr) == COMPLEX_EXPR)
916 	  return fold_build2 (COMPLEX_EXPR, type,
917 			      convert (subtype, TREE_OPERAND (expr, 0)),
918 			      convert (subtype, TREE_OPERAND (expr, 1)));
919 	else
920 	  {
921 	    expr = save_expr (expr);
922 	    return
923 	      fold_build2 (COMPLEX_EXPR, type,
924 			   convert (subtype,
925 				    fold_build1 (REALPART_EXPR,
926 						 TREE_TYPE (TREE_TYPE (expr)),
927 						 expr)),
928 			   convert (subtype,
929 				    fold_build1 (IMAGPART_EXPR,
930 						 TREE_TYPE (TREE_TYPE (expr)),
931 						 expr)));
932 	  }
933       }
934 
935     case POINTER_TYPE:
936     case REFERENCE_TYPE:
937       error ("pointer value used where a complex was expected");
938       return convert_to_complex (type, integer_zero_node);
939 
940     default:
941       error ("aggregate value used where a complex was expected");
942       return convert_to_complex (type, integer_zero_node);
943     }
944 }
945 
946 /* Convert EXPR to the vector type TYPE in the usual ways.  */
947 
948 tree
convert_to_vector(tree type,tree expr)949 convert_to_vector (tree type, tree expr)
950 {
951   switch (TREE_CODE (TREE_TYPE (expr)))
952     {
953     case INTEGER_TYPE:
954     case VECTOR_TYPE:
955       if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr))))
956 	{
957 	  error ("can%'t convert between vector values of different size");
958 	  return error_mark_node;
959 	}
960       return build1 (VIEW_CONVERT_EXPR, type, expr);
961 
962     default:
963       error ("can%'t convert value to a vector");
964       return error_mark_node;
965     }
966 }
967 
968 /* Convert EXPR to some fixed-point type TYPE.
969 
970    EXPR must be fixed-point, float, integer, or enumeral;
971    in other cases error is called.  */
972 
973 tree
convert_to_fixed(tree type,tree expr)974 convert_to_fixed (tree type, tree expr)
975 {
976   if (integer_zerop (expr))
977     {
978       tree fixed_zero_node = build_fixed (type, FCONST0 (TYPE_MODE (type)));
979       return fixed_zero_node;
980     }
981   else if (integer_onep (expr) && ALL_SCALAR_ACCUM_MODE_P (TYPE_MODE (type)))
982     {
983       tree fixed_one_node = build_fixed (type, FCONST1 (TYPE_MODE (type)));
984       return fixed_one_node;
985     }
986 
987   switch (TREE_CODE (TREE_TYPE (expr)))
988     {
989     case FIXED_POINT_TYPE:
990     case INTEGER_TYPE:
991     case ENUMERAL_TYPE:
992     case BOOLEAN_TYPE:
993     case REAL_TYPE:
994       return build1 (FIXED_CONVERT_EXPR, type, expr);
995 
996     case COMPLEX_TYPE:
997       return convert (type,
998 		      fold_build1 (REALPART_EXPR,
999 				   TREE_TYPE (TREE_TYPE (expr)), expr));
1000 
1001     default:
1002       error ("aggregate value used where a fixed-point was expected");
1003       return error_mark_node;
1004     }
1005 }
1006