1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught & Katherine Holcomb
6 This file is part of GCC.
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
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
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/>. */
27 #include "intrinsic.h"
28 #include "target-memory.h"
30 gfc_expr gfc_bad_expr;
33 /* Note that 'simplification' is not just transforming expressions.
34 For functions that are not simplified at compile time, range
35 checking is done if possible.
37 The return convention is that each simplification function returns:
39 A new expression node corresponding to the simplified arguments.
40 The original arguments are destroyed by the caller, and must not
41 be a part of the new expression.
43 NULL pointer indicating that no simplification was possible and
44 the original expression should remain intact. If the
45 simplification function sets the type and/or the function name
46 via the pointer gfc_simple_expression, then this type is
49 An expression pointer to gfc_bad_expr (a static placeholder)
50 indicating that some error has prevented simplification. For
51 example, sqrt(-1.0). The error is generated within the function
52 and should be propagated upwards
54 By the time a simplification function gets control, it has been
55 decided that the function call is really supposed to be the
56 intrinsic. No type checking is strictly necessary, since only
57 valid types will be passed on. On the other hand, a simplification
58 subroutine may have to look at the type of an argument as part of
61 Array arguments are never passed to these subroutines.
63 The functions in this file don't have much comment with them, but
64 everything is reasonably straight-forward. The Standard, chapter 13
65 is the best comment you'll find for this file anyway. */
67 /* Range checks an expression node. If all goes well, returns the
68 node, otherwise returns &gfc_bad_expr and frees the node. */
71 range_check (gfc_expr *result, const char *name)
76 switch (gfc_range_check (result))
82 gfc_error ("Result of %s overflows its kind at %L", name,
87 gfc_error ("Result of %s underflows its kind at %L", name,
92 gfc_error ("Result of %s is NaN at %L", name, &result->where);
96 gfc_error ("Result of %s gives range error for its kind at %L", name,
101 gfc_free_expr (result);
102 return &gfc_bad_expr;
106 /* A helper function that gets an optional and possibly missing
107 kind parameter. Returns the kind, -1 if something went wrong. */
110 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
117 if (k->expr_type != EXPR_CONSTANT)
119 gfc_error ("KIND parameter of %s at %L must be an initialization "
120 "expression", name, &k->where);
124 if (gfc_extract_int (k, &kind) != NULL
125 || gfc_validate_kind (type, kind, true) < 0)
127 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
135 /* Helper function to get an integer constant with a kind number given
136 by an integer constant expression. */
138 int_expr_with_kind (int i, gfc_expr *kind, const char *name)
140 gfc_expr *res = gfc_int_expr (i);
141 res->ts.kind = get_kind (BT_INTEGER, kind, name, gfc_default_integer_kind);
142 if (res->ts.kind == -1)
149 /* Converts an mpz_t signed variable into an unsigned one, assuming
150 two's complement representations and a binary width of bitsize.
151 The conversion is a no-op unless x is negative; otherwise, it can
152 be accomplished by masking out the high bits. */
155 convert_mpz_to_unsigned (mpz_t x, int bitsize)
161 /* Confirm that no bits above the signed range are unset. */
162 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
164 mpz_init_set_ui (mask, 1);
165 mpz_mul_2exp (mask, mask, bitsize);
166 mpz_sub_ui (mask, mask, 1);
168 mpz_and (x, x, mask);
174 /* Confirm that no bits above the signed range are set. */
175 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
180 /* Converts an mpz_t unsigned variable into a signed one, assuming
181 two's complement representations and a binary width of bitsize.
182 If the bitsize-1 bit is set, this is taken as a sign bit and
183 the number is converted to the corresponding negative number. */
186 convert_mpz_to_signed (mpz_t x, int bitsize)
190 /* Confirm that no bits above the unsigned range are set. */
191 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
193 if (mpz_tstbit (x, bitsize - 1) == 1)
195 mpz_init_set_ui (mask, 1);
196 mpz_mul_2exp (mask, mask, bitsize);
197 mpz_sub_ui (mask, mask, 1);
199 /* We negate the number by hand, zeroing the high bits, that is
200 make it the corresponding positive number, and then have it
201 negated by GMP, giving the correct representation of the
204 mpz_add_ui (x, x, 1);
205 mpz_and (x, x, mask);
214 /********************** Simplification functions *****************************/
217 gfc_simplify_abs (gfc_expr *e)
221 if (e->expr_type != EXPR_CONSTANT)
227 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
229 mpz_abs (result->value.integer, e->value.integer);
231 result = range_check (result, "IABS");
235 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
237 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
239 result = range_check (result, "ABS");
243 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
245 gfc_set_model_kind (e->ts.kind);
247 mpfr_hypot (result->value.real, e->value.complex.r,
248 e->value.complex.i, GFC_RND_MODE);
249 result = range_check (result, "CABS");
253 gfc_internal_error ("gfc_simplify_abs(): Bad type");
259 /* We use the processor's collating sequence, because all
260 systems that gfortran currently works on are ASCII. */
263 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
269 if (e->expr_type != EXPR_CONSTANT)
272 kind = get_kind (BT_CHARACTER, k, "ACHAR", gfc_default_character_kind);
274 return &gfc_bad_expr;
276 ch = gfc_extract_int (e, &c);
279 gfc_internal_error ("gfc_simplify_achar: %s", ch);
281 if (gfc_option.warn_surprising && (c < 0 || c > 127))
282 gfc_warning ("Argument of ACHAR function at %L outside of range [0,127]",
285 result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
287 result->value.character.string = gfc_getmem (2);
289 result->value.character.length = 1;
290 result->value.character.string[0] = c;
291 result->value.character.string[1] = '\0'; /* For debugger */
297 gfc_simplify_acos (gfc_expr *x)
301 if (x->expr_type != EXPR_CONSTANT)
304 if (mpfr_cmp_si (x->value.real, 1) > 0
305 || mpfr_cmp_si (x->value.real, -1) < 0)
307 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
309 return &gfc_bad_expr;
312 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
314 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
316 return range_check (result, "ACOS");
320 gfc_simplify_acosh (gfc_expr *x)
324 if (x->expr_type != EXPR_CONSTANT)
327 if (mpfr_cmp_si (x->value.real, 1) < 0)
329 gfc_error ("Argument of ACOSH at %L must not be less than 1",
331 return &gfc_bad_expr;
334 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
336 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
338 return range_check (result, "ACOSH");
342 gfc_simplify_adjustl (gfc_expr *e)
348 if (e->expr_type != EXPR_CONSTANT)
351 len = e->value.character.length;
353 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
355 result->value.character.length = len;
356 result->value.character.string = gfc_getmem (len + 1);
358 for (count = 0, i = 0; i < len; ++i)
360 ch = e->value.character.string[i];
366 for (i = 0; i < len - count; ++i)
367 result->value.character.string[i] = e->value.character.string[count + i];
369 for (i = len - count; i < len; ++i)
370 result->value.character.string[i] = ' ';
372 result->value.character.string[len] = '\0'; /* For debugger */
379 gfc_simplify_adjustr (gfc_expr *e)
385 if (e->expr_type != EXPR_CONSTANT)
388 len = e->value.character.length;
390 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
392 result->value.character.length = len;
393 result->value.character.string = gfc_getmem (len + 1);
395 for (count = 0, i = len - 1; i >= 0; --i)
397 ch = e->value.character.string[i];
403 for (i = 0; i < count; ++i)
404 result->value.character.string[i] = ' ';
406 for (i = count; i < len; ++i)
407 result->value.character.string[i] = e->value.character.string[i - count];
409 result->value.character.string[len] = '\0'; /* For debugger */
416 gfc_simplify_aimag (gfc_expr *e)
420 if (e->expr_type != EXPR_CONSTANT)
423 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
424 mpfr_set (result->value.real, e->value.complex.i, GFC_RND_MODE);
426 return range_check (result, "AIMAG");
431 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
433 gfc_expr *rtrunc, *result;
436 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
438 return &gfc_bad_expr;
440 if (e->expr_type != EXPR_CONSTANT)
443 rtrunc = gfc_copy_expr (e);
445 mpfr_trunc (rtrunc->value.real, e->value.real);
447 result = gfc_real2real (rtrunc, kind);
448 gfc_free_expr (rtrunc);
450 return range_check (result, "AINT");
455 gfc_simplify_dint (gfc_expr *e)
457 gfc_expr *rtrunc, *result;
459 if (e->expr_type != EXPR_CONSTANT)
462 rtrunc = gfc_copy_expr (e);
464 mpfr_trunc (rtrunc->value.real, e->value.real);
466 result = gfc_real2real (rtrunc, gfc_default_double_kind);
467 gfc_free_expr (rtrunc);
469 return range_check (result, "DINT");
474 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
479 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
481 return &gfc_bad_expr;
483 if (e->expr_type != EXPR_CONSTANT)
486 result = gfc_constant_result (e->ts.type, kind, &e->where);
488 mpfr_round (result->value.real, e->value.real);
490 return range_check (result, "ANINT");
495 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
500 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
503 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
504 if (x->ts.type == BT_INTEGER)
506 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
507 mpz_and (result->value.integer, x->value.integer, y->value.integer);
509 else /* BT_LOGICAL */
511 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
512 result->value.logical = x->value.logical && y->value.logical;
515 return range_check (result, "AND");
520 gfc_simplify_dnint (gfc_expr *e)
524 if (e->expr_type != EXPR_CONSTANT)
527 result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &e->where);
529 mpfr_round (result->value.real, e->value.real);
531 return range_check (result, "DNINT");
536 gfc_simplify_asin (gfc_expr *x)
540 if (x->expr_type != EXPR_CONSTANT)
543 if (mpfr_cmp_si (x->value.real, 1) > 0
544 || mpfr_cmp_si (x->value.real, -1) < 0)
546 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
548 return &gfc_bad_expr;
551 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
553 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
555 return range_check (result, "ASIN");
560 gfc_simplify_asinh (gfc_expr *x)
564 if (x->expr_type != EXPR_CONSTANT)
567 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
569 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
571 return range_check (result, "ASINH");
576 gfc_simplify_atan (gfc_expr *x)
580 if (x->expr_type != EXPR_CONSTANT)
583 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
585 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
587 return range_check (result, "ATAN");
592 gfc_simplify_atanh (gfc_expr *x)
596 if (x->expr_type != EXPR_CONSTANT)
599 if (mpfr_cmp_si (x->value.real, 1) >= 0
600 || mpfr_cmp_si (x->value.real, -1) <= 0)
602 gfc_error ("Argument of ATANH at %L must be inside the range -1 to 1",
604 return &gfc_bad_expr;
607 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
609 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
611 return range_check (result, "ATANH");
616 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
620 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
623 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
625 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
627 gfc_error ("If first argument of ATAN2 %L is zero, then the "
628 "second argument must not be zero", &x->where);
629 gfc_free_expr (result);
630 return &gfc_bad_expr;
633 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
635 return range_check (result, "ATAN2");
640 gfc_simplify_bessel_j0 (gfc_expr *x)
642 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
645 if (x->expr_type != EXPR_CONSTANT)
648 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
649 gfc_set_model_kind (x->ts.kind);
650 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
652 return range_check (result, "BESSEL_J0");
660 gfc_simplify_bessel_j1 (gfc_expr *x)
662 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
665 if (x->expr_type != EXPR_CONSTANT)
668 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
669 gfc_set_model_kind (x->ts.kind);
670 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
672 return range_check (result, "BESSEL_J1");
680 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
682 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
686 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
689 n = mpz_get_si (order->value.integer);
690 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
691 gfc_set_model_kind (x->ts.kind);
692 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
694 return range_check (result, "BESSEL_JN");
702 gfc_simplify_bessel_y0 (gfc_expr *x)
704 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
707 if (x->expr_type != EXPR_CONSTANT)
710 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
711 gfc_set_model_kind (x->ts.kind);
712 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
714 return range_check (result, "BESSEL_Y0");
722 gfc_simplify_bessel_y1 (gfc_expr *x)
724 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
727 if (x->expr_type != EXPR_CONSTANT)
730 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
731 gfc_set_model_kind (x->ts.kind);
732 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
734 return range_check (result, "BESSEL_Y1");
742 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
744 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
748 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
751 n = mpz_get_si (order->value.integer);
752 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
753 gfc_set_model_kind (x->ts.kind);
754 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
756 return range_check (result, "BESSEL_YN");
764 gfc_simplify_bit_size (gfc_expr *e)
769 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
770 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
771 mpz_set_ui (result->value.integer, gfc_integer_kinds[i].bit_size);
778 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
782 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
785 if (gfc_extract_int (bit, &b) != NULL || b < 0)
786 return gfc_logical_expr (0, &e->where);
788 return gfc_logical_expr (mpz_tstbit (e->value.integer, b), &e->where);
793 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
795 gfc_expr *ceil, *result;
798 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
800 return &gfc_bad_expr;
802 if (e->expr_type != EXPR_CONSTANT)
805 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
807 ceil = gfc_copy_expr (e);
809 mpfr_ceil (ceil->value.real, e->value.real);
810 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real);
812 gfc_free_expr (ceil);
814 return range_check (result, "CEILING");
819 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
825 kind = get_kind (BT_CHARACTER, k, "CHAR", gfc_default_character_kind);
827 return &gfc_bad_expr;
829 if (e->expr_type != EXPR_CONSTANT)
832 ch = gfc_extract_int (e, &c);
835 gfc_internal_error ("gfc_simplify_char: %s", ch);
837 if (c < 0 || c > UCHAR_MAX)
838 gfc_error ("Argument of CHAR function at %L outside of range [0,255]",
841 result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
843 result->value.character.length = 1;
844 result->value.character.string = gfc_getmem (2);
846 result->value.character.string[0] = c;
847 result->value.character.string[1] = '\0'; /* For debugger */
853 /* Common subroutine for simplifying CMPLX and DCMPLX. */
856 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
860 result = gfc_constant_result (BT_COMPLEX, kind, &x->where);
862 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
868 mpfr_set_z (result->value.complex.r, x->value.integer, GFC_RND_MODE);
872 mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
876 mpfr_set (result->value.complex.r, x->value.complex.r, GFC_RND_MODE);
877 mpfr_set (result->value.complex.i, x->value.complex.i, GFC_RND_MODE);
881 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
890 mpfr_set_z (result->value.complex.i, y->value.integer, GFC_RND_MODE);
894 mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
898 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
907 ts.kind = result->ts.kind;
909 if (!gfc_convert_boz (x, &ts))
910 return &gfc_bad_expr;
911 mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
918 ts.kind = result->ts.kind;
920 if (!gfc_convert_boz (y, &ts))
921 return &gfc_bad_expr;
922 mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
925 return range_check (result, name);
930 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
934 if (x->expr_type != EXPR_CONSTANT
935 || (y != NULL && y->expr_type != EXPR_CONSTANT))
938 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_real_kind);
940 return &gfc_bad_expr;
942 return simplify_cmplx ("CMPLX", x, y, kind);
947 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
951 if (x->expr_type != EXPR_CONSTANT
952 || (y != NULL && y->expr_type != EXPR_CONSTANT))
955 if (x->ts.type == BT_INTEGER)
957 if (y->ts.type == BT_INTEGER)
958 kind = gfc_default_real_kind;
964 if (y->ts.type == BT_REAL)
965 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
970 return simplify_cmplx ("COMPLEX", x, y, kind);
975 gfc_simplify_conjg (gfc_expr *e)
979 if (e->expr_type != EXPR_CONSTANT)
982 result = gfc_copy_expr (e);
983 mpfr_neg (result->value.complex.i, result->value.complex.i, GFC_RND_MODE);
985 return range_check (result, "CONJG");
990 gfc_simplify_cos (gfc_expr *x)
995 if (x->expr_type != EXPR_CONSTANT)
998 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1003 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1006 gfc_set_model_kind (x->ts.kind);
1010 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
1011 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
1012 mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
1014 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
1015 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
1016 mpfr_mul (xp, xp, xq, GFC_RND_MODE);
1017 mpfr_neg (result->value.complex.i, xp, GFC_RND_MODE );
1023 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1026 return range_check (result, "COS");
1032 gfc_simplify_cosh (gfc_expr *x)
1036 if (x->expr_type != EXPR_CONSTANT)
1039 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1041 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1043 return range_check (result, "COSH");
1048 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
1051 if (x->expr_type != EXPR_CONSTANT
1052 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1055 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
1060 gfc_simplify_dble (gfc_expr *e)
1064 if (e->expr_type != EXPR_CONSTANT)
1071 result = gfc_int2real (e, gfc_default_double_kind);
1075 result = gfc_real2real (e, gfc_default_double_kind);
1079 result = gfc_complex2real (e, gfc_default_double_kind);
1083 gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e->where);
1086 if (e->ts.type == BT_INTEGER && e->is_boz)
1091 ts.kind = gfc_default_double_kind;
1092 result = gfc_copy_expr (e);
1093 if (!gfc_convert_boz (result, &ts))
1094 return &gfc_bad_expr;
1097 return range_check (result, "DBLE");
1102 gfc_simplify_digits (gfc_expr *x)
1106 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1110 digits = gfc_integer_kinds[i].digits;
1115 digits = gfc_real_kinds[i].digits;
1122 return gfc_int_expr (digits);
1127 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1132 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1135 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1136 result = gfc_constant_result (x->ts.type, kind, &x->where);
1141 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1142 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1144 mpz_set_ui (result->value.integer, 0);
1149 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1150 mpfr_sub (result->value.real, x->value.real, y->value.real,
1153 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1158 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1161 return range_check (result, "DIM");
1166 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1168 gfc_expr *a1, *a2, *result;
1170 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1173 result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &x->where);
1175 a1 = gfc_real2real (x, gfc_default_double_kind);
1176 a2 = gfc_real2real (y, gfc_default_double_kind);
1178 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1183 return range_check (result, "DPROD");
1188 gfc_simplify_erf (gfc_expr *x)
1192 if (x->expr_type != EXPR_CONSTANT)
1195 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1197 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1199 return range_check (result, "ERF");
1204 gfc_simplify_erfc (gfc_expr *x)
1208 if (x->expr_type != EXPR_CONSTANT)
1211 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1213 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1215 return range_check (result, "ERFC");
1220 gfc_simplify_epsilon (gfc_expr *e)
1225 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1227 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
1229 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
1231 return range_check (result, "EPSILON");
1236 gfc_simplify_exp (gfc_expr *x)
1241 if (x->expr_type != EXPR_CONSTANT)
1244 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1249 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
1253 gfc_set_model_kind (x->ts.kind);
1256 mpfr_exp (xq, x->value.complex.r, GFC_RND_MODE);
1257 mpfr_cos (xp, x->value.complex.i, GFC_RND_MODE);
1258 mpfr_mul (result->value.complex.r, xq, xp, GFC_RND_MODE);
1259 mpfr_sin (xp, x->value.complex.i, GFC_RND_MODE);
1260 mpfr_mul (result->value.complex.i, xq, xp, GFC_RND_MODE);
1266 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
1269 return range_check (result, "EXP");
1273 gfc_simplify_exponent (gfc_expr *x)
1278 if (x->expr_type != EXPR_CONSTANT)
1281 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1284 gfc_set_model (x->value.real);
1286 if (mpfr_sgn (x->value.real) == 0)
1288 mpz_set_ui (result->value.integer, 0);
1292 i = (int) mpfr_get_exp (x->value.real);
1293 mpz_set_si (result->value.integer, i);
1295 return range_check (result, "EXPONENT");
1300 gfc_simplify_float (gfc_expr *a)
1304 if (a->expr_type != EXPR_CONSTANT)
1313 ts.kind = gfc_default_real_kind;
1315 result = gfc_copy_expr (a);
1316 if (!gfc_convert_boz (result, &ts))
1317 return &gfc_bad_expr;
1320 result = gfc_int2real (a, gfc_default_real_kind);
1321 return range_check (result, "FLOAT");
1326 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
1332 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
1334 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
1336 if (e->expr_type != EXPR_CONSTANT)
1339 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1341 gfc_set_model_kind (kind);
1343 mpfr_floor (floor, e->value.real);
1345 gfc_mpfr_to_mpz (result->value.integer, floor);
1349 return range_check (result, "FLOOR");
1354 gfc_simplify_fraction (gfc_expr *x)
1357 mpfr_t absv, exp, pow2;
1359 if (x->expr_type != EXPR_CONSTANT)
1362 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
1364 gfc_set_model_kind (x->ts.kind);
1366 if (mpfr_sgn (x->value.real) == 0)
1368 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1376 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
1377 mpfr_log2 (exp, absv, GFC_RND_MODE);
1379 mpfr_trunc (exp, exp);
1380 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
1382 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
1384 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
1390 return range_check (result, "FRACTION");
1395 gfc_simplify_gamma (gfc_expr *x)
1399 if (x->expr_type != EXPR_CONSTANT)
1402 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1404 gfc_set_model_kind (x->ts.kind);
1406 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
1408 return range_check (result, "GAMMA");
1413 gfc_simplify_huge (gfc_expr *e)
1418 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1420 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1425 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
1429 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
1441 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
1445 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1448 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1449 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
1450 return range_check (result, "HYPOT");
1454 /* We use the processor's collating sequence, because all
1455 systems that gfortran currently works on are ASCII. */
1458 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
1463 if (e->expr_type != EXPR_CONSTANT)
1466 if (e->value.character.length != 1)
1468 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
1469 return &gfc_bad_expr;
1472 index = (unsigned char) e->value.character.string[0];
1474 if (gfc_option.warn_surprising && index > 127)
1475 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
1478 if ((result = int_expr_with_kind (index, kind, "IACHAR")) == NULL)
1479 return &gfc_bad_expr;
1481 result->where = e->where;
1483 return range_check (result, "IACHAR");
1488 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
1492 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1495 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1497 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1499 return range_check (result, "IAND");
1504 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
1509 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1512 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1514 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
1515 return &gfc_bad_expr;
1518 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1520 if (pos >= gfc_integer_kinds[k].bit_size)
1522 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
1524 return &gfc_bad_expr;
1527 result = gfc_copy_expr (x);
1529 convert_mpz_to_unsigned (result->value.integer,
1530 gfc_integer_kinds[k].bit_size);
1532 mpz_clrbit (result->value.integer, pos);
1534 convert_mpz_to_signed (result->value.integer,
1535 gfc_integer_kinds[k].bit_size);
1542 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
1549 if (x->expr_type != EXPR_CONSTANT
1550 || y->expr_type != EXPR_CONSTANT
1551 || z->expr_type != EXPR_CONSTANT)
1554 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1556 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
1557 return &gfc_bad_expr;
1560 if (gfc_extract_int (z, &len) != NULL || len < 0)
1562 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
1563 return &gfc_bad_expr;
1566 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
1568 bitsize = gfc_integer_kinds[k].bit_size;
1570 if (pos + len > bitsize)
1572 gfc_error ("Sum of second and third arguments of IBITS exceeds "
1573 "bit size at %L", &y->where);
1574 return &gfc_bad_expr;
1577 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1578 convert_mpz_to_unsigned (result->value.integer,
1579 gfc_integer_kinds[k].bit_size);
1581 bits = gfc_getmem (bitsize * sizeof (int));
1583 for (i = 0; i < bitsize; i++)
1586 for (i = 0; i < len; i++)
1587 bits[i] = mpz_tstbit (x->value.integer, i + pos);
1589 for (i = 0; i < bitsize; i++)
1592 mpz_clrbit (result->value.integer, i);
1593 else if (bits[i] == 1)
1594 mpz_setbit (result->value.integer, i);
1596 gfc_internal_error ("IBITS: Bad bit");
1601 convert_mpz_to_signed (result->value.integer,
1602 gfc_integer_kinds[k].bit_size);
1609 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
1614 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1617 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1619 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
1620 return &gfc_bad_expr;
1623 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1625 if (pos >= gfc_integer_kinds[k].bit_size)
1627 gfc_error ("Second argument of IBSET exceeds bit size at %L",
1629 return &gfc_bad_expr;
1632 result = gfc_copy_expr (x);
1634 convert_mpz_to_unsigned (result->value.integer,
1635 gfc_integer_kinds[k].bit_size);
1637 mpz_setbit (result->value.integer, pos);
1639 convert_mpz_to_signed (result->value.integer,
1640 gfc_integer_kinds[k].bit_size);
1647 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
1652 if (e->expr_type != EXPR_CONSTANT)
1655 if (e->value.character.length != 1)
1657 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
1658 return &gfc_bad_expr;
1661 index = (unsigned char) e->value.character.string[0];
1663 if (index < 0 || index > UCHAR_MAX)
1664 gfc_internal_error("Argument of ICHAR at %L out of range", &e->where);
1666 if ((result = int_expr_with_kind (index, kind, "ICHAR")) == NULL)
1667 return &gfc_bad_expr;
1669 result->where = e->where;
1670 return range_check (result, "ICHAR");
1675 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
1679 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1682 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1684 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
1686 return range_check (result, "IEOR");
1691 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
1694 int back, len, lensub;
1695 int i, j, k, count, index = 0, start;
1697 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
1698 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
1701 if (b != NULL && b->value.logical != 0)
1706 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
1708 return &gfc_bad_expr;
1710 result = gfc_constant_result (BT_INTEGER, k, &x->where);
1712 len = x->value.character.length;
1713 lensub = y->value.character.length;
1717 mpz_set_si (result->value.integer, 0);
1725 mpz_set_si (result->value.integer, 1);
1728 else if (lensub == 1)
1730 for (i = 0; i < len; i++)
1732 for (j = 0; j < lensub; j++)
1734 if (y->value.character.string[j]
1735 == x->value.character.string[i])
1745 for (i = 0; i < len; i++)
1747 for (j = 0; j < lensub; j++)
1749 if (y->value.character.string[j]
1750 == x->value.character.string[i])
1755 for (k = 0; k < lensub; k++)
1757 if (y->value.character.string[k]
1758 == x->value.character.string[k + start])
1762 if (count == lensub)
1777 mpz_set_si (result->value.integer, len + 1);
1780 else if (lensub == 1)
1782 for (i = 0; i < len; i++)
1784 for (j = 0; j < lensub; j++)
1786 if (y->value.character.string[j]
1787 == x->value.character.string[len - i])
1789 index = len - i + 1;
1797 for (i = 0; i < len; i++)
1799 for (j = 0; j < lensub; j++)
1801 if (y->value.character.string[j]
1802 == x->value.character.string[len - i])
1805 if (start <= len - lensub)
1808 for (k = 0; k < lensub; k++)
1809 if (y->value.character.string[k]
1810 == x->value.character.string[k + start])
1813 if (count == lensub)
1830 mpz_set_si (result->value.integer, index);
1831 return range_check (result, "INDEX");
1836 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
1838 gfc_expr *rpart, *rtrunc, *result;
1841 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
1843 return &gfc_bad_expr;
1845 if (e->expr_type != EXPR_CONSTANT)
1848 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1853 mpz_set (result->value.integer, e->value.integer);
1857 rtrunc = gfc_copy_expr (e);
1858 mpfr_trunc (rtrunc->value.real, e->value.real);
1859 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1860 gfc_free_expr (rtrunc);
1864 rpart = gfc_complex2real (e, kind);
1865 rtrunc = gfc_copy_expr (rpart);
1866 mpfr_trunc (rtrunc->value.real, rpart->value.real);
1867 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1868 gfc_free_expr (rpart);
1869 gfc_free_expr (rtrunc);
1873 gfc_error ("Argument of INT at %L is not a valid type", &e->where);
1874 gfc_free_expr (result);
1875 return &gfc_bad_expr;
1878 return range_check (result, "INT");
1883 gfc_simplify_intconv (gfc_expr *e, int kind, const char *name)
1885 gfc_expr *rpart, *rtrunc, *result;
1887 if (e->expr_type != EXPR_CONSTANT)
1890 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1895 mpz_set (result->value.integer, e->value.integer);
1899 rtrunc = gfc_copy_expr (e);
1900 mpfr_trunc (rtrunc->value.real, e->value.real);
1901 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1902 gfc_free_expr (rtrunc);
1906 rpart = gfc_complex2real (e, kind);
1907 rtrunc = gfc_copy_expr (rpart);
1908 mpfr_trunc (rtrunc->value.real, rpart->value.real);
1909 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1910 gfc_free_expr (rpart);
1911 gfc_free_expr (rtrunc);
1915 gfc_error ("Argument of %s at %L is not a valid type", name, &e->where);
1916 gfc_free_expr (result);
1917 return &gfc_bad_expr;
1920 return range_check (result, name);
1925 gfc_simplify_int2 (gfc_expr *e)
1927 return gfc_simplify_intconv (e, 2, "INT2");
1932 gfc_simplify_int8 (gfc_expr *e)
1934 return gfc_simplify_intconv (e, 8, "INT8");
1939 gfc_simplify_long (gfc_expr *e)
1941 return gfc_simplify_intconv (e, 4, "LONG");
1946 gfc_simplify_ifix (gfc_expr *e)
1948 gfc_expr *rtrunc, *result;
1950 if (e->expr_type != EXPR_CONSTANT)
1953 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1956 rtrunc = gfc_copy_expr (e);
1958 mpfr_trunc (rtrunc->value.real, e->value.real);
1959 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1961 gfc_free_expr (rtrunc);
1962 return range_check (result, "IFIX");
1967 gfc_simplify_idint (gfc_expr *e)
1969 gfc_expr *rtrunc, *result;
1971 if (e->expr_type != EXPR_CONSTANT)
1974 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1977 rtrunc = gfc_copy_expr (e);
1979 mpfr_trunc (rtrunc->value.real, e->value.real);
1980 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1982 gfc_free_expr (rtrunc);
1983 return range_check (result, "IDINT");
1988 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
1992 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1995 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1997 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
1998 return range_check (result, "IOR");
2003 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
2006 int shift, ashift, isize, k, *bits, i;
2008 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2011 if (gfc_extract_int (s, &shift) != NULL)
2013 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
2014 return &gfc_bad_expr;
2017 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2019 isize = gfc_integer_kinds[k].bit_size;
2028 gfc_error ("Magnitude of second argument of ISHFT exceeds bit size "
2029 "at %L", &s->where);
2030 return &gfc_bad_expr;
2033 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2037 mpz_set (result->value.integer, e->value.integer);
2038 return range_check (result, "ISHFT");
2041 bits = gfc_getmem (isize * sizeof (int));
2043 for (i = 0; i < isize; i++)
2044 bits[i] = mpz_tstbit (e->value.integer, i);
2048 for (i = 0; i < shift; i++)
2049 mpz_clrbit (result->value.integer, i);
2051 for (i = 0; i < isize - shift; i++)
2054 mpz_clrbit (result->value.integer, i + shift);
2056 mpz_setbit (result->value.integer, i + shift);
2061 for (i = isize - 1; i >= isize - ashift; i--)
2062 mpz_clrbit (result->value.integer, i);
2064 for (i = isize - 1; i >= ashift; i--)
2067 mpz_clrbit (result->value.integer, i - ashift);
2069 mpz_setbit (result->value.integer, i - ashift);
2073 convert_mpz_to_signed (result->value.integer, isize);
2081 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
2084 int shift, ashift, isize, ssize, delta, k;
2087 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2090 if (gfc_extract_int (s, &shift) != NULL)
2092 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
2093 return &gfc_bad_expr;
2096 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2097 isize = gfc_integer_kinds[k].bit_size;
2101 if (sz->expr_type != EXPR_CONSTANT)
2104 if (gfc_extract_int (sz, &ssize) != NULL || ssize <= 0)
2106 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
2107 return &gfc_bad_expr;
2112 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
2113 "BIT_SIZE of first argument at %L", &s->where);
2114 return &gfc_bad_expr;
2128 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2129 "third argument at %L", &s->where);
2131 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2132 "BIT_SIZE of first argument at %L", &s->where);
2133 return &gfc_bad_expr;
2136 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2138 mpz_set (result->value.integer, e->value.integer);
2143 convert_mpz_to_unsigned (result->value.integer, isize);
2145 bits = gfc_getmem (ssize * sizeof (int));
2147 for (i = 0; i < ssize; i++)
2148 bits[i] = mpz_tstbit (e->value.integer, i);
2150 delta = ssize - ashift;
2154 for (i = 0; i < delta; i++)
2157 mpz_clrbit (result->value.integer, i + shift);
2159 mpz_setbit (result->value.integer, i + shift);
2162 for (i = delta; i < ssize; i++)
2165 mpz_clrbit (result->value.integer, i - delta);
2167 mpz_setbit (result->value.integer, i - delta);
2172 for (i = 0; i < ashift; i++)
2175 mpz_clrbit (result->value.integer, i + delta);
2177 mpz_setbit (result->value.integer, i + delta);
2180 for (i = ashift; i < ssize; i++)
2183 mpz_clrbit (result->value.integer, i + shift);
2185 mpz_setbit (result->value.integer, i + shift);
2189 convert_mpz_to_signed (result->value.integer, isize);
2197 gfc_simplify_kind (gfc_expr *e)
2200 if (e->ts.type == BT_DERIVED)
2202 gfc_error ("Argument of KIND at %L is a DERIVED type", &e->where);
2203 return &gfc_bad_expr;
2206 return gfc_int_expr (e->ts.kind);
2211 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
2214 gfc_expr *l, *u, *result;
2217 /* The last dimension of an assumed-size array is special. */
2218 if (d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
2220 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
2221 return gfc_copy_expr (as->lower[d-1]);
2226 /* Then, we need to know the extent of the given dimension. */
2230 if (l->expr_type != EXPR_CONSTANT || u->expr_type != EXPR_CONSTANT)
2233 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2234 gfc_default_integer_kind);
2236 return &gfc_bad_expr;
2238 result = gfc_constant_result (BT_INTEGER, k, &array->where);
2240 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
2244 mpz_set_si (result->value.integer, 0);
2246 mpz_set_si (result->value.integer, 1);
2250 /* Nonzero extent. */
2252 mpz_set (result->value.integer, u->value.integer);
2254 mpz_set (result->value.integer, l->value.integer);
2257 return range_check (result, upper ? "UBOUND" : "LBOUND");
2262 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
2268 if (array->expr_type != EXPR_VARIABLE)
2271 /* Follow any component references. */
2272 as = array->symtree->n.sym->as;
2273 for (ref = array->ref; ref; ref = ref->next)
2278 switch (ref->u.ar.type)
2285 /* We're done because 'as' has already been set in the
2286 previous iteration. */
2297 as = ref->u.c.component->as;
2309 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
2314 /* Multi-dimensional bounds. */
2315 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
2317 gfc_constructor *head, *tail;
2320 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
2321 if (upper && as->type == AS_ASSUMED_SIZE)
2323 /* An error message will be emitted in
2324 check_assumed_size_reference (resolve.c). */
2325 return &gfc_bad_expr;
2328 /* Simplify the bounds for each dimension. */
2329 for (d = 0; d < array->rank; d++)
2331 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as);
2332 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
2336 for (j = 0; j < d; j++)
2337 gfc_free_expr (bounds[j]);
2342 /* Allocate the result expression. */
2343 e = gfc_get_expr ();
2344 e->where = array->where;
2345 e->expr_type = EXPR_ARRAY;
2346 e->ts.type = BT_INTEGER;
2347 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2348 gfc_default_integer_kind);
2350 return &gfc_bad_expr;
2353 /* The result is a rank 1 array; its size is the rank of the first
2354 argument to {L,U}BOUND. */
2356 e->shape = gfc_get_shape (1);
2357 mpz_init_set_ui (e->shape[0], array->rank);
2359 /* Create the constructor for this array. */
2361 for (d = 0; d < array->rank; d++)
2363 /* Get a new constructor element. */
2365 head = tail = gfc_get_constructor ();
2368 tail->next = gfc_get_constructor ();
2372 tail->where = e->where;
2373 tail->expr = bounds[d];
2375 e->value.constructor = head;
2381 /* A DIM argument is specified. */
2382 if (dim->expr_type != EXPR_CONSTANT)
2385 d = mpz_get_si (dim->value.integer);
2387 if (d < 1 || d > as->rank
2388 || (d == as->rank && as->type == AS_ASSUMED_SIZE && upper))
2390 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
2391 return &gfc_bad_expr;
2394 return simplify_bound_dim (array, kind, d, upper, as);
2400 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
2402 return simplify_bound (array, dim, kind, 0);
2407 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
2410 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
2413 return &gfc_bad_expr;
2415 if (e->expr_type == EXPR_CONSTANT)
2417 result = gfc_constant_result (BT_INTEGER, k, &e->where);
2418 mpz_set_si (result->value.integer, e->value.character.length);
2419 return range_check (result, "LEN");
2422 if (e->ts.cl != NULL && e->ts.cl->length != NULL
2423 && e->ts.cl->length->expr_type == EXPR_CONSTANT
2424 && e->ts.cl->length->ts.type == BT_INTEGER)
2426 result = gfc_constant_result (BT_INTEGER, k, &e->where);
2427 mpz_set (result->value.integer, e->ts.cl->length->value.integer);
2428 return range_check (result, "LEN");
2436 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
2439 int count, len, lentrim, i;
2440 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
2443 return &gfc_bad_expr;
2445 if (e->expr_type != EXPR_CONSTANT)
2448 result = gfc_constant_result (BT_INTEGER, k, &e->where);
2449 len = e->value.character.length;
2451 for (count = 0, i = 1; i <= len; i++)
2452 if (e->value.character.string[len - i] == ' ')
2457 lentrim = len - count;
2459 mpz_set_si (result->value.integer, lentrim);
2460 return range_check (result, "LEN_TRIM");
2464 gfc_simplify_lgamma (gfc_expr *x ATTRIBUTE_UNUSED)
2466 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
2470 if (x->expr_type != EXPR_CONSTANT)
2473 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2475 gfc_set_model_kind (x->ts.kind);
2477 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
2479 return range_check (result, "LGAMMA");
2487 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
2489 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2492 return gfc_logical_expr (gfc_compare_string (a, b) >= 0, &a->where);
2497 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
2499 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2502 return gfc_logical_expr (gfc_compare_string (a, b) > 0,
2508 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
2510 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2513 return gfc_logical_expr (gfc_compare_string (a, b) <= 0, &a->where);
2518 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
2520 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2523 return gfc_logical_expr (gfc_compare_string (a, b) < 0, &a->where);
2528 gfc_simplify_log (gfc_expr *x)
2533 if (x->expr_type != EXPR_CONSTANT)
2536 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2538 gfc_set_model_kind (x->ts.kind);
2543 if (mpfr_sgn (x->value.real) <= 0)
2545 gfc_error ("Argument of LOG at %L cannot be less than or equal "
2546 "to zero", &x->where);
2547 gfc_free_expr (result);
2548 return &gfc_bad_expr;
2551 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
2555 if ((mpfr_sgn (x->value.complex.r) == 0)
2556 && (mpfr_sgn (x->value.complex.i) == 0))
2558 gfc_error ("Complex argument of LOG at %L cannot be zero",
2560 gfc_free_expr (result);
2561 return &gfc_bad_expr;
2567 mpfr_atan2 (result->value.complex.i, x->value.complex.i,
2568 x->value.complex.r, GFC_RND_MODE);
2570 mpfr_mul (xr, x->value.complex.r, x->value.complex.r, GFC_RND_MODE);
2571 mpfr_mul (xi, x->value.complex.i, x->value.complex.i, GFC_RND_MODE);
2572 mpfr_add (xr, xr, xi, GFC_RND_MODE);
2573 mpfr_sqrt (xr, xr, GFC_RND_MODE);
2574 mpfr_log (result->value.complex.r, xr, GFC_RND_MODE);
2582 gfc_internal_error ("gfc_simplify_log: bad type");
2585 return range_check (result, "LOG");
2590 gfc_simplify_log10 (gfc_expr *x)
2594 if (x->expr_type != EXPR_CONSTANT)
2597 gfc_set_model_kind (x->ts.kind);
2599 if (mpfr_sgn (x->value.real) <= 0)
2601 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
2602 "to zero", &x->where);
2603 return &gfc_bad_expr;
2606 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2608 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
2610 return range_check (result, "LOG10");
2615 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
2620 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
2622 return &gfc_bad_expr;
2624 if (e->expr_type != EXPR_CONSTANT)
2627 result = gfc_constant_result (BT_LOGICAL, kind, &e->where);
2629 result->value.logical = e->value.logical;
2635 /* This function is special since MAX() can take any number of
2636 arguments. The simplified expression is a rewritten version of the
2637 argument list containing at most one constant element. Other
2638 constant elements are deleted. Because the argument list has
2639 already been checked, this function always succeeds. sign is 1 for
2640 MAX(), -1 for MIN(). */
2643 simplify_min_max (gfc_expr *expr, int sign)
2645 gfc_actual_arglist *arg, *last, *extremum;
2646 gfc_intrinsic_sym * specific;
2650 specific = expr->value.function.isym;
2652 arg = expr->value.function.actual;
2654 for (; arg; last = arg, arg = arg->next)
2656 if (arg->expr->expr_type != EXPR_CONSTANT)
2659 if (extremum == NULL)
2665 switch (arg->expr->ts.type)
2668 if (mpz_cmp (arg->expr->value.integer,
2669 extremum->expr->value.integer) * sign > 0)
2670 mpz_set (extremum->expr->value.integer, arg->expr->value.integer);
2674 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
2676 mpfr_max (extremum->expr->value.real, extremum->expr->value.real,
2677 arg->expr->value.real, GFC_RND_MODE);
2679 mpfr_min (extremum->expr->value.real, extremum->expr->value.real,
2680 arg->expr->value.real, GFC_RND_MODE);
2684 #define LENGTH(x) ((x)->expr->value.character.length)
2685 #define STRING(x) ((x)->expr->value.character.string)
2686 if (LENGTH(extremum) < LENGTH(arg))
2688 char * tmp = STRING(extremum);
2690 STRING(extremum) = gfc_getmem (LENGTH(arg) + 1);
2691 memcpy (STRING(extremum), tmp, LENGTH(extremum));
2692 memset (&STRING(extremum)[LENGTH(extremum)], ' ',
2693 LENGTH(arg) - LENGTH(extremum));
2694 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
2695 LENGTH(extremum) = LENGTH(arg);
2699 if (gfc_compare_string (arg->expr, extremum->expr) * sign > 0)
2701 gfc_free (STRING(extremum));
2702 STRING(extremum) = gfc_getmem (LENGTH(extremum) + 1);
2703 memcpy (STRING(extremum), STRING(arg), LENGTH(arg));
2704 memset (&STRING(extremum)[LENGTH(arg)], ' ',
2705 LENGTH(extremum) - LENGTH(arg));
2706 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
2714 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
2717 /* Delete the extra constant argument. */
2719 expr->value.function.actual = arg->next;
2721 last->next = arg->next;
2724 gfc_free_actual_arglist (arg);
2728 /* If there is one value left, replace the function call with the
2730 if (expr->value.function.actual->next != NULL)
2733 /* Convert to the correct type and kind. */
2734 if (expr->ts.type != BT_UNKNOWN)
2735 return gfc_convert_constant (expr->value.function.actual->expr,
2736 expr->ts.type, expr->ts.kind);
2738 if (specific->ts.type != BT_UNKNOWN)
2739 return gfc_convert_constant (expr->value.function.actual->expr,
2740 specific->ts.type, specific->ts.kind);
2742 return gfc_copy_expr (expr->value.function.actual->expr);
2747 gfc_simplify_min (gfc_expr *e)
2749 return simplify_min_max (e, -1);
2754 gfc_simplify_max (gfc_expr *e)
2756 return simplify_min_max (e, 1);
2761 gfc_simplify_maxexponent (gfc_expr *x)
2766 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2768 result = gfc_int_expr (gfc_real_kinds[i].max_exponent);
2769 result->where = x->where;
2776 gfc_simplify_minexponent (gfc_expr *x)
2781 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2783 result = gfc_int_expr (gfc_real_kinds[i].min_exponent);
2784 result->where = x->where;
2791 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
2794 mpfr_t quot, iquot, term;
2797 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2800 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2801 result = gfc_constant_result (a->ts.type, kind, &a->where);
2806 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2808 /* Result is processor-dependent. */
2809 gfc_error ("Second argument MOD at %L is zero", &a->where);
2810 gfc_free_expr (result);
2811 return &gfc_bad_expr;
2813 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
2817 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2819 /* Result is processor-dependent. */
2820 gfc_error ("Second argument of MOD at %L is zero", &p->where);
2821 gfc_free_expr (result);
2822 return &gfc_bad_expr;
2825 gfc_set_model_kind (kind);
2830 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2831 mpfr_trunc (iquot, quot);
2832 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2833 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2841 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
2844 return range_check (result, "MOD");
2849 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
2852 mpfr_t quot, iquot, term;
2855 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2858 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2859 result = gfc_constant_result (a->ts.type, kind, &a->where);
2864 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2866 /* Result is processor-dependent. This processor just opts
2867 to not handle it at all. */
2868 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
2869 gfc_free_expr (result);
2870 return &gfc_bad_expr;
2872 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
2877 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2879 /* Result is processor-dependent. */
2880 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
2881 gfc_free_expr (result);
2882 return &gfc_bad_expr;
2885 gfc_set_model_kind (kind);
2890 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2891 mpfr_floor (iquot, quot);
2892 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2893 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2901 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
2904 return range_check (result, "MODULO");
2908 /* Exists for the sole purpose of consistency with other intrinsics. */
2910 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
2911 gfc_expr *fp ATTRIBUTE_UNUSED,
2912 gfc_expr *l ATTRIBUTE_UNUSED,
2913 gfc_expr *to ATTRIBUTE_UNUSED,
2914 gfc_expr *tp ATTRIBUTE_UNUSED)
2921 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
2924 mp_exp_t emin, emax;
2927 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2930 if (mpfr_sgn (s->value.real) == 0)
2932 gfc_error ("Second argument of NEAREST at %L shall not be zero",
2934 return &gfc_bad_expr;
2937 gfc_set_model_kind (x->ts.kind);
2938 result = gfc_copy_expr (x);
2940 /* Save current values of emin and emax. */
2941 emin = mpfr_get_emin ();
2942 emax = mpfr_get_emax ();
2944 /* Set emin and emax for the current model number. */
2945 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
2946 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
2947 mpfr_get_prec(result->value.real) + 1);
2948 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
2950 if (mpfr_sgn (s->value.real) > 0)
2952 mpfr_nextabove (result->value.real);
2953 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
2957 mpfr_nextbelow (result->value.real);
2958 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
2961 mpfr_set_emin (emin);
2962 mpfr_set_emax (emax);
2964 /* Only NaN can occur. Do not use range check as it gives an
2965 error for denormal numbers. */
2966 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
2968 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
2969 return &gfc_bad_expr;
2977 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
2979 gfc_expr *itrunc, *result;
2982 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
2984 return &gfc_bad_expr;
2986 if (e->expr_type != EXPR_CONSTANT)
2989 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
2991 itrunc = gfc_copy_expr (e);
2993 mpfr_round (itrunc->value.real, e->value.real);
2995 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real);
2997 gfc_free_expr (itrunc);
2999 return range_check (result, name);
3004 gfc_simplify_new_line (gfc_expr *e)
3008 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3009 result->value.character.string = gfc_getmem (2);
3010 result->value.character.length = 1;
3011 result->value.character.string[0] = '\n';
3012 result->value.character.string[1] = '\0'; /* For debugger */
3018 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
3020 return simplify_nint ("NINT", e, k);
3025 gfc_simplify_idnint (gfc_expr *e)
3027 return simplify_nint ("IDNINT", e, NULL);
3032 gfc_simplify_not (gfc_expr *e)
3036 if (e->expr_type != EXPR_CONSTANT)
3039 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
3041 mpz_com (result->value.integer, e->value.integer);
3043 return range_check (result, "NOT");
3048 gfc_simplify_null (gfc_expr *mold)
3054 result = gfc_get_expr ();
3055 result->ts.type = BT_UNKNOWN;
3058 result = gfc_copy_expr (mold);
3059 result->expr_type = EXPR_NULL;
3066 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
3071 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3074 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
3075 if (x->ts.type == BT_INTEGER)
3077 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
3078 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
3080 else /* BT_LOGICAL */
3082 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
3083 result->value.logical = x->value.logical || y->value.logical;
3086 return range_check (result, "OR");
3091 gfc_simplify_precision (gfc_expr *e)
3096 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3098 result = gfc_int_expr (gfc_real_kinds[i].precision);
3099 result->where = e->where;
3106 gfc_simplify_radix (gfc_expr *e)
3111 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3115 i = gfc_integer_kinds[i].radix;
3119 i = gfc_real_kinds[i].radix;
3126 result = gfc_int_expr (i);
3127 result->where = e->where;
3134 gfc_simplify_range (gfc_expr *e)
3140 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3145 j = gfc_integer_kinds[i].range;
3150 j = gfc_real_kinds[i].range;
3157 result = gfc_int_expr (j);
3158 result->where = e->where;
3165 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
3170 if (e->ts.type == BT_COMPLEX)
3171 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
3173 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
3176 return &gfc_bad_expr;
3178 if (e->expr_type != EXPR_CONSTANT)
3185 result = gfc_int2real (e, kind);
3189 result = gfc_real2real (e, kind);
3193 result = gfc_complex2real (e, kind);
3197 gfc_internal_error ("bad type in REAL");
3201 if (e->ts.type == BT_INTEGER && e->is_boz)
3207 result = gfc_copy_expr (e);
3208 if (!gfc_convert_boz (result, &ts))
3209 return &gfc_bad_expr;
3211 return range_check (result, "REAL");
3216 gfc_simplify_realpart (gfc_expr *e)
3220 if (e->expr_type != EXPR_CONSTANT)
3223 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
3224 mpfr_set (result->value.real, e->value.complex.r, GFC_RND_MODE);
3226 return range_check (result, "REALPART");
3230 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
3233 int i, j, len, ncop, nlen;
3235 bool have_length = false;
3237 /* If NCOPIES isn't a constant, there's nothing we can do. */
3238 if (n->expr_type != EXPR_CONSTANT)
3241 /* If NCOPIES is negative, it's an error. */
3242 if (mpz_sgn (n->value.integer) < 0)
3244 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
3246 return &gfc_bad_expr;
3249 /* If we don't know the character length, we can do no more. */
3250 if (e->ts.cl && e->ts.cl->length
3251 && e->ts.cl->length->expr_type == EXPR_CONSTANT)
3253 len = mpz_get_si (e->ts.cl->length->value.integer);
3256 else if (e->expr_type == EXPR_CONSTANT
3257 && (e->ts.cl == NULL || e->ts.cl->length == NULL))
3259 len = e->value.character.length;
3264 /* If the source length is 0, any value of NCOPIES is valid
3265 and everything behaves as if NCOPIES == 0. */
3268 mpz_set_ui (ncopies, 0);
3270 mpz_set (ncopies, n->value.integer);
3272 /* Check that NCOPIES isn't too large. */
3278 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
3280 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
3284 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
3285 e->ts.cl->length->value.integer);
3289 mpz_init_set_si (mlen, len);
3290 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
3294 /* The check itself. */
3295 if (mpz_cmp (ncopies, max) > 0)
3298 mpz_clear (ncopies);
3299 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
3301 return &gfc_bad_expr;
3306 mpz_clear (ncopies);
3308 /* For further simplification, we need the character string to be
3310 if (e->expr_type != EXPR_CONSTANT)
3314 (e->ts.cl->length &&
3315 mpz_sgn (e->ts.cl->length->value.integer)) != 0)
3317 const char *res = gfc_extract_int (n, &ncop);
3318 gcc_assert (res == NULL);
3323 len = e->value.character.length;
3326 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3330 result->value.character.string = gfc_getmem (1);
3331 result->value.character.length = 0;
3332 result->value.character.string[0] = '\0';
3336 result->value.character.length = nlen;
3337 result->value.character.string = gfc_getmem (nlen + 1);
3339 for (i = 0; i < ncop; i++)
3340 for (j = 0; j < len; j++)
3341 result->value.character.string[j + i * len]
3342 = e->value.character.string[j];
3344 result->value.character.string[nlen] = '\0'; /* For debugger */
3349 /* Test that the expression is an constant array. */
3352 is_constant_array_expr (gfc_expr *e)
3359 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
3362 if (e->value.constructor == NULL)
3365 for (c = e->value.constructor; c; c = c->next)
3366 if (c->expr->expr_type != EXPR_CONSTANT)
3373 /* This one is a bear, but mainly has to do with shuffling elements. */
3376 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
3377 gfc_expr *pad, gfc_expr *order_exp)
3379 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
3380 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
3381 gfc_constructor *head, *tail;
3387 /* Check that argument expression types are OK. */
3388 if (!is_constant_array_expr (source))
3391 if (!is_constant_array_expr (shape_exp))
3394 if (!is_constant_array_expr (pad))
3397 if (!is_constant_array_expr (order_exp))
3400 /* Proceed with simplification, unpacking the array. */
3408 e = gfc_get_array_element (shape_exp, rank);
3412 if (gfc_extract_int (e, &shape[rank]) != NULL)
3414 gfc_error ("Integer too large in shape specification at %L",
3422 if (rank >= GFC_MAX_DIMENSIONS)
3424 gfc_error ("Too many dimensions in shape specification for RESHAPE "
3425 "at %L", &e->where);
3430 if (shape[rank] < 0)
3432 gfc_error ("Shape specification at %L cannot be negative",
3442 gfc_error ("Shape specification at %L cannot be the null array",
3447 /* Now unpack the order array if present. */
3448 if (order_exp == NULL)
3450 for (i = 0; i < rank; i++)
3455 for (i = 0; i < rank; i++)
3458 for (i = 0; i < rank; i++)
3460 e = gfc_get_array_element (order_exp, i);
3463 gfc_error ("ORDER parameter of RESHAPE at %L is not the same "
3464 "size as SHAPE parameter", &order_exp->where);
3468 if (gfc_extract_int (e, &order[i]) != NULL)
3470 gfc_error ("Error in ORDER parameter of RESHAPE at %L",
3478 if (order[i] < 1 || order[i] > rank)
3480 gfc_error ("ORDER parameter of RESHAPE at %L is out of range",
3489 gfc_error ("Invalid permutation in ORDER parameter at %L",
3498 /* Count the elements in the source and padding arrays. */
3503 gfc_array_size (pad, &size);
3504 npad = mpz_get_ui (size);
3508 gfc_array_size (source, &size);
3509 nsource = mpz_get_ui (size);
3512 /* If it weren't for that pesky permutation we could just loop
3513 through the source and round out any shortage with pad elements.
3514 But no, someone just had to have the compiler do something the
3515 user should be doing. */
3517 for (i = 0; i < rank; i++)
3522 /* Figure out which element to extract. */
3523 mpz_set_ui (index, 0);
3525 for (i = rank - 1; i >= 0; i--)
3527 mpz_add_ui (index, index, x[order[i]]);
3529 mpz_mul_ui (index, index, shape[order[i - 1]]);
3532 if (mpz_cmp_ui (index, INT_MAX) > 0)
3533 gfc_internal_error ("Reshaped array too large at %L", &e->where);
3535 j = mpz_get_ui (index);
3538 e = gfc_get_array_element (source, j);
3545 gfc_error ("PAD parameter required for short SOURCE parameter "
3546 "at %L", &source->where);
3551 e = gfc_get_array_element (pad, j);
3555 head = tail = gfc_get_constructor ();
3558 tail->next = gfc_get_constructor ();
3565 tail->where = e->where;
3568 /* Calculate the next element. */
3572 if (++x[i] < shape[i])
3583 e = gfc_get_expr ();
3584 e->where = source->where;
3585 e->expr_type = EXPR_ARRAY;
3586 e->value.constructor = head;
3587 e->shape = gfc_get_shape (rank);
3589 for (i = 0; i < rank; i++)
3590 mpz_init_set_ui (e->shape[i], shape[i]);
3598 gfc_free_constructor (head);
3600 return &gfc_bad_expr;
3605 gfc_simplify_rrspacing (gfc_expr *x)
3611 if (x->expr_type != EXPR_CONSTANT)
3614 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3616 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3618 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3620 /* Special case x = -0 and 0. */
3621 if (mpfr_sgn (result->value.real) == 0)
3623 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3627 /* | x * 2**(-e) | * 2**p. */
3628 e = - (long int) mpfr_get_exp (x->value.real);
3629 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
3631 p = (long int) gfc_real_kinds[i].digits;
3632 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
3634 return range_check (result, "RRSPACING");
3639 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
3641 int k, neg_flag, power, exp_range;
3642 mpfr_t scale, radix;
3645 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3648 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3650 if (mpfr_sgn (x->value.real) == 0)
3652 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3656 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3658 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
3660 /* This check filters out values of i that would overflow an int. */
3661 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
3662 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
3664 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
3665 return &gfc_bad_expr;
3668 /* Compute scale = radix ** power. */
3669 power = mpz_get_si (i->value.integer);
3679 gfc_set_model_kind (x->ts.kind);
3682 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
3683 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
3686 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
3688 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
3693 return range_check (result, "SCALE");
3698 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
3703 size_t indx, len, lenc;
3704 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
3707 return &gfc_bad_expr;
3709 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
3712 if (b != NULL && b->value.logical != 0)
3717 result = gfc_constant_result (BT_INTEGER, k, &e->where);
3719 len = e->value.character.length;
3720 lenc = c->value.character.length;
3722 if (len == 0 || lenc == 0)
3730 indx = strcspn (e->value.character.string, c->value.character.string)
3738 for (indx = len; indx > 0; indx--)
3740 for (i = 0; i < lenc; i++)
3742 if (c->value.character.string[i]
3743 == e->value.character.string[indx - 1])
3751 mpz_set_ui (result->value.integer, indx);
3752 return range_check (result, "SCAN");
3757 gfc_simplify_selected_char_kind (gfc_expr *e)
3762 if (e->expr_type != EXPR_CONSTANT)
3765 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
3766 || gfc_compare_with_Cstring (e, "default", false) == 0)
3771 result = gfc_int_expr (kind);
3772 result->where = e->where;
3779 gfc_simplify_selected_int_kind (gfc_expr *e)
3784 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
3789 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3790 if (gfc_integer_kinds[i].range >= range
3791 && gfc_integer_kinds[i].kind < kind)
3792 kind = gfc_integer_kinds[i].kind;
3794 if (kind == INT_MAX)
3797 result = gfc_int_expr (kind);
3798 result->where = e->where;
3805 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q)
3807 int range, precision, i, kind, found_precision, found_range;
3814 if (p->expr_type != EXPR_CONSTANT
3815 || gfc_extract_int (p, &precision) != NULL)
3823 if (q->expr_type != EXPR_CONSTANT
3824 || gfc_extract_int (q, &range) != NULL)
3829 found_precision = 0;
3832 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3834 if (gfc_real_kinds[i].precision >= precision)
3835 found_precision = 1;
3837 if (gfc_real_kinds[i].range >= range)
3840 if (gfc_real_kinds[i].precision >= precision
3841 && gfc_real_kinds[i].range >= range && gfc_real_kinds[i].kind < kind)
3842 kind = gfc_real_kinds[i].kind;
3845 if (kind == INT_MAX)
3849 if (!found_precision)
3855 result = gfc_int_expr (kind);
3856 result->where = (p != NULL) ? p->where : q->where;
3863 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
3866 mpfr_t exp, absv, log2, pow2, frac;
3869 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3872 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3874 gfc_set_model_kind (x->ts.kind);
3876 if (mpfr_sgn (x->value.real) == 0)
3878 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3888 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3889 mpfr_log2 (log2, absv, GFC_RND_MODE);
3891 mpfr_trunc (log2, log2);
3892 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3894 /* Old exponent value, and fraction. */
3895 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3897 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3900 exp2 = (unsigned long) mpz_get_d (i->value.integer);
3901 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
3908 return range_check (result, "SET_EXPONENT");
3913 gfc_simplify_shape (gfc_expr *source)
3915 mpz_t shape[GFC_MAX_DIMENSIONS];
3916 gfc_expr *result, *e, *f;
3921 if (source->rank == 0)
3922 return gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3925 if (source->expr_type != EXPR_VARIABLE)
3928 result = gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3931 ar = gfc_find_array_ref (source);
3933 t = gfc_array_ref_shape (ar, shape);
3935 for (n = 0; n < source->rank; n++)
3937 e = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3942 mpz_set (e->value.integer, shape[n]);
3943 mpz_clear (shape[n]);
3947 mpz_set_ui (e->value.integer, n + 1);
3949 f = gfc_simplify_size (source, e, NULL);
3953 gfc_free_expr (result);
3962 gfc_append_constructor (result, e);
3970 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3975 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
3978 return &gfc_bad_expr;
3982 if (gfc_array_size (array, &size) == FAILURE)
3987 if (dim->expr_type != EXPR_CONSTANT)
3990 d = mpz_get_ui (dim->value.integer) - 1;
3991 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
3995 result = gfc_constant_result (BT_INTEGER, k, &array->where);
3996 mpz_set (result->value.integer, size);
4002 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
4006 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4009 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4014 mpz_abs (result->value.integer, x->value.integer);
4015 if (mpz_sgn (y->value.integer) < 0)
4016 mpz_neg (result->value.integer, result->value.integer);
4021 /* TODO: Handle -0.0 and +0.0 correctly on machines that support
4023 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
4024 if (mpfr_sgn (y->value.real) < 0)
4025 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
4030 gfc_internal_error ("Bad type in gfc_simplify_sign");
4038 gfc_simplify_sin (gfc_expr *x)
4043 if (x->expr_type != EXPR_CONSTANT)
4046 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4051 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
4055 gfc_set_model (x->value.real);
4059 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
4060 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
4061 mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
4063 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
4064 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
4065 mpfr_mul (result->value.complex.i, xp, xq, GFC_RND_MODE);
4072 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
4075 return range_check (result, "SIN");
4080 gfc_simplify_sinh (gfc_expr *x)
4084 if (x->expr_type != EXPR_CONSTANT)
4087 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4089 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
4091 return range_check (result, "SINH");
4095 /* The argument is always a double precision real that is converted to
4096 single precision. TODO: Rounding! */
4099 gfc_simplify_sngl (gfc_expr *a)
4103 if (a->expr_type != EXPR_CONSTANT)
4106 result = gfc_real2real (a, gfc_default_real_kind);
4107 return range_check (result, "SNGL");
4112 gfc_simplify_spacing (gfc_expr *x)
4118 if (x->expr_type != EXPR_CONSTANT)
4121 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
4123 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
4125 /* Special case x = 0 and -0. */
4126 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
4127 if (mpfr_sgn (result->value.real) == 0)
4129 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
4133 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
4134 are the radix, exponent of x, and precision. This excludes the
4135 possibility of subnormal numbers. Fortran 2003 states the result is
4136 b**max(e - p, emin - 1). */
4138 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
4139 en = (long int) gfc_real_kinds[i].min_exponent - 1;
4140 en = en > ep ? en : ep;
4142 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
4143 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
4145 return range_check (result, "SPACING");
4150 gfc_simplify_sqrt (gfc_expr *e)
4153 mpfr_t ac, ad, s, t, w;
4155 if (e->expr_type != EXPR_CONSTANT)
4158 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
4163 if (mpfr_cmp_si (e->value.real, 0) < 0)
4165 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
4170 /* Formula taken from Numerical Recipes to avoid over- and
4173 gfc_set_model (e->value.real);
4180 if (mpfr_cmp_ui (e->value.complex.r, 0) == 0
4181 && mpfr_cmp_ui (e->value.complex.i, 0) == 0)
4183 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
4184 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
4188 mpfr_abs (ac, e->value.complex.r, GFC_RND_MODE);
4189 mpfr_abs (ad, e->value.complex.i, GFC_RND_MODE);
4191 if (mpfr_cmp (ac, ad) >= 0)
4193 mpfr_div (t, e->value.complex.i, e->value.complex.r, GFC_RND_MODE);
4194 mpfr_mul (t, t, t, GFC_RND_MODE);
4195 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
4196 mpfr_sqrt (t, t, GFC_RND_MODE);
4197 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
4198 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
4199 mpfr_sqrt (t, t, GFC_RND_MODE);
4200 mpfr_sqrt (s, ac, GFC_RND_MODE);
4201 mpfr_mul (w, s, t, GFC_RND_MODE);
4205 mpfr_div (s, e->value.complex.r, e->value.complex.i, GFC_RND_MODE);
4206 mpfr_mul (t, s, s, GFC_RND_MODE);
4207 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
4208 mpfr_sqrt (t, t, GFC_RND_MODE);
4209 mpfr_abs (s, s, GFC_RND_MODE);
4210 mpfr_add (t, t, s, GFC_RND_MODE);
4211 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
4212 mpfr_sqrt (t, t, GFC_RND_MODE);
4213 mpfr_sqrt (s, ad, GFC_RND_MODE);
4214 mpfr_mul (w, s, t, GFC_RND_MODE);
4217 if (mpfr_cmp_ui (w, 0) != 0 && mpfr_cmp_ui (e->value.complex.r, 0) >= 0)
4219 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
4220 mpfr_div (result->value.complex.i, e->value.complex.i, t, GFC_RND_MODE);
4221 mpfr_set (result->value.complex.r, w, GFC_RND_MODE);
4223 else if (mpfr_cmp_ui (w, 0) != 0
4224 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
4225 && mpfr_cmp_ui (e->value.complex.i, 0) >= 0)
4227 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
4228 mpfr_div (result->value.complex.r, e->value.complex.i, t, GFC_RND_MODE);
4229 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
4231 else if (mpfr_cmp_ui (w, 0) != 0
4232 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
4233 && mpfr_cmp_ui (e->value.complex.i, 0) < 0)
4235 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
4236 mpfr_div (result->value.complex.r, ad, t, GFC_RND_MODE);
4237 mpfr_neg (w, w, GFC_RND_MODE);
4238 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
4241 gfc_internal_error ("invalid complex argument of SQRT at %L",
4253 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
4256 return range_check (result, "SQRT");
4259 gfc_free_expr (result);
4260 gfc_error ("Argument of SQRT at %L has a negative value", &e->where);
4261 return &gfc_bad_expr;
4266 gfc_simplify_tan (gfc_expr *x)
4271 if (x->expr_type != EXPR_CONSTANT)
4274 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4276 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4278 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
4280 return range_check (result, "TAN");
4285 gfc_simplify_tanh (gfc_expr *x)
4289 if (x->expr_type != EXPR_CONSTANT)
4292 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4294 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
4296 return range_check (result, "TANH");
4302 gfc_simplify_tiny (gfc_expr *e)
4307 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
4309 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
4310 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
4317 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
4320 gfc_expr *mold_element;
4323 size_t result_elt_size;
4326 unsigned char *buffer;
4328 if (!gfc_is_constant_expr (source)
4329 || (gfc_init_expr && !gfc_is_constant_expr (mold))
4330 || !gfc_is_constant_expr (size))
4333 if (source->expr_type == EXPR_FUNCTION)
4336 /* Calculate the size of the source. */
4337 if (source->expr_type == EXPR_ARRAY
4338 && gfc_array_size (source, &tmp) == FAILURE)
4339 gfc_internal_error ("Failure getting length of a constant array.");
4341 source_size = gfc_target_expr_size (source);
4343 /* Create an empty new expression with the appropriate characteristics. */
4344 result = gfc_constant_result (mold->ts.type, mold->ts.kind,
4346 result->ts = mold->ts;
4348 mold_element = mold->expr_type == EXPR_ARRAY
4349 ? mold->value.constructor->expr
4352 /* Set result character length, if needed. Note that this needs to be
4353 set even for array expressions, in order to pass this information into
4354 gfc_target_interpret_expr. */
4355 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
4356 result->value.character.length = mold_element->value.character.length;
4358 /* Set the number of elements in the result, and determine its size. */
4359 result_elt_size = gfc_target_expr_size (mold_element);
4360 if (result_elt_size == 0)
4362 gfc_free_expr (result);
4366 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
4370 result->expr_type = EXPR_ARRAY;
4374 result_length = (size_t)mpz_get_ui (size->value.integer);
4377 result_length = source_size / result_elt_size;
4378 if (result_length * result_elt_size < source_size)
4382 result->shape = gfc_get_shape (1);
4383 mpz_init_set_ui (result->shape[0], result_length);
4385 result_size = result_length * result_elt_size;
4390 result_size = result_elt_size;
4393 if (gfc_option.warn_surprising && source_size < result_size)
4394 gfc_warning("Intrinsic TRANSFER at %L has partly undefined result: "
4395 "source size %ld < result size %ld", &source->where,
4396 (long) source_size, (long) result_size);
4398 /* Allocate the buffer to store the binary version of the source. */
4399 buffer_size = MAX (source_size, result_size);
4400 buffer = (unsigned char*)alloca (buffer_size);
4402 /* Now write source to the buffer. */
4403 gfc_target_encode_expr (source, buffer, buffer_size);
4405 /* And read the buffer back into the new expression. */
4406 gfc_target_interpret_expr (buffer, buffer_size, result);
4413 gfc_simplify_trim (gfc_expr *e)
4416 int count, i, len, lentrim;
4418 if (e->expr_type != EXPR_CONSTANT)
4421 len = e->value.character.length;
4423 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
4425 for (count = 0, i = 1; i <= len; ++i)
4427 if (e->value.character.string[len - i] == ' ')
4433 lentrim = len - count;
4435 result->value.character.length = lentrim;
4436 result->value.character.string = gfc_getmem (lentrim + 1);
4438 for (i = 0; i < lentrim; i++)
4439 result->value.character.string[i] = e->value.character.string[i];
4441 result->value.character.string[lentrim] = '\0'; /* For debugger */
4448 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
4450 return simplify_bound (array, dim, kind, 1);
4455 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
4459 size_t index, len, lenset;
4461 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
4464 return &gfc_bad_expr;
4466 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
4469 if (b != NULL && b->value.logical != 0)
4474 result = gfc_constant_result (BT_INTEGER, k, &s->where);
4476 len = s->value.character.length;
4477 lenset = set->value.character.length;
4481 mpz_set_ui (result->value.integer, 0);
4489 mpz_set_ui (result->value.integer, 1);
4493 index = strspn (s->value.character.string, set->value.character.string)
4503 mpz_set_ui (result->value.integer, len);
4506 for (index = len; index > 0; index --)
4508 for (i = 0; i < lenset; i++)
4510 if (s->value.character.string[index - 1]
4511 == set->value.character.string[i])
4519 mpz_set_ui (result->value.integer, index);
4525 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
4530 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4533 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4534 if (x->ts.type == BT_INTEGER)
4536 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
4537 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
4539 else /* BT_LOGICAL */
4541 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
4542 result->value.logical = (x->value.logical && !y->value.logical)
4543 || (!x->value.logical && y->value.logical);
4546 return range_check (result, "XOR");
4550 /****************** Constant simplification *****************/
4552 /* Master function to convert one constant to another. While this is
4553 used as a simplification function, it requires the destination type
4554 and kind information which is supplied by a special case in
4558 gfc_convert_constant (gfc_expr *e, bt type, int kind)
4560 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
4561 gfc_constructor *head, *c, *tail = NULL;
4575 f = gfc_int2complex;
4595 f = gfc_real2complex;
4606 f = gfc_complex2int;
4609 f = gfc_complex2real;
4612 f = gfc_complex2complex;
4638 f = gfc_hollerith2int;
4642 f = gfc_hollerith2real;
4646 f = gfc_hollerith2complex;
4650 f = gfc_hollerith2character;
4654 f = gfc_hollerith2logical;
4664 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
4669 switch (e->expr_type)
4672 result = f (e, kind);
4674 return &gfc_bad_expr;
4678 if (!gfc_is_constant_expr (e))
4683 for (c = e->value.constructor; c; c = c->next)
4686 head = tail = gfc_get_constructor ();
4689 tail->next = gfc_get_constructor ();
4693 tail->where = c->where;
4695 if (c->iterator == NULL)
4696 tail->expr = f (c->expr, kind);
4699 g = gfc_convert_constant (c->expr, type, kind);
4700 if (g == &gfc_bad_expr)
4705 if (tail->expr == NULL)
4707 gfc_free_constructor (head);
4712 result = gfc_get_expr ();
4713 result->ts.type = type;
4714 result->ts.kind = kind;
4715 result->expr_type = EXPR_ARRAY;
4716 result->value.constructor = head;
4717 result->shape = gfc_copy_shape (e->shape, e->rank);
4718 result->where = e->where;
4719 result->rank = e->rank;