1 /* Utility routines for data type conversion for GNU C.
2 Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1997,
3 1998 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 /* These routines are somewhat language-independent utility function
24 intended to be called by the language-specific convert () functions. */
28 #include "coretypes.h"
34 #include "langhooks.h"
36 /* Convert EXPR to some pointer or reference type TYPE.
38 EXPR must be pointer, reference, integer, enumeral, or literal zero;
39 in other cases error is called. */
42 convert_to_pointer (type, expr)
45 if (integer_zerop (expr))
47 expr = build_int_2 (0, 0);
48 TREE_TYPE (expr) = type;
52 switch (TREE_CODE (TREE_TYPE (expr)))
56 return build1 (NOP_EXPR, type, expr);
62 if (TYPE_PRECISION (TREE_TYPE (expr)) == POINTER_SIZE)
63 return build1 (CONVERT_EXPR, type, expr);
66 convert_to_pointer (type,
67 convert ((*lang_hooks.types.type_for_size)
68 (POINTER_SIZE, 0), expr));
71 error ("cannot convert to a pointer type");
72 return convert_to_pointer (type, integer_zero_node);
76 /* Avoid any floating point extensions from EXP. */
78 strip_float_extensions (exp)
83 /* For floating point constant look up the narrowest type that can hold
84 it properly and handle it like (type)(narrowest_type)constant.
85 This way we can optimize for instance a=a*2.0 where "a" is float
86 but 2.0 is double constant. */
87 if (TREE_CODE (exp) == REAL_CST)
92 orig = TREE_REAL_CST (exp);
93 if (TYPE_PRECISION (TREE_TYPE (exp)) > TYPE_PRECISION (float_type_node)
94 && exact_real_truncate (TYPE_MODE (float_type_node), &orig))
95 type = float_type_node;
96 else if (TYPE_PRECISION (TREE_TYPE (exp))
97 > TYPE_PRECISION (double_type_node)
98 && exact_real_truncate (TYPE_MODE (double_type_node), &orig))
99 type = double_type_node;
101 return build_real (type, real_value_truncate (TYPE_MODE (type), orig));
104 if (TREE_CODE (exp) != NOP_EXPR)
107 sub = TREE_OPERAND (exp, 0);
108 subt = TREE_TYPE (sub);
109 expt = TREE_TYPE (exp);
111 if (!FLOAT_TYPE_P (subt))
114 if (TYPE_PRECISION (subt) > TYPE_PRECISION (expt))
117 return strip_float_extensions (sub);
121 /* Convert EXPR to some floating-point type TYPE.
123 EXPR must be float, integer, or enumeral;
124 in other cases error is called. */
127 convert_to_real (type, expr)
130 tree itype = TREE_TYPE (expr);
132 /* Disable until we figure out how to decide whether the functions are
133 present in runtime. */
135 enum built_in_function fcode = builtin_mathfn_code (expr);
137 /* Convert (float)sqrt((double)x) where x is float into sqrtf(x) */
138 if ((fcode == BUILT_IN_SQRT
139 || fcode == BUILT_IN_SQRTL
140 || fcode == BUILT_IN_SIN
141 || fcode == BUILT_IN_SINL
142 || fcode == BUILT_IN_COS
143 || fcode == BUILT_IN_COSL
144 || fcode == BUILT_IN_EXP
145 || fcode == BUILT_IN_EXPL)
147 && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
148 || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
150 tree arg0 = strip_float_extensions (TREE_VALUE (TREE_OPERAND (expr, 1)));
153 /* We have (outertype)sqrt((innertype)x). Choose the wider mode from
154 the both as the safe type for operation. */
155 if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type))
156 newtype = TREE_TYPE (arg0);
158 /* Be curefull about integer to fp conversions.
159 These may overflow still. */
160 if (FLOAT_TYPE_P (TREE_TYPE (arg0))
161 && TYPE_PRECISION (newtype) <= TYPE_PRECISION (itype)
162 && (TYPE_MODE (newtype) == TYPE_MODE (double_type_node)
163 || TYPE_MODE (newtype) == TYPE_MODE (float_type_node)))
166 if (TYPE_MODE (type) == TYPE_MODE (float_type_node))
171 fcode = BUILT_IN_SQRTF;
175 fcode = BUILT_IN_SINF;
179 fcode = BUILT_IN_COSF;
183 fcode = BUILT_IN_EXPF;
193 fcode = BUILT_IN_SQRT;
197 fcode = BUILT_IN_SIN;
201 fcode = BUILT_IN_COS;
205 fcode = BUILT_IN_EXP;
211 /* ??? Fortran frontend does not initialize built_in_decls.
212 For some reason creating the decl using builtin_function does not
213 work as it should. */
214 if (built_in_decls [fcode])
216 arglist = build_tree_list (NULL_TREE, fold (convert_to_real (newtype, arg0)));
217 expr = build_function_call_expr (built_in_decls [fcode], arglist);
225 /* Propagate the cast into the operation. */
226 if (itype != type && FLOAT_TYPE_P (type))
227 switch (TREE_CODE (expr))
229 /* convert (float)-x into -(float)x. This is always safe. */
232 if (TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (expr)))
233 return build1 (TREE_CODE (expr), type,
234 fold (convert_to_real (type,
235 TREE_OPERAND (expr, 0))));
237 /* convert (outertype)((innertype0)a+(innertype1)b)
238 into ((newtype)a+(newtype)b) where newtype
239 is the widest mode from all of these. */
245 tree arg0 = strip_float_extensions (TREE_OPERAND (expr, 0));
246 tree arg1 = strip_float_extensions (TREE_OPERAND (expr, 1));
248 if (FLOAT_TYPE_P (TREE_TYPE (arg0))
249 && FLOAT_TYPE_P (TREE_TYPE (arg1)))
252 if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (newtype))
253 newtype = TREE_TYPE (arg0);
254 if (TYPE_PRECISION (TREE_TYPE (arg1)) > TYPE_PRECISION (newtype))
255 newtype = TREE_TYPE (arg1);
256 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (itype))
258 expr = build (TREE_CODE (expr), newtype,
259 fold (convert_to_real (newtype, arg0)),
260 fold (convert_to_real (newtype, arg1)));
271 switch (TREE_CODE (TREE_TYPE (expr)))
274 return build1 (flag_float_store ? CONVERT_EXPR : NOP_EXPR,
281 return build1 (FLOAT_EXPR, type, expr);
284 return convert (type,
285 fold (build1 (REALPART_EXPR,
286 TREE_TYPE (TREE_TYPE (expr)), expr)));
290 error ("pointer value used where a floating point value was expected");
291 return convert_to_real (type, integer_zero_node);
294 error ("aggregate value used where a float was expected");
295 return convert_to_real (type, integer_zero_node);
299 /* Convert EXPR to some integer (or enum) type TYPE.
301 EXPR must be pointer, integer, discrete (enum, char, or bool), float, or
302 vector; in other cases error is called.
304 The result of this is always supposed to be a newly created tree node
305 not in use in any existing structure. */
308 convert_to_integer (type, expr)
311 enum tree_code ex_form = TREE_CODE (expr);
312 tree intype = TREE_TYPE (expr);
313 unsigned int inprec = TYPE_PRECISION (intype);
314 unsigned int outprec = TYPE_PRECISION (type);
316 /* An INTEGER_TYPE cannot be incomplete, but an ENUMERAL_TYPE can
317 be. Consider `enum E = { a, b = (enum E) 3 };'. */
318 if (!COMPLETE_TYPE_P (type))
320 error ("conversion to incomplete type");
321 return error_mark_node;
324 switch (TREE_CODE (intype))
328 if (integer_zerop (expr))
329 expr = integer_zero_node;
331 expr = fold (build1 (CONVERT_EXPR, (*lang_hooks.types.type_for_size)
332 (POINTER_SIZE, 0), expr));
334 return convert_to_integer (type, expr);
340 /* If this is a logical operation, which just returns 0 or 1, we can
341 change the type of the expression. For some logical operations,
342 we must also change the types of the operands to maintain type
345 if (TREE_CODE_CLASS (ex_form) == '<')
347 TREE_TYPE (expr) = type;
351 else if (ex_form == TRUTH_AND_EXPR || ex_form == TRUTH_ANDIF_EXPR
352 || ex_form == TRUTH_OR_EXPR || ex_form == TRUTH_ORIF_EXPR
353 || ex_form == TRUTH_XOR_EXPR)
355 TREE_OPERAND (expr, 0) = convert (type, TREE_OPERAND (expr, 0));
356 TREE_OPERAND (expr, 1) = convert (type, TREE_OPERAND (expr, 1));
357 TREE_TYPE (expr) = type;
361 else if (ex_form == TRUTH_NOT_EXPR)
363 TREE_OPERAND (expr, 0) = convert (type, TREE_OPERAND (expr, 0));
364 TREE_TYPE (expr) = type;
368 /* If we are widening the type, put in an explicit conversion.
369 Similarly if we are not changing the width. After this, we know
370 we are truncating EXPR. */
372 else if (outprec >= inprec)
373 return build1 (NOP_EXPR, type, expr);
375 /* If TYPE is an enumeral type or a type with a precision less
376 than the number of bits in its mode, do the conversion to the
377 type corresponding to its mode, then do a nop conversion
379 else if (TREE_CODE (type) == ENUMERAL_TYPE
380 || outprec != GET_MODE_BITSIZE (TYPE_MODE (type)))
381 return build1 (NOP_EXPR, type,
382 convert ((*lang_hooks.types.type_for_mode)
383 (TYPE_MODE (type), TREE_UNSIGNED (type)),
386 /* Here detect when we can distribute the truncation down past some
387 arithmetic. For example, if adding two longs and converting to an
388 int, we can equally well convert both to ints and then add.
389 For the operations handled here, such truncation distribution
391 It is desirable in these cases:
392 1) when truncating down to full-word from a larger size
393 2) when truncating takes no work.
394 3) when at least one operand of the arithmetic has been extended
395 (as by C's default conversions). In this case we need two conversions
396 if we do the arithmetic as already requested, so we might as well
397 truncate both and then combine. Perhaps that way we need only one.
399 Note that in general we cannot do the arithmetic in a type
400 shorter than the desired result of conversion, even if the operands
401 are both extended from a shorter type, because they might overflow
402 if combined in that type. The exceptions to this--the times when
403 two narrow values can be combined in their narrow type even to
404 make a wider result--are handled by "shorten" in build_binary_op. */
409 /* We can pass truncation down through right shifting
410 when the shift count is a nonpositive constant. */
411 if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
412 && tree_int_cst_lt (TREE_OPERAND (expr, 1),
413 convert (TREE_TYPE (TREE_OPERAND (expr, 1)),
419 /* We can pass truncation down through left shifting
420 when the shift count is a nonnegative constant and
421 the target type is unsigned. */
422 if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
423 && tree_int_cst_sgn (TREE_OPERAND (expr, 1)) >= 0
424 && TREE_UNSIGNED (type)
425 && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
427 /* If shift count is less than the width of the truncated type,
429 if (tree_int_cst_lt (TREE_OPERAND (expr, 1), TYPE_SIZE (type)))
430 /* In this case, shifting is like multiplication. */
434 /* If it is >= that width, result is zero.
435 Handling this with trunc1 would give the wrong result:
436 (int) ((long long) a << 32) is well defined (as 0)
437 but (int) a << 32 is undefined and would get a
440 tree t = convert_to_integer (type, integer_zero_node);
442 /* If the original expression had side-effects, we must
444 if (TREE_SIDE_EFFECTS (expr))
445 return build (COMPOUND_EXPR, type, expr, t);
456 tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
457 tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
459 /* Don't distribute unless the output precision is at least as big
460 as the actual inputs. Otherwise, the comparison of the
461 truncated values will be wrong. */
462 if (outprec >= TYPE_PRECISION (TREE_TYPE (arg0))
463 && outprec >= TYPE_PRECISION (TREE_TYPE (arg1))
464 /* If signedness of arg0 and arg1 don't match,
465 we can't necessarily find a type to compare them in. */
466 && (TREE_UNSIGNED (TREE_TYPE (arg0))
467 == TREE_UNSIGNED (TREE_TYPE (arg1))))
480 tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
481 tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
483 if (outprec >= BITS_PER_WORD
484 || TRULY_NOOP_TRUNCATION (outprec, inprec)
485 || inprec > TYPE_PRECISION (TREE_TYPE (arg0))
486 || inprec > TYPE_PRECISION (TREE_TYPE (arg1)))
488 /* Do the arithmetic in type TYPEX,
489 then convert result to TYPE. */
492 /* Can't do arithmetic in enumeral types
493 so use an integer type that will hold the values. */
494 if (TREE_CODE (typex) == ENUMERAL_TYPE)
495 typex = (*lang_hooks.types.type_for_size)
496 (TYPE_PRECISION (typex), TREE_UNSIGNED (typex));
498 /* But now perhaps TYPEX is as wide as INPREC.
499 In that case, do nothing special here.
500 (Otherwise would recurse infinitely in convert. */
501 if (TYPE_PRECISION (typex) != inprec)
503 /* Don't do unsigned arithmetic where signed was wanted,
505 Exception: if both of the original operands were
506 unsigned then we can safely do the work as unsigned.
507 Exception: shift operations take their type solely
508 from the first argument.
509 Exception: the LSHIFT_EXPR case above requires that
510 we perform this operation unsigned lest we produce
511 signed-overflow undefinedness.
512 And we may need to do it as unsigned
513 if we truncate to the original size. */
514 if (TREE_UNSIGNED (TREE_TYPE (expr))
515 || (TREE_UNSIGNED (TREE_TYPE (arg0))
516 && (TREE_UNSIGNED (TREE_TYPE (arg1))
517 || ex_form == LSHIFT_EXPR
518 || ex_form == RSHIFT_EXPR
519 || ex_form == LROTATE_EXPR
520 || ex_form == RROTATE_EXPR))
521 || ex_form == LSHIFT_EXPR)
522 typex = (*lang_hooks.types.unsigned_type) (typex);
524 typex = (*lang_hooks.types.signed_type) (typex);
525 return convert (type,
526 fold (build (ex_form, typex,
527 convert (typex, arg0),
528 convert (typex, arg1),
537 /* This is not correct for ABS_EXPR,
538 since we must test the sign before truncation. */
542 /* Can't do arithmetic in enumeral types
543 so use an integer type that will hold the values. */
544 if (TREE_CODE (typex) == ENUMERAL_TYPE)
545 typex = (*lang_hooks.types.type_for_size)
546 (TYPE_PRECISION (typex), TREE_UNSIGNED (typex));
548 /* But now perhaps TYPEX is as wide as INPREC.
549 In that case, do nothing special here.
550 (Otherwise would recurse infinitely in convert. */
551 if (TYPE_PRECISION (typex) != inprec)
553 /* Don't do unsigned arithmetic where signed was wanted,
555 if (TREE_UNSIGNED (TREE_TYPE (expr)))
556 typex = (*lang_hooks.types.unsigned_type) (typex);
558 typex = (*lang_hooks.types.signed_type) (typex);
559 return convert (type,
560 fold (build1 (ex_form, typex,
562 TREE_OPERAND (expr, 0)))));
568 "can't convert between vector values of different size" error. */
569 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == VECTOR_TYPE
570 && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_OPERAND (expr, 0))))
571 != GET_MODE_SIZE (TYPE_MODE (type))))
573 /* If truncating after truncating, might as well do all at once.
574 If truncating after extending, we may get rid of wasted work. */
575 return convert (type, get_unwidened (TREE_OPERAND (expr, 0), type));
578 /* It is sometimes worthwhile to push the narrowing down through
579 the conditional and never loses. */
580 return fold (build (COND_EXPR, type, TREE_OPERAND (expr, 0),
581 convert (type, TREE_OPERAND (expr, 1)),
582 convert (type, TREE_OPERAND (expr, 2))));
588 return build1 (NOP_EXPR, type, expr);
591 return build1 (FIX_TRUNC_EXPR, type, expr);
594 return convert (type,
595 fold (build1 (REALPART_EXPR,
596 TREE_TYPE (TREE_TYPE (expr)), expr)));
599 if (GET_MODE_SIZE (TYPE_MODE (type))
600 != GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr))))
602 error ("can't convert between vector values of different size");
603 return error_mark_node;
605 return build1 (NOP_EXPR, type, expr);
608 error ("aggregate value used where an integer was expected");
609 return convert (type, integer_zero_node);
613 /* Convert EXPR to the complex type TYPE in the usual ways. */
616 convert_to_complex (type, expr)
619 tree subtype = TREE_TYPE (type);
621 switch (TREE_CODE (TREE_TYPE (expr)))
628 return build (COMPLEX_EXPR, type, convert (subtype, expr),
629 convert (subtype, integer_zero_node));
633 tree elt_type = TREE_TYPE (TREE_TYPE (expr));
635 if (TYPE_MAIN_VARIANT (elt_type) == TYPE_MAIN_VARIANT (subtype))
637 else if (TREE_CODE (expr) == COMPLEX_EXPR)
638 return fold (build (COMPLEX_EXPR,
640 convert (subtype, TREE_OPERAND (expr, 0)),
641 convert (subtype, TREE_OPERAND (expr, 1))));
644 expr = save_expr (expr);
646 fold (build (COMPLEX_EXPR,
647 type, convert (subtype,
648 fold (build1 (REALPART_EXPR,
649 TREE_TYPE (TREE_TYPE (expr)),
652 fold (build1 (IMAGPART_EXPR,
653 TREE_TYPE (TREE_TYPE (expr)),
660 error ("pointer value used where a complex was expected");
661 return convert_to_complex (type, integer_zero_node);
664 error ("aggregate value used where a complex was expected");
665 return convert_to_complex (type, integer_zero_node);
669 /* Convert EXPR to the vector type TYPE in the usual ways. */
672 convert_to_vector (type, expr)
675 switch (TREE_CODE (TREE_TYPE (expr)))
679 if (GET_MODE_SIZE (TYPE_MODE (type))
680 != GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr))))
682 error ("can't convert between vector values of different size");
683 return error_mark_node;
685 return build1 (NOP_EXPR, type, expr);
688 error ("can't convert value to a vector");
689 return convert_to_vector (type, integer_zero_node);