]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/convert.c
c-common.c (pointer_int_sum): Do not complain about using pointers to pointers-to...
[thirdparty/gcc.git] / gcc / convert.c
CommitLineData
5e6908ea 1/* Utility routines for data type conversion for GCC.
78bd5210 2 Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1997, 1998,
2a9f2ad3 3 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
76e616db 4
1322177d 5This file is part of GCC.
76e616db 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
76e616db 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
76e616db
BK
16
17You should have received a copy of the GNU General Public License
1322177d
LB
18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
76e616db
BK
21
22
23/* These routines are somewhat language-independent utility function
0f41302f 24 intended to be called by the language-specific convert () functions. */
76e616db
BK
25
26#include "config.h"
c5c76735 27#include "system.h"
4977bab6
ZW
28#include "coretypes.h"
29#include "tm.h"
76e616db
BK
30#include "tree.h"
31#include "flags.h"
32#include "convert.h"
10f0ad3d 33#include "toplev.h"
b0c48229 34#include "langhooks.h"
77f9af81 35#include "real.h"
98c76e3c 36/* Convert EXPR to some pointer or reference type TYPE.
76e616db 37
98c76e3c 38 EXPR must be pointer, reference, integer, enumeral, or literal zero;
0f41302f 39 in other cases error is called. */
76e616db
BK
40
41tree
159b3be1 42convert_to_pointer (tree type, tree expr)
76e616db 43{
76e616db
BK
44 if (integer_zerop (expr))
45 {
76e616db
BK
46 expr = build_int_2 (0, 0);
47 TREE_TYPE (expr) = type;
48 return expr;
49 }
50
f5963e61 51 switch (TREE_CODE (TREE_TYPE (expr)))
76e616db 52 {
f5963e61
JL
53 case POINTER_TYPE:
54 case REFERENCE_TYPE:
55 return build1 (NOP_EXPR, type, expr);
56
57 case INTEGER_TYPE:
58 case ENUMERAL_TYPE:
59 case BOOLEAN_TYPE:
60 case CHAR_TYPE:
61 if (TYPE_PRECISION (TREE_TYPE (expr)) == POINTER_SIZE)
76e616db 62 return build1 (CONVERT_EXPR, type, expr);
76e616db 63
f5963e61
JL
64 return
65 convert_to_pointer (type,
ae2bcd98 66 convert (lang_hooks.types.type_for_size
b0c48229 67 (POINTER_SIZE, 0), expr));
76e616db 68
f5963e61
JL
69 default:
70 error ("cannot convert to a pointer type");
71 return convert_to_pointer (type, integer_zero_node);
72 }
76e616db
BK
73}
74
4977bab6 75/* Avoid any floating point extensions from EXP. */
77f9af81 76tree
159b3be1 77strip_float_extensions (tree exp)
4977bab6
ZW
78{
79 tree sub, expt, subt;
80
77f9af81
JH
81 /* For floating point constant look up the narrowest type that can hold
82 it properly and handle it like (type)(narrowest_type)constant.
83 This way we can optimize for instance a=a*2.0 where "a" is float
84 but 2.0 is double constant. */
85 if (TREE_CODE (exp) == REAL_CST)
86 {
87 REAL_VALUE_TYPE orig;
88 tree type = NULL;
89
90 orig = TREE_REAL_CST (exp);
91 if (TYPE_PRECISION (TREE_TYPE (exp)) > TYPE_PRECISION (float_type_node)
92 && exact_real_truncate (TYPE_MODE (float_type_node), &orig))
93 type = float_type_node;
94 else if (TYPE_PRECISION (TREE_TYPE (exp))
95 > TYPE_PRECISION (double_type_node)
96 && exact_real_truncate (TYPE_MODE (double_type_node), &orig))
97 type = double_type_node;
98 if (type)
99 return build_real (type, real_value_truncate (TYPE_MODE (type), orig));
100 }
101
4977bab6
ZW
102 if (TREE_CODE (exp) != NOP_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
76e616db
BK
119/* Convert EXPR to some floating-point type TYPE.
120
121 EXPR must be float, integer, or enumeral;
0f41302f 122 in other cases error is called. */
76e616db
BK
123
124tree
159b3be1 125convert_to_real (tree type, tree expr)
76e616db 126{
27a6aa72 127 enum built_in_function fcode = builtin_mathfn_code (expr);
4977bab6
ZW
128 tree itype = TREE_TYPE (expr);
129
4b207444
JH
130 /* Disable until we figure out how to decide whether the functions are
131 present in runtime. */
4977bab6 132 /* Convert (float)sqrt((double)x) where x is float into sqrtf(x) */
78bd5210
RS
133 if (optimize
134 && (fcode == BUILT_IN_SQRT
135 || fcode == BUILT_IN_SQRTL
136 || fcode == BUILT_IN_SIN
137 || fcode == BUILT_IN_SINL
138 || fcode == BUILT_IN_COS
139 || fcode == BUILT_IN_COSL
140 || fcode == BUILT_IN_EXP
141 || fcode == BUILT_IN_EXPL
142 || fcode == BUILT_IN_LOG
143 || fcode == BUILT_IN_LOGL)
4977bab6
ZW
144 && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
145 || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
146 {
147 tree arg0 = strip_float_extensions (TREE_VALUE (TREE_OPERAND (expr, 1)));
148 tree newtype = type;
149
150 /* We have (outertype)sqrt((innertype)x). Choose the wider mode from
151 the both as the safe type for operation. */
152 if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type))
153 newtype = TREE_TYPE (arg0);
154
e0bb17a8 155 /* Be careful about integer to fp conversions.
4977bab6
ZW
156 These may overflow still. */
157 if (FLOAT_TYPE_P (TREE_TYPE (arg0))
27a6aa72 158 && TYPE_PRECISION (newtype) < TYPE_PRECISION (itype)
4977bab6
ZW
159 && (TYPE_MODE (newtype) == TYPE_MODE (double_type_node)
160 || TYPE_MODE (newtype) == TYPE_MODE (float_type_node)))
161 {
162 tree arglist;
27a6aa72
JH
163 tree fn = mathfn_built_in (newtype, fcode);
164
165 if (fn)
4977bab6
ZW
166 {
167 arglist = build_tree_list (NULL_TREE, fold (convert_to_real (newtype, arg0)));
27a6aa72 168 expr = build_function_call_expr (fn, arglist);
4977bab6
ZW
169 if (newtype == type)
170 return expr;
171 }
172 }
173 }
27a6aa72
JH
174 if (optimize
175 && (((fcode == BUILT_IN_FLOORL
176 || fcode == BUILT_IN_CEILL
b57051b2 177 || fcode == BUILT_IN_ROUNDL
d093738d 178 || fcode == BUILT_IN_RINTL
b57051b2
KG
179 || fcode == BUILT_IN_TRUNCL
180 || fcode == BUILT_IN_NEARBYINTL)
27a6aa72
JH
181 && (TYPE_MODE (type) == TYPE_MODE (double_type_node)
182 || TYPE_MODE (type) == TYPE_MODE (float_type_node)))
183 || ((fcode == BUILT_IN_FLOOR
184 || fcode == BUILT_IN_CEIL
185 || fcode == BUILT_IN_ROUND
d093738d 186 || fcode == BUILT_IN_RINT
27a6aa72
JH
187 || fcode == BUILT_IN_TRUNC
188 || fcode == BUILT_IN_NEARBYINT)
189 && (TYPE_MODE (type) == TYPE_MODE (float_type_node)))))
190 {
191 tree fn = mathfn_built_in (type, fcode);
192
193 if (fn)
194 {
195 tree arg0 = strip_float_extensions (TREE_VALUE (TREE_OPERAND (expr,
159b3be1 196 1)));
27a6aa72 197 tree arglist = build_tree_list (NULL_TREE,
159b3be1 198 fold (convert_to_real (type, arg0)));
27a6aa72
JH
199
200 return build_function_call_expr (fn, arglist);
201 }
202 }
4977bab6
ZW
203
204 /* Propagate the cast into the operation. */
205 if (itype != type && FLOAT_TYPE_P (type))
206 switch (TREE_CODE (expr))
207 {
beb235f8 208 /* Convert (float)-x into -(float)x. This is always safe. */
4977bab6
ZW
209 case ABS_EXPR:
210 case NEGATE_EXPR:
b1a6f8db
JH
211 if (TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (expr)))
212 return build1 (TREE_CODE (expr), type,
213 fold (convert_to_real (type,
214 TREE_OPERAND (expr, 0))));
215 break;
beb235f8 216 /* Convert (outertype)((innertype0)a+(innertype1)b)
4977bab6
ZW
217 into ((newtype)a+(newtype)b) where newtype
218 is the widest mode from all of these. */
219 case PLUS_EXPR:
220 case MINUS_EXPR:
221 case MULT_EXPR:
222 case RDIV_EXPR:
223 {
224 tree arg0 = strip_float_extensions (TREE_OPERAND (expr, 0));
225 tree arg1 = strip_float_extensions (TREE_OPERAND (expr, 1));
226
227 if (FLOAT_TYPE_P (TREE_TYPE (arg0))
228 && FLOAT_TYPE_P (TREE_TYPE (arg1)))
229 {
230 tree newtype = type;
231 if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (newtype))
232 newtype = TREE_TYPE (arg0);
233 if (TYPE_PRECISION (TREE_TYPE (arg1)) > TYPE_PRECISION (newtype))
234 newtype = TREE_TYPE (arg1);
235 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (itype))
236 {
237 expr = build (TREE_CODE (expr), newtype,
238 fold (convert_to_real (newtype, arg0)),
239 fold (convert_to_real (newtype, arg1)));
240 if (newtype == type)
241 return expr;
242 }
243 }
244 }
245 break;
246 default:
247 break;
248 }
249
f5963e61
JL
250 switch (TREE_CODE (TREE_TYPE (expr)))
251 {
252 case REAL_TYPE:
253 return build1 (flag_float_store ? CONVERT_EXPR : NOP_EXPR,
254 type, expr);
255
256 case INTEGER_TYPE:
257 case ENUMERAL_TYPE:
258 case BOOLEAN_TYPE:
259 case CHAR_TYPE:
260 return build1 (FLOAT_EXPR, type, expr);
261
262 case COMPLEX_TYPE:
263 return convert (type,
264 fold (build1 (REALPART_EXPR,
265 TREE_TYPE (TREE_TYPE (expr)), expr)));
266
267 case POINTER_TYPE:
268 case REFERENCE_TYPE:
269 error ("pointer value used where a floating point value was expected");
270 return convert_to_real (type, integer_zero_node);
271
272 default:
273 error ("aggregate value used where a float was expected");
274 return convert_to_real (type, integer_zero_node);
275 }
76e616db
BK
276}
277
278/* Convert EXPR to some integer (or enum) type TYPE.
279
0b4565c9
BS
280 EXPR must be pointer, integer, discrete (enum, char, or bool), float, or
281 vector; in other cases error is called.
76e616db
BK
282
283 The result of this is always supposed to be a newly created tree node
284 not in use in any existing structure. */
285
286tree
159b3be1 287convert_to_integer (tree type, tree expr)
76e616db 288{
f5963e61
JL
289 enum tree_code ex_form = TREE_CODE (expr);
290 tree intype = TREE_TYPE (expr);
770ae6cc
RK
291 unsigned int inprec = TYPE_PRECISION (intype);
292 unsigned int outprec = TYPE_PRECISION (type);
76e616db 293
9c4cb3a3
MM
294 /* An INTEGER_TYPE cannot be incomplete, but an ENUMERAL_TYPE can
295 be. Consider `enum E = { a, b = (enum E) 3 };'. */
d0f062fb 296 if (!COMPLETE_TYPE_P (type))
9c4cb3a3
MM
297 {
298 error ("conversion to incomplete type");
299 return error_mark_node;
300 }
301
f5963e61 302 switch (TREE_CODE (intype))
76e616db 303 {
f5963e61
JL
304 case POINTER_TYPE:
305 case REFERENCE_TYPE:
76e616db
BK
306 if (integer_zerop (expr))
307 expr = integer_zero_node;
308 else
ae2bcd98
RS
309 expr = fold (build1 (CONVERT_EXPR,
310 lang_hooks.types.type_for_size (POINTER_SIZE, 0),
311 expr));
76e616db 312
f5963e61 313 return convert_to_integer (type, expr);
76e616db 314
f5963e61
JL
315 case INTEGER_TYPE:
316 case ENUMERAL_TYPE:
317 case BOOLEAN_TYPE:
318 case CHAR_TYPE:
319 /* If this is a logical operation, which just returns 0 or 1, we can
320 change the type of the expression. For some logical operations,
321 we must also change the types of the operands to maintain type
c9529354 322 correctness. */
76e616db 323
c9529354 324 if (TREE_CODE_CLASS (ex_form) == '<')
76e616db 325 {
5dfa45d0 326 expr = copy_node (expr);
76e616db
BK
327 TREE_TYPE (expr) = type;
328 return expr;
329 }
f5963e61 330
c9529354
RK
331 else if (ex_form == TRUTH_AND_EXPR || ex_form == TRUTH_ANDIF_EXPR
332 || ex_form == TRUTH_OR_EXPR || ex_form == TRUTH_ORIF_EXPR
333 || ex_form == TRUTH_XOR_EXPR)
334 {
5dfa45d0 335 expr = copy_node (expr);
c9529354
RK
336 TREE_OPERAND (expr, 0) = convert (type, TREE_OPERAND (expr, 0));
337 TREE_OPERAND (expr, 1) = convert (type, TREE_OPERAND (expr, 1));
338 TREE_TYPE (expr) = type;
339 return expr;
340 }
f5963e61 341
c9529354
RK
342 else if (ex_form == TRUTH_NOT_EXPR)
343 {
5dfa45d0 344 expr = copy_node (expr);
c9529354
RK
345 TREE_OPERAND (expr, 0) = convert (type, TREE_OPERAND (expr, 0));
346 TREE_TYPE (expr) = type;
347 return expr;
348 }
f5963e61
JL
349
350 /* If we are widening the type, put in an explicit conversion.
351 Similarly if we are not changing the width. After this, we know
352 we are truncating EXPR. */
353
76e616db 354 else if (outprec >= inprec)
4b0d3cbe
MM
355 {
356 enum tree_code code;
357
358 /* If the precision of the EXPR's type is K bits and the
359 destination mode has more bits, and the sign is changing,
360 it is not safe to use a NOP_EXPR. For example, suppose
361 that EXPR's type is a 3-bit unsigned integer type, the
362 TYPE is a 3-bit signed integer type, and the machine mode
363 for the types is 8-bit QImode. In that case, the
364 conversion necessitates an explicit sign-extension. In
365 the signed-to-unsigned case the high-order bits have to
366 be cleared. */
367 if (TREE_UNSIGNED (type) != TREE_UNSIGNED (TREE_TYPE (expr))
368 && (TYPE_PRECISION (TREE_TYPE (expr))
369 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (expr)))))
370 code = CONVERT_EXPR;
371 else
372 code = NOP_EXPR;
373
374 return build1 (code, type, expr);
375 }
76e616db 376
1c013b45
RK
377 /* If TYPE is an enumeral type or a type with a precision less
378 than the number of bits in its mode, do the conversion to the
379 type corresponding to its mode, then do a nop conversion
380 to TYPE. */
381 else if (TREE_CODE (type) == ENUMERAL_TYPE
382 || outprec != GET_MODE_BITSIZE (TYPE_MODE (type)))
383 return build1 (NOP_EXPR, type,
ae2bcd98 384 convert (lang_hooks.types.type_for_mode
b0c48229 385 (TYPE_MODE (type), TREE_UNSIGNED (type)),
1c013b45
RK
386 expr));
387
ab29fdfc
RK
388 /* Here detect when we can distribute the truncation down past some
389 arithmetic. For example, if adding two longs and converting to an
390 int, we can equally well convert both to ints and then add.
391 For the operations handled here, such truncation distribution
392 is always safe.
393 It is desirable in these cases:
394 1) when truncating down to full-word from a larger size
395 2) when truncating takes no work.
396 3) when at least one operand of the arithmetic has been extended
397 (as by C's default conversions). In this case we need two conversions
398 if we do the arithmetic as already requested, so we might as well
399 truncate both and then combine. Perhaps that way we need only one.
400
401 Note that in general we cannot do the arithmetic in a type
402 shorter than the desired result of conversion, even if the operands
403 are both extended from a shorter type, because they might overflow
404 if combined in that type. The exceptions to this--the times when
405 two narrow values can be combined in their narrow type even to
406 make a wider result--are handled by "shorten" in build_binary_op. */
76e616db
BK
407
408 switch (ex_form)
409 {
410 case RSHIFT_EXPR:
411 /* We can pass truncation down through right shifting
412 when the shift count is a nonpositive constant. */
413 if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
ab29fdfc
RK
414 && tree_int_cst_lt (TREE_OPERAND (expr, 1),
415 convert (TREE_TYPE (TREE_OPERAND (expr, 1)),
416 integer_one_node)))
76e616db
BK
417 goto trunc1;
418 break;
419
420 case LSHIFT_EXPR:
421 /* We can pass truncation down through left shifting
43e4a9d8
EB
422 when the shift count is a nonnegative constant and
423 the target type is unsigned. */
76e616db 424 if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST
ab29fdfc 425 && tree_int_cst_sgn (TREE_OPERAND (expr, 1)) >= 0
43e4a9d8 426 && TREE_UNSIGNED (type)
76e616db
BK
427 && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
428 {
429 /* If shift count is less than the width of the truncated type,
430 really shift. */
431 if (tree_int_cst_lt (TREE_OPERAND (expr, 1), TYPE_SIZE (type)))
432 /* In this case, shifting is like multiplication. */
433 goto trunc1;
434 else
d9a9c5a7
RK
435 {
436 /* If it is >= that width, result is zero.
437 Handling this with trunc1 would give the wrong result:
438 (int) ((long long) a << 32) is well defined (as 0)
439 but (int) a << 32 is undefined and would get a
440 warning. */
441
442 tree t = convert_to_integer (type, integer_zero_node);
443
444 /* If the original expression had side-effects, we must
445 preserve it. */
446 if (TREE_SIDE_EFFECTS (expr))
447 return build (COMPOUND_EXPR, type, expr, t);
448 else
449 return t;
450 }
76e616db
BK
451 }
452 break;
453
454 case MAX_EXPR:
455 case MIN_EXPR:
456 case MULT_EXPR:
457 {
458 tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
459 tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
460
461 /* Don't distribute unless the output precision is at least as big
462 as the actual inputs. Otherwise, the comparison of the
463 truncated values will be wrong. */
464 if (outprec >= TYPE_PRECISION (TREE_TYPE (arg0))
465 && outprec >= TYPE_PRECISION (TREE_TYPE (arg1))
466 /* If signedness of arg0 and arg1 don't match,
467 we can't necessarily find a type to compare them in. */
468 && (TREE_UNSIGNED (TREE_TYPE (arg0))
469 == TREE_UNSIGNED (TREE_TYPE (arg1))))
470 goto trunc1;
471 break;
472 }
473
474 case PLUS_EXPR:
475 case MINUS_EXPR:
476 case BIT_AND_EXPR:
477 case BIT_IOR_EXPR:
478 case BIT_XOR_EXPR:
76e616db
BK
479 trunc1:
480 {
481 tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type);
482 tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type);
483
484 if (outprec >= BITS_PER_WORD
485 || TRULY_NOOP_TRUNCATION (outprec, inprec)
486 || inprec > TYPE_PRECISION (TREE_TYPE (arg0))
487 || inprec > TYPE_PRECISION (TREE_TYPE (arg1)))
488 {
489 /* Do the arithmetic in type TYPEX,
490 then convert result to TYPE. */
b3694847 491 tree typex = type;
76e616db
BK
492
493 /* Can't do arithmetic in enumeral types
494 so use an integer type that will hold the values. */
495 if (TREE_CODE (typex) == ENUMERAL_TYPE)
ae2bcd98 496 typex = lang_hooks.types.type_for_size
b0c48229 497 (TYPE_PRECISION (typex), TREE_UNSIGNED (typex));
76e616db
BK
498
499 /* But now perhaps TYPEX is as wide as INPREC.
500 In that case, do nothing special here.
501 (Otherwise would recurse infinitely in convert. */
502 if (TYPE_PRECISION (typex) != inprec)
503 {
504 /* Don't do unsigned arithmetic where signed was wanted,
505 or vice versa.
3cc247a8 506 Exception: if both of the original operands were
159b3be1 507 unsigned then we can safely do the work as unsigned.
43e4a9d8
EB
508 Exception: shift operations take their type solely
509 from the first argument.
510 Exception: the LSHIFT_EXPR case above requires that
511 we perform this operation unsigned lest we produce
512 signed-overflow undefinedness.
76e616db
BK
513 And we may need to do it as unsigned
514 if we truncate to the original size. */
ceef8ce4
NB
515 if (TREE_UNSIGNED (TREE_TYPE (expr))
516 || (TREE_UNSIGNED (TREE_TYPE (arg0))
43e4a9d8
EB
517 && (TREE_UNSIGNED (TREE_TYPE (arg1))
518 || ex_form == LSHIFT_EXPR
519 || ex_form == RSHIFT_EXPR
520 || ex_form == LROTATE_EXPR
521 || ex_form == RROTATE_EXPR))
522 || ex_form == LSHIFT_EXPR)
ae2bcd98 523 typex = lang_hooks.types.unsigned_type (typex);
ceef8ce4 524 else
ae2bcd98 525 typex = lang_hooks.types.signed_type (typex);
76e616db 526 return convert (type,
95e78909
RK
527 fold (build (ex_form, typex,
528 convert (typex, arg0),
4221057e 529 convert (typex, arg1))));
76e616db
BK
530 }
531 }
532 }
533 break;
534
535 case NEGATE_EXPR:
536 case BIT_NOT_EXPR:
d283912a
RS
537 /* This is not correct for ABS_EXPR,
538 since we must test the sign before truncation. */
76e616db 539 {
b3694847 540 tree typex = type;
76e616db
BK
541
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)
ae2bcd98 545 typex = lang_hooks.types.type_for_size
b0c48229 546 (TYPE_PRECISION (typex), TREE_UNSIGNED (typex));
76e616db
BK
547
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)
552 {
553 /* Don't do unsigned arithmetic where signed was wanted,
554 or vice versa. */
ceef8ce4 555 if (TREE_UNSIGNED (TREE_TYPE (expr)))
ae2bcd98 556 typex = lang_hooks.types.unsigned_type (typex);
ceef8ce4 557 else
ae2bcd98 558 typex = lang_hooks.types.signed_type (typex);
76e616db 559 return convert (type,
95e78909
RK
560 fold (build1 (ex_form, typex,
561 convert (typex,
562 TREE_OPERAND (expr, 0)))));
76e616db
BK
563 }
564 }
565
566 case NOP_EXPR:
3767c0fd
R
567 /* Don't introduce a
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))))
572 break;
76e616db
BK
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));
576
577 case COND_EXPR:
f5963e61
JL
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),
159b3be1 581 convert (type, TREE_OPERAND (expr, 1)),
f5963e61 582 convert (type, TREE_OPERAND (expr, 2))));
76e616db 583
31031edd
JL
584 default:
585 break;
76e616db
BK
586 }
587
588 return build1 (NOP_EXPR, type, expr);
76e616db 589
f5963e61
JL
590 case REAL_TYPE:
591 return build1 (FIX_TRUNC_EXPR, type, expr);
76e616db 592
f5963e61
JL
593 case COMPLEX_TYPE:
594 return convert (type,
595 fold (build1 (REALPART_EXPR,
596 TREE_TYPE (TREE_TYPE (expr)), expr)));
0b127821 597
0b4565c9
BS
598 case VECTOR_TYPE:
599 if (GET_MODE_SIZE (TYPE_MODE (type))
600 != GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr))))
601 {
602 error ("can't convert between vector values of different size");
603 return error_mark_node;
604 }
605 return build1 (NOP_EXPR, type, expr);
606
f5963e61
JL
607 default:
608 error ("aggregate value used where an integer was expected");
609 return convert (type, integer_zero_node);
610 }
76e616db 611}
0b127821
RS
612
613/* Convert EXPR to the complex type TYPE in the usual ways. */
614
615tree
159b3be1 616convert_to_complex (tree type, tree expr)
0b127821 617{
0b127821 618 tree subtype = TREE_TYPE (type);
159b3be1 619
f5963e61 620 switch (TREE_CODE (TREE_TYPE (expr)))
0b127821 621 {
f5963e61
JL
622 case REAL_TYPE:
623 case INTEGER_TYPE:
624 case ENUMERAL_TYPE:
625 case BOOLEAN_TYPE:
626 case CHAR_TYPE:
627 return build (COMPLEX_EXPR, type, convert (subtype, expr),
0b127821 628 convert (subtype, integer_zero_node));
0b127821 629
f5963e61
JL
630 case COMPLEX_TYPE:
631 {
632 tree elt_type = TREE_TYPE (TREE_TYPE (expr));
633
634 if (TYPE_MAIN_VARIANT (elt_type) == TYPE_MAIN_VARIANT (subtype))
635 return expr;
636 else if (TREE_CODE (expr) == COMPLEX_EXPR)
0b127821
RS
637 return fold (build (COMPLEX_EXPR,
638 type,
f5963e61
JL
639 convert (subtype, TREE_OPERAND (expr, 0)),
640 convert (subtype, TREE_OPERAND (expr, 1))));
641 else
642 {
643 expr = save_expr (expr);
644 return
645 fold (build (COMPLEX_EXPR,
646 type, convert (subtype,
647 fold (build1 (REALPART_EXPR,
648 TREE_TYPE (TREE_TYPE (expr)),
649 expr))),
650 convert (subtype,
651 fold (build1 (IMAGPART_EXPR,
652 TREE_TYPE (TREE_TYPE (expr)),
653 expr)))));
654 }
655 }
0b127821 656
f5963e61
JL
657 case POINTER_TYPE:
658 case REFERENCE_TYPE:
659 error ("pointer value used where a complex was expected");
660 return convert_to_complex (type, integer_zero_node);
661
662 default:
663 error ("aggregate value used where a complex was expected");
664 return convert_to_complex (type, integer_zero_node);
665 }
0b127821 666}
0b4565c9
BS
667
668/* Convert EXPR to the vector type TYPE in the usual ways. */
669
670tree
159b3be1 671convert_to_vector (tree type, tree expr)
0b4565c9 672{
0b4565c9
BS
673 switch (TREE_CODE (TREE_TYPE (expr)))
674 {
675 case INTEGER_TYPE:
676 case VECTOR_TYPE:
677 if (GET_MODE_SIZE (TYPE_MODE (type))
678 != GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr))))
679 {
680 error ("can't convert between vector values of different size");
681 return error_mark_node;
682 }
683 return build1 (NOP_EXPR, type, expr);
684
685 default:
686 error ("can't convert value to a vector");
687 return convert_to_vector (type, integer_zero_node);
688 }
689}