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_bit_size (gfc_expr *e)
645 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
646 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
647 mpz_set_ui (result->value.integer, gfc_integer_kinds[i].bit_size);
654 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
658 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
661 if (gfc_extract_int (bit, &b) != NULL || b < 0)
662 return gfc_logical_expr (0, &e->where);
664 return gfc_logical_expr (mpz_tstbit (e->value.integer, b), &e->where);
669 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
671 gfc_expr *ceil, *result;
674 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
676 return &gfc_bad_expr;
678 if (e->expr_type != EXPR_CONSTANT)
681 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
683 ceil = gfc_copy_expr (e);
685 mpfr_ceil (ceil->value.real, e->value.real);
686 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real);
688 gfc_free_expr (ceil);
690 return range_check (result, "CEILING");
695 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
701 kind = get_kind (BT_CHARACTER, k, "CHAR", gfc_default_character_kind);
703 return &gfc_bad_expr;
705 if (e->expr_type != EXPR_CONSTANT)
708 ch = gfc_extract_int (e, &c);
711 gfc_internal_error ("gfc_simplify_char: %s", ch);
713 if (c < 0 || c > UCHAR_MAX)
714 gfc_error ("Argument of CHAR function at %L outside of range [0,255]",
717 result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
719 result->value.character.length = 1;
720 result->value.character.string = gfc_getmem (2);
722 result->value.character.string[0] = c;
723 result->value.character.string[1] = '\0'; /* For debugger */
729 /* Common subroutine for simplifying CMPLX and DCMPLX. */
732 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
736 result = gfc_constant_result (BT_COMPLEX, kind, &x->where);
738 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
744 mpfr_set_z (result->value.complex.r, x->value.integer, GFC_RND_MODE);
748 mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
752 mpfr_set (result->value.complex.r, x->value.complex.r, GFC_RND_MODE);
753 mpfr_set (result->value.complex.i, x->value.complex.i, GFC_RND_MODE);
757 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
766 mpfr_set_z (result->value.complex.i, y->value.integer, GFC_RND_MODE);
770 mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
774 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
783 ts.kind = result->ts.kind;
785 if (!gfc_convert_boz (x, &ts))
786 return &gfc_bad_expr;
787 mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
794 ts.kind = result->ts.kind;
796 if (!gfc_convert_boz (y, &ts))
797 return &gfc_bad_expr;
798 mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
801 return range_check (result, name);
806 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
810 if (x->expr_type != EXPR_CONSTANT
811 || (y != NULL && y->expr_type != EXPR_CONSTANT))
814 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_real_kind);
816 return &gfc_bad_expr;
818 return simplify_cmplx ("CMPLX", x, y, kind);
823 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
827 if (x->expr_type != EXPR_CONSTANT
828 || (y != NULL && y->expr_type != EXPR_CONSTANT))
831 if (x->ts.type == BT_INTEGER)
833 if (y->ts.type == BT_INTEGER)
834 kind = gfc_default_real_kind;
840 if (y->ts.type == BT_REAL)
841 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
846 return simplify_cmplx ("COMPLEX", x, y, kind);
851 gfc_simplify_conjg (gfc_expr *e)
855 if (e->expr_type != EXPR_CONSTANT)
858 result = gfc_copy_expr (e);
859 mpfr_neg (result->value.complex.i, result->value.complex.i, GFC_RND_MODE);
861 return range_check (result, "CONJG");
866 gfc_simplify_cos (gfc_expr *x)
871 if (x->expr_type != EXPR_CONSTANT)
874 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
879 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
882 gfc_set_model_kind (x->ts.kind);
886 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
887 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
888 mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
890 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
891 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
892 mpfr_mul (xp, xp, xq, GFC_RND_MODE);
893 mpfr_neg (result->value.complex.i, xp, GFC_RND_MODE );
899 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
902 return range_check (result, "COS");
908 gfc_simplify_cosh (gfc_expr *x)
912 if (x->expr_type != EXPR_CONSTANT)
915 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
917 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
919 return range_check (result, "COSH");
924 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
927 if (x->expr_type != EXPR_CONSTANT
928 || (y != NULL && y->expr_type != EXPR_CONSTANT))
931 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
936 gfc_simplify_dble (gfc_expr *e)
940 if (e->expr_type != EXPR_CONSTANT)
947 result = gfc_int2real (e, gfc_default_double_kind);
951 result = gfc_real2real (e, gfc_default_double_kind);
955 result = gfc_complex2real (e, gfc_default_double_kind);
959 gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e->where);
962 if (e->ts.type == BT_INTEGER && e->is_boz)
967 ts.kind = gfc_default_double_kind;
968 result = gfc_copy_expr (e);
969 if (!gfc_convert_boz (result, &ts))
970 return &gfc_bad_expr;
973 return range_check (result, "DBLE");
978 gfc_simplify_digits (gfc_expr *x)
982 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
986 digits = gfc_integer_kinds[i].digits;
991 digits = gfc_real_kinds[i].digits;
998 return gfc_int_expr (digits);
1003 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1008 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1011 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1012 result = gfc_constant_result (x->ts.type, kind, &x->where);
1017 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1018 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1020 mpz_set_ui (result->value.integer, 0);
1025 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1026 mpfr_sub (result->value.real, x->value.real, y->value.real,
1029 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1034 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1037 return range_check (result, "DIM");
1042 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1044 gfc_expr *a1, *a2, *result;
1046 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1049 result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &x->where);
1051 a1 = gfc_real2real (x, gfc_default_double_kind);
1052 a2 = gfc_real2real (y, gfc_default_double_kind);
1054 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1059 return range_check (result, "DPROD");
1064 gfc_simplify_erf (gfc_expr *x)
1068 if (x->expr_type != EXPR_CONSTANT)
1071 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1073 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1075 return range_check (result, "ERF");
1080 gfc_simplify_erfc (gfc_expr *x)
1084 if (x->expr_type != EXPR_CONSTANT)
1087 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1089 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1091 return range_check (result, "ERFC");
1096 gfc_simplify_epsilon (gfc_expr *e)
1101 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1103 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
1105 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
1107 return range_check (result, "EPSILON");
1112 gfc_simplify_exp (gfc_expr *x)
1117 if (x->expr_type != EXPR_CONSTANT)
1120 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1125 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
1129 gfc_set_model_kind (x->ts.kind);
1132 mpfr_exp (xq, x->value.complex.r, GFC_RND_MODE);
1133 mpfr_cos (xp, x->value.complex.i, GFC_RND_MODE);
1134 mpfr_mul (result->value.complex.r, xq, xp, GFC_RND_MODE);
1135 mpfr_sin (xp, x->value.complex.i, GFC_RND_MODE);
1136 mpfr_mul (result->value.complex.i, xq, xp, GFC_RND_MODE);
1142 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
1145 return range_check (result, "EXP");
1149 gfc_simplify_exponent (gfc_expr *x)
1154 if (x->expr_type != EXPR_CONSTANT)
1157 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1160 gfc_set_model (x->value.real);
1162 if (mpfr_sgn (x->value.real) == 0)
1164 mpz_set_ui (result->value.integer, 0);
1168 i = (int) mpfr_get_exp (x->value.real);
1169 mpz_set_si (result->value.integer, i);
1171 return range_check (result, "EXPONENT");
1176 gfc_simplify_float (gfc_expr *a)
1180 if (a->expr_type != EXPR_CONSTANT)
1189 ts.kind = gfc_default_real_kind;
1191 result = gfc_copy_expr (a);
1192 if (!gfc_convert_boz (result, &ts))
1193 return &gfc_bad_expr;
1196 result = gfc_int2real (a, gfc_default_real_kind);
1197 return range_check (result, "FLOAT");
1202 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
1208 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
1210 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
1212 if (e->expr_type != EXPR_CONSTANT)
1215 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1217 gfc_set_model_kind (kind);
1219 mpfr_floor (floor, e->value.real);
1221 gfc_mpfr_to_mpz (result->value.integer, floor);
1225 return range_check (result, "FLOOR");
1230 gfc_simplify_fraction (gfc_expr *x)
1233 mpfr_t absv, exp, pow2;
1235 if (x->expr_type != EXPR_CONSTANT)
1238 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
1240 gfc_set_model_kind (x->ts.kind);
1242 if (mpfr_sgn (x->value.real) == 0)
1244 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1252 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
1253 mpfr_log2 (exp, absv, GFC_RND_MODE);
1255 mpfr_trunc (exp, exp);
1256 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
1258 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
1260 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
1266 return range_check (result, "FRACTION");
1271 gfc_simplify_gamma (gfc_expr *x)
1275 if (x->expr_type != EXPR_CONSTANT)
1278 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1280 gfc_set_model_kind (x->ts.kind);
1282 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
1284 return range_check (result, "GAMMA");
1289 gfc_simplify_huge (gfc_expr *e)
1294 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1296 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1301 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
1305 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
1317 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
1321 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1324 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1325 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
1326 return range_check (result, "HYPOT");
1330 /* We use the processor's collating sequence, because all
1331 systems that gfortran currently works on are ASCII. */
1334 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
1339 if (e->expr_type != EXPR_CONSTANT)
1342 if (e->value.character.length != 1)
1344 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
1345 return &gfc_bad_expr;
1348 index = (unsigned char) e->value.character.string[0];
1350 if (gfc_option.warn_surprising && index > 127)
1351 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
1354 if ((result = int_expr_with_kind (index, kind, "IACHAR")) == NULL)
1355 return &gfc_bad_expr;
1357 result->where = e->where;
1359 return range_check (result, "IACHAR");
1364 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
1368 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1371 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1373 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1375 return range_check (result, "IAND");
1380 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
1385 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1388 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1390 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
1391 return &gfc_bad_expr;
1394 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1396 if (pos >= gfc_integer_kinds[k].bit_size)
1398 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
1400 return &gfc_bad_expr;
1403 result = gfc_copy_expr (x);
1405 convert_mpz_to_unsigned (result->value.integer,
1406 gfc_integer_kinds[k].bit_size);
1408 mpz_clrbit (result->value.integer, pos);
1410 convert_mpz_to_signed (result->value.integer,
1411 gfc_integer_kinds[k].bit_size);
1418 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
1425 if (x->expr_type != EXPR_CONSTANT
1426 || y->expr_type != EXPR_CONSTANT
1427 || z->expr_type != EXPR_CONSTANT)
1430 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1432 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
1433 return &gfc_bad_expr;
1436 if (gfc_extract_int (z, &len) != NULL || len < 0)
1438 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
1439 return &gfc_bad_expr;
1442 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
1444 bitsize = gfc_integer_kinds[k].bit_size;
1446 if (pos + len > bitsize)
1448 gfc_error ("Sum of second and third arguments of IBITS exceeds "
1449 "bit size at %L", &y->where);
1450 return &gfc_bad_expr;
1453 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1454 convert_mpz_to_unsigned (result->value.integer,
1455 gfc_integer_kinds[k].bit_size);
1457 bits = gfc_getmem (bitsize * sizeof (int));
1459 for (i = 0; i < bitsize; i++)
1462 for (i = 0; i < len; i++)
1463 bits[i] = mpz_tstbit (x->value.integer, i + pos);
1465 for (i = 0; i < bitsize; i++)
1468 mpz_clrbit (result->value.integer, i);
1469 else if (bits[i] == 1)
1470 mpz_setbit (result->value.integer, i);
1472 gfc_internal_error ("IBITS: Bad bit");
1477 convert_mpz_to_signed (result->value.integer,
1478 gfc_integer_kinds[k].bit_size);
1485 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
1490 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1493 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1495 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
1496 return &gfc_bad_expr;
1499 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1501 if (pos >= gfc_integer_kinds[k].bit_size)
1503 gfc_error ("Second argument of IBSET exceeds bit size at %L",
1505 return &gfc_bad_expr;
1508 result = gfc_copy_expr (x);
1510 convert_mpz_to_unsigned (result->value.integer,
1511 gfc_integer_kinds[k].bit_size);
1513 mpz_setbit (result->value.integer, pos);
1515 convert_mpz_to_signed (result->value.integer,
1516 gfc_integer_kinds[k].bit_size);
1523 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
1528 if (e->expr_type != EXPR_CONSTANT)
1531 if (e->value.character.length != 1)
1533 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
1534 return &gfc_bad_expr;
1537 index = (unsigned char) e->value.character.string[0];
1539 if (index < 0 || index > UCHAR_MAX)
1540 gfc_internal_error("Argument of ICHAR at %L out of range", &e->where);
1542 if ((result = int_expr_with_kind (index, kind, "ICHAR")) == NULL)
1543 return &gfc_bad_expr;
1545 result->where = e->where;
1546 return range_check (result, "ICHAR");
1551 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
1555 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1558 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1560 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
1562 return range_check (result, "IEOR");
1567 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
1570 int back, len, lensub;
1571 int i, j, k, count, index = 0, start;
1573 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
1574 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
1577 if (b != NULL && b->value.logical != 0)
1582 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
1584 return &gfc_bad_expr;
1586 result = gfc_constant_result (BT_INTEGER, k, &x->where);
1588 len = x->value.character.length;
1589 lensub = y->value.character.length;
1593 mpz_set_si (result->value.integer, 0);
1601 mpz_set_si (result->value.integer, 1);
1604 else if (lensub == 1)
1606 for (i = 0; i < len; i++)
1608 for (j = 0; j < lensub; j++)
1610 if (y->value.character.string[j]
1611 == x->value.character.string[i])
1621 for (i = 0; i < len; i++)
1623 for (j = 0; j < lensub; j++)
1625 if (y->value.character.string[j]
1626 == x->value.character.string[i])
1631 for (k = 0; k < lensub; k++)
1633 if (y->value.character.string[k]
1634 == x->value.character.string[k + start])
1638 if (count == lensub)
1653 mpz_set_si (result->value.integer, len + 1);
1656 else if (lensub == 1)
1658 for (i = 0; i < len; i++)
1660 for (j = 0; j < lensub; j++)
1662 if (y->value.character.string[j]
1663 == x->value.character.string[len - i])
1665 index = len - i + 1;
1673 for (i = 0; i < len; i++)
1675 for (j = 0; j < lensub; j++)
1677 if (y->value.character.string[j]
1678 == x->value.character.string[len - i])
1681 if (start <= len - lensub)
1684 for (k = 0; k < lensub; k++)
1685 if (y->value.character.string[k]
1686 == x->value.character.string[k + start])
1689 if (count == lensub)
1706 mpz_set_si (result->value.integer, index);
1707 return range_check (result, "INDEX");
1712 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
1714 gfc_expr *rpart, *rtrunc, *result;
1717 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
1719 return &gfc_bad_expr;
1721 if (e->expr_type != EXPR_CONSTANT)
1724 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1729 mpz_set (result->value.integer, e->value.integer);
1733 rtrunc = gfc_copy_expr (e);
1734 mpfr_trunc (rtrunc->value.real, e->value.real);
1735 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1736 gfc_free_expr (rtrunc);
1740 rpart = gfc_complex2real (e, kind);
1741 rtrunc = gfc_copy_expr (rpart);
1742 mpfr_trunc (rtrunc->value.real, rpart->value.real);
1743 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1744 gfc_free_expr (rpart);
1745 gfc_free_expr (rtrunc);
1749 gfc_error ("Argument of INT at %L is not a valid type", &e->where);
1750 gfc_free_expr (result);
1751 return &gfc_bad_expr;
1754 return range_check (result, "INT");
1759 gfc_simplify_intconv (gfc_expr *e, int kind, const char *name)
1761 gfc_expr *rpart, *rtrunc, *result;
1763 if (e->expr_type != EXPR_CONSTANT)
1766 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1771 mpz_set (result->value.integer, e->value.integer);
1775 rtrunc = gfc_copy_expr (e);
1776 mpfr_trunc (rtrunc->value.real, e->value.real);
1777 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1778 gfc_free_expr (rtrunc);
1782 rpart = gfc_complex2real (e, kind);
1783 rtrunc = gfc_copy_expr (rpart);
1784 mpfr_trunc (rtrunc->value.real, rpart->value.real);
1785 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1786 gfc_free_expr (rpart);
1787 gfc_free_expr (rtrunc);
1791 gfc_error ("Argument of %s at %L is not a valid type", name, &e->where);
1792 gfc_free_expr (result);
1793 return &gfc_bad_expr;
1796 return range_check (result, name);
1801 gfc_simplify_int2 (gfc_expr *e)
1803 return gfc_simplify_intconv (e, 2, "INT2");
1808 gfc_simplify_int8 (gfc_expr *e)
1810 return gfc_simplify_intconv (e, 8, "INT8");
1815 gfc_simplify_long (gfc_expr *e)
1817 return gfc_simplify_intconv (e, 4, "LONG");
1822 gfc_simplify_ifix (gfc_expr *e)
1824 gfc_expr *rtrunc, *result;
1826 if (e->expr_type != EXPR_CONSTANT)
1829 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1832 rtrunc = gfc_copy_expr (e);
1834 mpfr_trunc (rtrunc->value.real, e->value.real);
1835 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1837 gfc_free_expr (rtrunc);
1838 return range_check (result, "IFIX");
1843 gfc_simplify_idint (gfc_expr *e)
1845 gfc_expr *rtrunc, *result;
1847 if (e->expr_type != EXPR_CONSTANT)
1850 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1853 rtrunc = gfc_copy_expr (e);
1855 mpfr_trunc (rtrunc->value.real, e->value.real);
1856 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1858 gfc_free_expr (rtrunc);
1859 return range_check (result, "IDINT");
1864 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
1868 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1871 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1873 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
1874 return range_check (result, "IOR");
1879 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
1882 int shift, ashift, isize, k, *bits, i;
1884 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1887 if (gfc_extract_int (s, &shift) != NULL)
1889 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
1890 return &gfc_bad_expr;
1893 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
1895 isize = gfc_integer_kinds[k].bit_size;
1904 gfc_error ("Magnitude of second argument of ISHFT exceeds bit size "
1905 "at %L", &s->where);
1906 return &gfc_bad_expr;
1909 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1913 mpz_set (result->value.integer, e->value.integer);
1914 return range_check (result, "ISHFT");
1917 bits = gfc_getmem (isize * sizeof (int));
1919 for (i = 0; i < isize; i++)
1920 bits[i] = mpz_tstbit (e->value.integer, i);
1924 for (i = 0; i < shift; i++)
1925 mpz_clrbit (result->value.integer, i);
1927 for (i = 0; i < isize - shift; i++)
1930 mpz_clrbit (result->value.integer, i + shift);
1932 mpz_setbit (result->value.integer, i + shift);
1937 for (i = isize - 1; i >= isize - ashift; i--)
1938 mpz_clrbit (result->value.integer, i);
1940 for (i = isize - 1; i >= ashift; i--)
1943 mpz_clrbit (result->value.integer, i - ashift);
1945 mpz_setbit (result->value.integer, i - ashift);
1949 convert_mpz_to_signed (result->value.integer, isize);
1957 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
1960 int shift, ashift, isize, ssize, delta, k;
1963 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1966 if (gfc_extract_int (s, &shift) != NULL)
1968 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
1969 return &gfc_bad_expr;
1972 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1973 isize = gfc_integer_kinds[k].bit_size;
1977 if (sz->expr_type != EXPR_CONSTANT)
1980 if (gfc_extract_int (sz, &ssize) != NULL || ssize <= 0)
1982 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
1983 return &gfc_bad_expr;
1988 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
1989 "BIT_SIZE of first argument at %L", &s->where);
1990 return &gfc_bad_expr;
2004 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2005 "third argument at %L", &s->where);
2007 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2008 "BIT_SIZE of first argument at %L", &s->where);
2009 return &gfc_bad_expr;
2012 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2014 mpz_set (result->value.integer, e->value.integer);
2019 convert_mpz_to_unsigned (result->value.integer, isize);
2021 bits = gfc_getmem (ssize * sizeof (int));
2023 for (i = 0; i < ssize; i++)
2024 bits[i] = mpz_tstbit (e->value.integer, i);
2026 delta = ssize - ashift;
2030 for (i = 0; i < delta; i++)
2033 mpz_clrbit (result->value.integer, i + shift);
2035 mpz_setbit (result->value.integer, i + shift);
2038 for (i = delta; i < ssize; i++)
2041 mpz_clrbit (result->value.integer, i - delta);
2043 mpz_setbit (result->value.integer, i - delta);
2048 for (i = 0; i < ashift; i++)
2051 mpz_clrbit (result->value.integer, i + delta);
2053 mpz_setbit (result->value.integer, i + delta);
2056 for (i = ashift; i < ssize; i++)
2059 mpz_clrbit (result->value.integer, i + shift);
2061 mpz_setbit (result->value.integer, i + shift);
2065 convert_mpz_to_signed (result->value.integer, isize);
2073 gfc_simplify_kind (gfc_expr *e)
2076 if (e->ts.type == BT_DERIVED)
2078 gfc_error ("Argument of KIND at %L is a DERIVED type", &e->where);
2079 return &gfc_bad_expr;
2082 return gfc_int_expr (e->ts.kind);
2087 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
2090 gfc_expr *l, *u, *result;
2093 /* The last dimension of an assumed-size array is special. */
2094 if (d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
2096 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
2097 return gfc_copy_expr (as->lower[d-1]);
2102 /* Then, we need to know the extent of the given dimension. */
2106 if (l->expr_type != EXPR_CONSTANT || u->expr_type != EXPR_CONSTANT)
2109 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2110 gfc_default_integer_kind);
2112 return &gfc_bad_expr;
2114 result = gfc_constant_result (BT_INTEGER, k, &array->where);
2116 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
2120 mpz_set_si (result->value.integer, 0);
2122 mpz_set_si (result->value.integer, 1);
2126 /* Nonzero extent. */
2128 mpz_set (result->value.integer, u->value.integer);
2130 mpz_set (result->value.integer, l->value.integer);
2133 return range_check (result, upper ? "UBOUND" : "LBOUND");
2138 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
2144 if (array->expr_type != EXPR_VARIABLE)
2147 /* Follow any component references. */
2148 as = array->symtree->n.sym->as;
2149 for (ref = array->ref; ref; ref = ref->next)
2154 switch (ref->u.ar.type)
2161 /* We're done because 'as' has already been set in the
2162 previous iteration. */
2173 as = ref->u.c.component->as;
2185 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
2190 /* Multi-dimensional bounds. */
2191 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
2193 gfc_constructor *head, *tail;
2196 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
2197 if (upper && as->type == AS_ASSUMED_SIZE)
2199 /* An error message will be emitted in
2200 check_assumed_size_reference (resolve.c). */
2201 return &gfc_bad_expr;
2204 /* Simplify the bounds for each dimension. */
2205 for (d = 0; d < array->rank; d++)
2207 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as);
2208 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
2212 for (j = 0; j < d; j++)
2213 gfc_free_expr (bounds[j]);
2218 /* Allocate the result expression. */
2219 e = gfc_get_expr ();
2220 e->where = array->where;
2221 e->expr_type = EXPR_ARRAY;
2222 e->ts.type = BT_INTEGER;
2223 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2224 gfc_default_integer_kind);
2226 return &gfc_bad_expr;
2229 /* The result is a rank 1 array; its size is the rank of the first
2230 argument to {L,U}BOUND. */
2232 e->shape = gfc_get_shape (1);
2233 mpz_init_set_ui (e->shape[0], array->rank);
2235 /* Create the constructor for this array. */
2237 for (d = 0; d < array->rank; d++)
2239 /* Get a new constructor element. */
2241 head = tail = gfc_get_constructor ();
2244 tail->next = gfc_get_constructor ();
2248 tail->where = e->where;
2249 tail->expr = bounds[d];
2251 e->value.constructor = head;
2257 /* A DIM argument is specified. */
2258 if (dim->expr_type != EXPR_CONSTANT)
2261 d = mpz_get_si (dim->value.integer);
2263 if (d < 1 || d > as->rank
2264 || (d == as->rank && as->type == AS_ASSUMED_SIZE && upper))
2266 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
2267 return &gfc_bad_expr;
2270 return simplify_bound_dim (array, kind, d, upper, as);
2276 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
2278 return simplify_bound (array, dim, kind, 0);
2283 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
2286 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
2289 return &gfc_bad_expr;
2291 if (e->expr_type == EXPR_CONSTANT)
2293 result = gfc_constant_result (BT_INTEGER, k, &e->where);
2294 mpz_set_si (result->value.integer, e->value.character.length);
2295 return range_check (result, "LEN");
2298 if (e->ts.cl != NULL && e->ts.cl->length != NULL
2299 && e->ts.cl->length->expr_type == EXPR_CONSTANT
2300 && e->ts.cl->length->ts.type == BT_INTEGER)
2302 result = gfc_constant_result (BT_INTEGER, k, &e->where);
2303 mpz_set (result->value.integer, e->ts.cl->length->value.integer);
2304 return range_check (result, "LEN");
2312 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
2315 int count, len, lentrim, i;
2316 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
2319 return &gfc_bad_expr;
2321 if (e->expr_type != EXPR_CONSTANT)
2324 result = gfc_constant_result (BT_INTEGER, k, &e->where);
2325 len = e->value.character.length;
2327 for (count = 0, i = 1; i <= len; i++)
2328 if (e->value.character.string[len - i] == ' ')
2333 lentrim = len - count;
2335 mpz_set_si (result->value.integer, lentrim);
2336 return range_check (result, "LEN_TRIM");
2340 gfc_simplify_lgamma (gfc_expr *x __attribute__((unused)))
2342 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
2346 if (x->expr_type != EXPR_CONSTANT)
2349 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2351 gfc_set_model_kind (x->ts.kind);
2353 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
2355 return range_check (result, "LGAMMA");
2363 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
2365 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2368 return gfc_logical_expr (gfc_compare_string (a, b) >= 0, &a->where);
2373 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
2375 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2378 return gfc_logical_expr (gfc_compare_string (a, b) > 0,
2384 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
2386 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2389 return gfc_logical_expr (gfc_compare_string (a, b) <= 0, &a->where);
2394 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
2396 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2399 return gfc_logical_expr (gfc_compare_string (a, b) < 0, &a->where);
2404 gfc_simplify_log (gfc_expr *x)
2409 if (x->expr_type != EXPR_CONSTANT)
2412 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2414 gfc_set_model_kind (x->ts.kind);
2419 if (mpfr_sgn (x->value.real) <= 0)
2421 gfc_error ("Argument of LOG at %L cannot be less than or equal "
2422 "to zero", &x->where);
2423 gfc_free_expr (result);
2424 return &gfc_bad_expr;
2427 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
2431 if ((mpfr_sgn (x->value.complex.r) == 0)
2432 && (mpfr_sgn (x->value.complex.i) == 0))
2434 gfc_error ("Complex argument of LOG at %L cannot be zero",
2436 gfc_free_expr (result);
2437 return &gfc_bad_expr;
2443 mpfr_atan2 (result->value.complex.i, x->value.complex.i,
2444 x->value.complex.r, GFC_RND_MODE);
2446 mpfr_mul (xr, x->value.complex.r, x->value.complex.r, GFC_RND_MODE);
2447 mpfr_mul (xi, x->value.complex.i, x->value.complex.i, GFC_RND_MODE);
2448 mpfr_add (xr, xr, xi, GFC_RND_MODE);
2449 mpfr_sqrt (xr, xr, GFC_RND_MODE);
2450 mpfr_log (result->value.complex.r, xr, GFC_RND_MODE);
2458 gfc_internal_error ("gfc_simplify_log: bad type");
2461 return range_check (result, "LOG");
2466 gfc_simplify_log10 (gfc_expr *x)
2470 if (x->expr_type != EXPR_CONSTANT)
2473 gfc_set_model_kind (x->ts.kind);
2475 if (mpfr_sgn (x->value.real) <= 0)
2477 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
2478 "to zero", &x->where);
2479 return &gfc_bad_expr;
2482 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2484 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
2486 return range_check (result, "LOG10");
2491 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
2496 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
2498 return &gfc_bad_expr;
2500 if (e->expr_type != EXPR_CONSTANT)
2503 result = gfc_constant_result (BT_LOGICAL, kind, &e->where);
2505 result->value.logical = e->value.logical;
2511 /* This function is special since MAX() can take any number of
2512 arguments. The simplified expression is a rewritten version of the
2513 argument list containing at most one constant element. Other
2514 constant elements are deleted. Because the argument list has
2515 already been checked, this function always succeeds. sign is 1 for
2516 MAX(), -1 for MIN(). */
2519 simplify_min_max (gfc_expr *expr, int sign)
2521 gfc_actual_arglist *arg, *last, *extremum;
2522 gfc_intrinsic_sym * specific;
2526 specific = expr->value.function.isym;
2528 arg = expr->value.function.actual;
2530 for (; arg; last = arg, arg = arg->next)
2532 if (arg->expr->expr_type != EXPR_CONSTANT)
2535 if (extremum == NULL)
2541 switch (arg->expr->ts.type)
2544 if (mpz_cmp (arg->expr->value.integer,
2545 extremum->expr->value.integer) * sign > 0)
2546 mpz_set (extremum->expr->value.integer, arg->expr->value.integer);
2550 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
2552 mpfr_max (extremum->expr->value.real, extremum->expr->value.real,
2553 arg->expr->value.real, GFC_RND_MODE);
2555 mpfr_min (extremum->expr->value.real, extremum->expr->value.real,
2556 arg->expr->value.real, GFC_RND_MODE);
2560 #define LENGTH(x) ((x)->expr->value.character.length)
2561 #define STRING(x) ((x)->expr->value.character.string)
2562 if (LENGTH(extremum) < LENGTH(arg))
2564 char * tmp = STRING(extremum);
2566 STRING(extremum) = gfc_getmem (LENGTH(arg) + 1);
2567 memcpy (STRING(extremum), tmp, LENGTH(extremum));
2568 memset (&STRING(extremum)[LENGTH(extremum)], ' ',
2569 LENGTH(arg) - LENGTH(extremum));
2570 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
2571 LENGTH(extremum) = LENGTH(arg);
2575 if (gfc_compare_string (arg->expr, extremum->expr) * sign > 0)
2577 gfc_free (STRING(extremum));
2578 STRING(extremum) = gfc_getmem (LENGTH(extremum) + 1);
2579 memcpy (STRING(extremum), STRING(arg), LENGTH(arg));
2580 memset (&STRING(extremum)[LENGTH(arg)], ' ',
2581 LENGTH(extremum) - LENGTH(arg));
2582 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
2590 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
2593 /* Delete the extra constant argument. */
2595 expr->value.function.actual = arg->next;
2597 last->next = arg->next;
2600 gfc_free_actual_arglist (arg);
2604 /* If there is one value left, replace the function call with the
2606 if (expr->value.function.actual->next != NULL)
2609 /* Convert to the correct type and kind. */
2610 if (expr->ts.type != BT_UNKNOWN)
2611 return gfc_convert_constant (expr->value.function.actual->expr,
2612 expr->ts.type, expr->ts.kind);
2614 if (specific->ts.type != BT_UNKNOWN)
2615 return gfc_convert_constant (expr->value.function.actual->expr,
2616 specific->ts.type, specific->ts.kind);
2618 return gfc_copy_expr (expr->value.function.actual->expr);
2623 gfc_simplify_min (gfc_expr *e)
2625 return simplify_min_max (e, -1);
2630 gfc_simplify_max (gfc_expr *e)
2632 return simplify_min_max (e, 1);
2637 gfc_simplify_maxexponent (gfc_expr *x)
2642 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2644 result = gfc_int_expr (gfc_real_kinds[i].max_exponent);
2645 result->where = x->where;
2652 gfc_simplify_minexponent (gfc_expr *x)
2657 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2659 result = gfc_int_expr (gfc_real_kinds[i].min_exponent);
2660 result->where = x->where;
2667 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
2670 mpfr_t quot, iquot, term;
2673 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2676 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2677 result = gfc_constant_result (a->ts.type, kind, &a->where);
2682 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2684 /* Result is processor-dependent. */
2685 gfc_error ("Second argument MOD at %L is zero", &a->where);
2686 gfc_free_expr (result);
2687 return &gfc_bad_expr;
2689 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
2693 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2695 /* Result is processor-dependent. */
2696 gfc_error ("Second argument of MOD at %L is zero", &p->where);
2697 gfc_free_expr (result);
2698 return &gfc_bad_expr;
2701 gfc_set_model_kind (kind);
2706 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2707 mpfr_trunc (iquot, quot);
2708 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2709 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2717 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
2720 return range_check (result, "MOD");
2725 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
2728 mpfr_t quot, iquot, term;
2731 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2734 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2735 result = gfc_constant_result (a->ts.type, kind, &a->where);
2740 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2742 /* Result is processor-dependent. This processor just opts
2743 to not handle it at all. */
2744 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
2745 gfc_free_expr (result);
2746 return &gfc_bad_expr;
2748 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
2753 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2755 /* Result is processor-dependent. */
2756 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
2757 gfc_free_expr (result);
2758 return &gfc_bad_expr;
2761 gfc_set_model_kind (kind);
2766 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2767 mpfr_floor (iquot, quot);
2768 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2769 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2777 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
2780 return range_check (result, "MODULO");
2784 /* Exists for the sole purpose of consistency with other intrinsics. */
2786 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
2787 gfc_expr *fp ATTRIBUTE_UNUSED,
2788 gfc_expr *l ATTRIBUTE_UNUSED,
2789 gfc_expr *to ATTRIBUTE_UNUSED,
2790 gfc_expr *tp ATTRIBUTE_UNUSED)
2797 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
2800 mp_exp_t emin, emax;
2803 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2806 if (mpfr_sgn (s->value.real) == 0)
2808 gfc_error ("Second argument of NEAREST at %L shall not be zero",
2810 return &gfc_bad_expr;
2813 gfc_set_model_kind (x->ts.kind);
2814 result = gfc_copy_expr (x);
2816 /* Save current values of emin and emax. */
2817 emin = mpfr_get_emin ();
2818 emax = mpfr_get_emax ();
2820 /* Set emin and emax for the current model number. */
2821 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
2822 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
2823 mpfr_get_prec(result->value.real) + 1);
2824 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
2826 if (mpfr_sgn (s->value.real) > 0)
2828 mpfr_nextabove (result->value.real);
2829 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
2833 mpfr_nextbelow (result->value.real);
2834 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
2837 mpfr_set_emin (emin);
2838 mpfr_set_emax (emax);
2840 /* Only NaN can occur. Do not use range check as it gives an
2841 error for denormal numbers. */
2842 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
2844 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
2845 return &gfc_bad_expr;
2853 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
2855 gfc_expr *itrunc, *result;
2858 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
2860 return &gfc_bad_expr;
2862 if (e->expr_type != EXPR_CONSTANT)
2865 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
2867 itrunc = gfc_copy_expr (e);
2869 mpfr_round (itrunc->value.real, e->value.real);
2871 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real);
2873 gfc_free_expr (itrunc);
2875 return range_check (result, name);
2880 gfc_simplify_new_line (gfc_expr *e)
2884 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
2885 result->value.character.string = gfc_getmem (2);
2886 result->value.character.length = 1;
2887 result->value.character.string[0] = '\n';
2888 result->value.character.string[1] = '\0'; /* For debugger */
2894 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
2896 return simplify_nint ("NINT", e, k);
2901 gfc_simplify_idnint (gfc_expr *e)
2903 return simplify_nint ("IDNINT", e, NULL);
2908 gfc_simplify_not (gfc_expr *e)
2912 if (e->expr_type != EXPR_CONSTANT)
2915 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2917 mpz_com (result->value.integer, e->value.integer);
2919 return range_check (result, "NOT");
2924 gfc_simplify_null (gfc_expr *mold)
2930 result = gfc_get_expr ();
2931 result->ts.type = BT_UNKNOWN;
2934 result = gfc_copy_expr (mold);
2935 result->expr_type = EXPR_NULL;
2942 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
2947 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2950 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
2951 if (x->ts.type == BT_INTEGER)
2953 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
2954 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2956 else /* BT_LOGICAL */
2958 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
2959 result->value.logical = x->value.logical || y->value.logical;
2962 return range_check (result, "OR");
2967 gfc_simplify_precision (gfc_expr *e)
2972 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2974 result = gfc_int_expr (gfc_real_kinds[i].precision);
2975 result->where = e->where;
2982 gfc_simplify_radix (gfc_expr *e)
2987 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2991 i = gfc_integer_kinds[i].radix;
2995 i = gfc_real_kinds[i].radix;
3002 result = gfc_int_expr (i);
3003 result->where = e->where;
3010 gfc_simplify_range (gfc_expr *e)
3016 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3021 j = gfc_integer_kinds[i].range;
3026 j = gfc_real_kinds[i].range;
3033 result = gfc_int_expr (j);
3034 result->where = e->where;
3041 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
3046 if (e->ts.type == BT_COMPLEX)
3047 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
3049 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
3052 return &gfc_bad_expr;
3054 if (e->expr_type != EXPR_CONSTANT)
3061 result = gfc_int2real (e, kind);
3065 result = gfc_real2real (e, kind);
3069 result = gfc_complex2real (e, kind);
3073 gfc_internal_error ("bad type in REAL");
3077 if (e->ts.type == BT_INTEGER && e->is_boz)
3083 result = gfc_copy_expr (e);
3084 if (!gfc_convert_boz (result, &ts))
3085 return &gfc_bad_expr;
3087 return range_check (result, "REAL");
3092 gfc_simplify_realpart (gfc_expr *e)
3096 if (e->expr_type != EXPR_CONSTANT)
3099 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
3100 mpfr_set (result->value.real, e->value.complex.r, GFC_RND_MODE);
3102 return range_check (result, "REALPART");
3106 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
3109 int i, j, len, ncop, nlen;
3111 bool have_length = false;
3113 /* If NCOPIES isn't a constant, there's nothing we can do. */
3114 if (n->expr_type != EXPR_CONSTANT)
3117 /* If NCOPIES is negative, it's an error. */
3118 if (mpz_sgn (n->value.integer) < 0)
3120 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
3122 return &gfc_bad_expr;
3125 /* If we don't know the character length, we can do no more. */
3126 if (e->ts.cl && e->ts.cl->length
3127 && e->ts.cl->length->expr_type == EXPR_CONSTANT)
3129 len = mpz_get_si (e->ts.cl->length->value.integer);
3132 else if (e->expr_type == EXPR_CONSTANT
3133 && (e->ts.cl == NULL || e->ts.cl->length == NULL))
3135 len = e->value.character.length;
3140 /* If the source length is 0, any value of NCOPIES is valid
3141 and everything behaves as if NCOPIES == 0. */
3144 mpz_set_ui (ncopies, 0);
3146 mpz_set (ncopies, n->value.integer);
3148 /* Check that NCOPIES isn't too large. */
3154 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
3156 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
3160 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
3161 e->ts.cl->length->value.integer);
3165 mpz_init_set_si (mlen, len);
3166 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
3170 /* The check itself. */
3171 if (mpz_cmp (ncopies, max) > 0)
3174 mpz_clear (ncopies);
3175 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
3177 return &gfc_bad_expr;
3182 mpz_clear (ncopies);
3184 /* For further simplification, we need the character string to be
3186 if (e->expr_type != EXPR_CONSTANT)
3190 (e->ts.cl->length &&
3191 mpz_sgn (e->ts.cl->length->value.integer)) != 0)
3193 const char *res = gfc_extract_int (n, &ncop);
3194 gcc_assert (res == NULL);
3199 len = e->value.character.length;
3202 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3206 result->value.character.string = gfc_getmem (1);
3207 result->value.character.length = 0;
3208 result->value.character.string[0] = '\0';
3212 result->value.character.length = nlen;
3213 result->value.character.string = gfc_getmem (nlen + 1);
3215 for (i = 0; i < ncop; i++)
3216 for (j = 0; j < len; j++)
3217 result->value.character.string[j + i * len]
3218 = e->value.character.string[j];
3220 result->value.character.string[nlen] = '\0'; /* For debugger */
3225 /* Test that the expression is an constant array. */
3228 is_constant_array_expr (gfc_expr *e)
3235 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
3238 if (e->value.constructor == NULL)
3241 for (c = e->value.constructor; c; c = c->next)
3242 if (c->expr->expr_type != EXPR_CONSTANT)
3249 /* This one is a bear, but mainly has to do with shuffling elements. */
3252 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
3253 gfc_expr *pad, gfc_expr *order_exp)
3255 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
3256 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
3257 gfc_constructor *head, *tail;
3263 /* Check that argument expression types are OK. */
3264 if (!is_constant_array_expr (source))
3267 if (!is_constant_array_expr (shape_exp))
3270 if (!is_constant_array_expr (pad))
3273 if (!is_constant_array_expr (order_exp))
3276 /* Proceed with simplification, unpacking the array. */
3284 e = gfc_get_array_element (shape_exp, rank);
3288 if (gfc_extract_int (e, &shape[rank]) != NULL)
3290 gfc_error ("Integer too large in shape specification at %L",
3298 if (rank >= GFC_MAX_DIMENSIONS)
3300 gfc_error ("Too many dimensions in shape specification for RESHAPE "
3301 "at %L", &e->where);
3306 if (shape[rank] < 0)
3308 gfc_error ("Shape specification at %L cannot be negative",
3318 gfc_error ("Shape specification at %L cannot be the null array",
3323 /* Now unpack the order array if present. */
3324 if (order_exp == NULL)
3326 for (i = 0; i < rank; i++)
3331 for (i = 0; i < rank; i++)
3334 for (i = 0; i < rank; i++)
3336 e = gfc_get_array_element (order_exp, i);
3339 gfc_error ("ORDER parameter of RESHAPE at %L is not the same "
3340 "size as SHAPE parameter", &order_exp->where);
3344 if (gfc_extract_int (e, &order[i]) != NULL)
3346 gfc_error ("Error in ORDER parameter of RESHAPE at %L",
3354 if (order[i] < 1 || order[i] > rank)
3356 gfc_error ("ORDER parameter of RESHAPE at %L is out of range",
3365 gfc_error ("Invalid permutation in ORDER parameter at %L",
3374 /* Count the elements in the source and padding arrays. */
3379 gfc_array_size (pad, &size);
3380 npad = mpz_get_ui (size);
3384 gfc_array_size (source, &size);
3385 nsource = mpz_get_ui (size);
3388 /* If it weren't for that pesky permutation we could just loop
3389 through the source and round out any shortage with pad elements.
3390 But no, someone just had to have the compiler do something the
3391 user should be doing. */
3393 for (i = 0; i < rank; i++)
3398 /* Figure out which element to extract. */
3399 mpz_set_ui (index, 0);
3401 for (i = rank - 1; i >= 0; i--)
3403 mpz_add_ui (index, index, x[order[i]]);
3405 mpz_mul_ui (index, index, shape[order[i - 1]]);
3408 if (mpz_cmp_ui (index, INT_MAX) > 0)
3409 gfc_internal_error ("Reshaped array too large at %L", &e->where);
3411 j = mpz_get_ui (index);
3414 e = gfc_get_array_element (source, j);
3421 gfc_error ("PAD parameter required for short SOURCE parameter "
3422 "at %L", &source->where);
3427 e = gfc_get_array_element (pad, j);
3431 head = tail = gfc_get_constructor ();
3434 tail->next = gfc_get_constructor ();
3441 tail->where = e->where;
3444 /* Calculate the next element. */
3448 if (++x[i] < shape[i])
3459 e = gfc_get_expr ();
3460 e->where = source->where;
3461 e->expr_type = EXPR_ARRAY;
3462 e->value.constructor = head;
3463 e->shape = gfc_get_shape (rank);
3465 for (i = 0; i < rank; i++)
3466 mpz_init_set_ui (e->shape[i], shape[i]);
3474 gfc_free_constructor (head);
3476 return &gfc_bad_expr;
3481 gfc_simplify_rrspacing (gfc_expr *x)
3487 if (x->expr_type != EXPR_CONSTANT)
3490 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3492 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3494 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3496 /* Special case x = -0 and 0. */
3497 if (mpfr_sgn (result->value.real) == 0)
3499 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3503 /* | x * 2**(-e) | * 2**p. */
3504 e = - (long int) mpfr_get_exp (x->value.real);
3505 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
3507 p = (long int) gfc_real_kinds[i].digits;
3508 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
3510 return range_check (result, "RRSPACING");
3515 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
3517 int k, neg_flag, power, exp_range;
3518 mpfr_t scale, radix;
3521 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3524 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3526 if (mpfr_sgn (x->value.real) == 0)
3528 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3532 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3534 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
3536 /* This check filters out values of i that would overflow an int. */
3537 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
3538 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
3540 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
3541 return &gfc_bad_expr;
3544 /* Compute scale = radix ** power. */
3545 power = mpz_get_si (i->value.integer);
3555 gfc_set_model_kind (x->ts.kind);
3558 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
3559 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
3562 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
3564 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
3569 return range_check (result, "SCALE");
3574 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
3579 size_t indx, len, lenc;
3580 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
3583 return &gfc_bad_expr;
3585 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
3588 if (b != NULL && b->value.logical != 0)
3593 result = gfc_constant_result (BT_INTEGER, k, &e->where);
3595 len = e->value.character.length;
3596 lenc = c->value.character.length;
3598 if (len == 0 || lenc == 0)
3606 indx = strcspn (e->value.character.string, c->value.character.string)
3614 for (indx = len; indx > 0; indx--)
3616 for (i = 0; i < lenc; i++)
3618 if (c->value.character.string[i]
3619 == e->value.character.string[indx - 1])
3627 mpz_set_ui (result->value.integer, indx);
3628 return range_check (result, "SCAN");
3633 gfc_simplify_selected_char_kind (gfc_expr *e)
3638 if (e->expr_type != EXPR_CONSTANT)
3641 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
3642 || gfc_compare_with_Cstring (e, "default", false) == 0)
3647 result = gfc_int_expr (kind);
3648 result->where = e->where;
3655 gfc_simplify_selected_int_kind (gfc_expr *e)
3660 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
3665 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3666 if (gfc_integer_kinds[i].range >= range
3667 && gfc_integer_kinds[i].kind < kind)
3668 kind = gfc_integer_kinds[i].kind;
3670 if (kind == INT_MAX)
3673 result = gfc_int_expr (kind);
3674 result->where = e->where;
3681 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q)
3683 int range, precision, i, kind, found_precision, found_range;
3690 if (p->expr_type != EXPR_CONSTANT
3691 || gfc_extract_int (p, &precision) != NULL)
3699 if (q->expr_type != EXPR_CONSTANT
3700 || gfc_extract_int (q, &range) != NULL)
3705 found_precision = 0;
3708 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3710 if (gfc_real_kinds[i].precision >= precision)
3711 found_precision = 1;
3713 if (gfc_real_kinds[i].range >= range)
3716 if (gfc_real_kinds[i].precision >= precision
3717 && gfc_real_kinds[i].range >= range && gfc_real_kinds[i].kind < kind)
3718 kind = gfc_real_kinds[i].kind;
3721 if (kind == INT_MAX)
3725 if (!found_precision)
3731 result = gfc_int_expr (kind);
3732 result->where = (p != NULL) ? p->where : q->where;
3739 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
3742 mpfr_t exp, absv, log2, pow2, frac;
3745 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3748 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3750 gfc_set_model_kind (x->ts.kind);
3752 if (mpfr_sgn (x->value.real) == 0)
3754 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3764 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3765 mpfr_log2 (log2, absv, GFC_RND_MODE);
3767 mpfr_trunc (log2, log2);
3768 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3770 /* Old exponent value, and fraction. */
3771 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3773 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3776 exp2 = (unsigned long) mpz_get_d (i->value.integer);
3777 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
3784 return range_check (result, "SET_EXPONENT");
3789 gfc_simplify_shape (gfc_expr *source)
3791 mpz_t shape[GFC_MAX_DIMENSIONS];
3792 gfc_expr *result, *e, *f;
3797 if (source->rank == 0)
3798 return gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3801 if (source->expr_type != EXPR_VARIABLE)
3804 result = gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3807 ar = gfc_find_array_ref (source);
3809 t = gfc_array_ref_shape (ar, shape);
3811 for (n = 0; n < source->rank; n++)
3813 e = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3818 mpz_set (e->value.integer, shape[n]);
3819 mpz_clear (shape[n]);
3823 mpz_set_ui (e->value.integer, n + 1);
3825 f = gfc_simplify_size (source, e, NULL);
3829 gfc_free_expr (result);
3838 gfc_append_constructor (result, e);
3846 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3851 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
3854 return &gfc_bad_expr;
3858 if (gfc_array_size (array, &size) == FAILURE)
3863 if (dim->expr_type != EXPR_CONSTANT)
3866 d = mpz_get_ui (dim->value.integer) - 1;
3867 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
3871 result = gfc_constant_result (BT_INTEGER, k, &array->where);
3872 mpz_set (result->value.integer, size);
3878 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
3882 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3885 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3890 mpz_abs (result->value.integer, x->value.integer);
3891 if (mpz_sgn (y->value.integer) < 0)
3892 mpz_neg (result->value.integer, result->value.integer);
3897 /* TODO: Handle -0.0 and +0.0 correctly on machines that support
3899 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3900 if (mpfr_sgn (y->value.real) < 0)
3901 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
3906 gfc_internal_error ("Bad type in gfc_simplify_sign");
3914 gfc_simplify_sin (gfc_expr *x)
3919 if (x->expr_type != EXPR_CONSTANT)
3922 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3927 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
3931 gfc_set_model (x->value.real);
3935 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
3936 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
3937 mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
3939 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
3940 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
3941 mpfr_mul (result->value.complex.i, xp, xq, GFC_RND_MODE);
3948 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
3951 return range_check (result, "SIN");
3956 gfc_simplify_sinh (gfc_expr *x)
3960 if (x->expr_type != EXPR_CONSTANT)
3963 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3965 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
3967 return range_check (result, "SINH");
3971 /* The argument is always a double precision real that is converted to
3972 single precision. TODO: Rounding! */
3975 gfc_simplify_sngl (gfc_expr *a)
3979 if (a->expr_type != EXPR_CONSTANT)
3982 result = gfc_real2real (a, gfc_default_real_kind);
3983 return range_check (result, "SNGL");
3988 gfc_simplify_spacing (gfc_expr *x)
3994 if (x->expr_type != EXPR_CONSTANT)
3997 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3999 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
4001 /* Special case x = 0 and -0. */
4002 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
4003 if (mpfr_sgn (result->value.real) == 0)
4005 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
4009 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
4010 are the radix, exponent of x, and precision. This excludes the
4011 possibility of subnormal numbers. Fortran 2003 states the result is
4012 b**max(e - p, emin - 1). */
4014 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
4015 en = (long int) gfc_real_kinds[i].min_exponent - 1;
4016 en = en > ep ? en : ep;
4018 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
4019 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
4021 return range_check (result, "SPACING");
4026 gfc_simplify_sqrt (gfc_expr *e)
4029 mpfr_t ac, ad, s, t, w;
4031 if (e->expr_type != EXPR_CONSTANT)
4034 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
4039 if (mpfr_cmp_si (e->value.real, 0) < 0)
4041 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
4046 /* Formula taken from Numerical Recipes to avoid over- and
4049 gfc_set_model (e->value.real);
4056 if (mpfr_cmp_ui (e->value.complex.r, 0) == 0
4057 && mpfr_cmp_ui (e->value.complex.i, 0) == 0)
4059 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
4060 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
4064 mpfr_abs (ac, e->value.complex.r, GFC_RND_MODE);
4065 mpfr_abs (ad, e->value.complex.i, GFC_RND_MODE);
4067 if (mpfr_cmp (ac, ad) >= 0)
4069 mpfr_div (t, e->value.complex.i, e->value.complex.r, GFC_RND_MODE);
4070 mpfr_mul (t, t, t, GFC_RND_MODE);
4071 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
4072 mpfr_sqrt (t, t, GFC_RND_MODE);
4073 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
4074 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
4075 mpfr_sqrt (t, t, GFC_RND_MODE);
4076 mpfr_sqrt (s, ac, GFC_RND_MODE);
4077 mpfr_mul (w, s, t, GFC_RND_MODE);
4081 mpfr_div (s, e->value.complex.r, e->value.complex.i, GFC_RND_MODE);
4082 mpfr_mul (t, s, s, GFC_RND_MODE);
4083 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
4084 mpfr_sqrt (t, t, GFC_RND_MODE);
4085 mpfr_abs (s, s, GFC_RND_MODE);
4086 mpfr_add (t, t, s, GFC_RND_MODE);
4087 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
4088 mpfr_sqrt (t, t, GFC_RND_MODE);
4089 mpfr_sqrt (s, ad, GFC_RND_MODE);
4090 mpfr_mul (w, s, t, GFC_RND_MODE);
4093 if (mpfr_cmp_ui (w, 0) != 0 && mpfr_cmp_ui (e->value.complex.r, 0) >= 0)
4095 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
4096 mpfr_div (result->value.complex.i, e->value.complex.i, t, GFC_RND_MODE);
4097 mpfr_set (result->value.complex.r, w, GFC_RND_MODE);
4099 else if (mpfr_cmp_ui (w, 0) != 0
4100 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
4101 && mpfr_cmp_ui (e->value.complex.i, 0) >= 0)
4103 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
4104 mpfr_div (result->value.complex.r, e->value.complex.i, t, GFC_RND_MODE);
4105 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
4107 else if (mpfr_cmp_ui (w, 0) != 0
4108 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
4109 && mpfr_cmp_ui (e->value.complex.i, 0) < 0)
4111 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
4112 mpfr_div (result->value.complex.r, ad, t, GFC_RND_MODE);
4113 mpfr_neg (w, w, GFC_RND_MODE);
4114 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
4117 gfc_internal_error ("invalid complex argument of SQRT at %L",
4129 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
4132 return range_check (result, "SQRT");
4135 gfc_free_expr (result);
4136 gfc_error ("Argument of SQRT at %L has a negative value", &e->where);
4137 return &gfc_bad_expr;
4142 gfc_simplify_tan (gfc_expr *x)
4147 if (x->expr_type != EXPR_CONSTANT)
4150 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4152 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4154 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
4156 return range_check (result, "TAN");
4161 gfc_simplify_tanh (gfc_expr *x)
4165 if (x->expr_type != EXPR_CONSTANT)
4168 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4170 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
4172 return range_check (result, "TANH");
4178 gfc_simplify_tiny (gfc_expr *e)
4183 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
4185 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
4186 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
4193 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
4196 gfc_expr *mold_element;
4199 size_t result_elt_size;
4202 unsigned char *buffer;
4204 if (!gfc_is_constant_expr (source)
4205 || (gfc_init_expr && !gfc_is_constant_expr (mold))
4206 || !gfc_is_constant_expr (size))
4209 if (source->expr_type == EXPR_FUNCTION)
4212 /* Calculate the size of the source. */
4213 if (source->expr_type == EXPR_ARRAY
4214 && gfc_array_size (source, &tmp) == FAILURE)
4215 gfc_internal_error ("Failure getting length of a constant array.");
4217 source_size = gfc_target_expr_size (source);
4219 /* Create an empty new expression with the appropriate characteristics. */
4220 result = gfc_constant_result (mold->ts.type, mold->ts.kind,
4222 result->ts = mold->ts;
4224 mold_element = mold->expr_type == EXPR_ARRAY
4225 ? mold->value.constructor->expr
4228 /* Set result character length, if needed. Note that this needs to be
4229 set even for array expressions, in order to pass this information into
4230 gfc_target_interpret_expr. */
4231 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
4232 result->value.character.length = mold_element->value.character.length;
4234 /* Set the number of elements in the result, and determine its size. */
4235 result_elt_size = gfc_target_expr_size (mold_element);
4236 if (result_elt_size == 0)
4238 gfc_free_expr (result);
4242 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
4246 result->expr_type = EXPR_ARRAY;
4250 result_length = (size_t)mpz_get_ui (size->value.integer);
4253 result_length = source_size / result_elt_size;
4254 if (result_length * result_elt_size < source_size)
4258 result->shape = gfc_get_shape (1);
4259 mpz_init_set_ui (result->shape[0], result_length);
4261 result_size = result_length * result_elt_size;
4266 result_size = result_elt_size;
4269 if (gfc_option.warn_surprising && source_size < result_size)
4270 gfc_warning("Intrinsic TRANSFER at %L has partly undefined result: "
4271 "source size %ld < result size %ld", &source->where,
4272 (long) source_size, (long) result_size);
4274 /* Allocate the buffer to store the binary version of the source. */
4275 buffer_size = MAX (source_size, result_size);
4276 buffer = (unsigned char*)alloca (buffer_size);
4278 /* Now write source to the buffer. */
4279 gfc_target_encode_expr (source, buffer, buffer_size);
4281 /* And read the buffer back into the new expression. */
4282 gfc_target_interpret_expr (buffer, buffer_size, result);
4289 gfc_simplify_trim (gfc_expr *e)
4292 int count, i, len, lentrim;
4294 if (e->expr_type != EXPR_CONSTANT)
4297 len = e->value.character.length;
4299 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
4301 for (count = 0, i = 1; i <= len; ++i)
4303 if (e->value.character.string[len - i] == ' ')
4309 lentrim = len - count;
4311 result->value.character.length = lentrim;
4312 result->value.character.string = gfc_getmem (lentrim + 1);
4314 for (i = 0; i < lentrim; i++)
4315 result->value.character.string[i] = e->value.character.string[i];
4317 result->value.character.string[lentrim] = '\0'; /* For debugger */
4324 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
4326 return simplify_bound (array, dim, kind, 1);
4331 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
4335 size_t index, len, lenset;
4337 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
4340 return &gfc_bad_expr;
4342 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
4345 if (b != NULL && b->value.logical != 0)
4350 result = gfc_constant_result (BT_INTEGER, k, &s->where);
4352 len = s->value.character.length;
4353 lenset = set->value.character.length;
4357 mpz_set_ui (result->value.integer, 0);
4365 mpz_set_ui (result->value.integer, 1);
4369 index = strspn (s->value.character.string, set->value.character.string)
4379 mpz_set_ui (result->value.integer, len);
4382 for (index = len; index > 0; index --)
4384 for (i = 0; i < lenset; i++)
4386 if (s->value.character.string[index - 1]
4387 == set->value.character.string[i])
4395 mpz_set_ui (result->value.integer, index);
4401 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
4406 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4409 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4410 if (x->ts.type == BT_INTEGER)
4412 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
4413 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
4415 else /* BT_LOGICAL */
4417 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
4418 result->value.logical = (x->value.logical && !y->value.logical)
4419 || (!x->value.logical && y->value.logical);
4422 return range_check (result, "XOR");
4426 /****************** Constant simplification *****************/
4428 /* Master function to convert one constant to another. While this is
4429 used as a simplification function, it requires the destination type
4430 and kind information which is supplied by a special case in
4434 gfc_convert_constant (gfc_expr *e, bt type, int kind)
4436 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
4437 gfc_constructor *head, *c, *tail = NULL;
4451 f = gfc_int2complex;
4471 f = gfc_real2complex;
4482 f = gfc_complex2int;
4485 f = gfc_complex2real;
4488 f = gfc_complex2complex;
4514 f = gfc_hollerith2int;
4518 f = gfc_hollerith2real;
4522 f = gfc_hollerith2complex;
4526 f = gfc_hollerith2character;
4530 f = gfc_hollerith2logical;
4540 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
4545 switch (e->expr_type)
4548 result = f (e, kind);
4550 return &gfc_bad_expr;
4554 if (!gfc_is_constant_expr (e))
4559 for (c = e->value.constructor; c; c = c->next)
4562 head = tail = gfc_get_constructor ();
4565 tail->next = gfc_get_constructor ();
4569 tail->where = c->where;
4571 if (c->iterator == NULL)
4572 tail->expr = f (c->expr, kind);
4575 g = gfc_convert_constant (c->expr, type, kind);
4576 if (g == &gfc_bad_expr)
4581 if (tail->expr == NULL)
4583 gfc_free_constructor (head);
4588 result = gfc_get_expr ();
4589 result->ts.type = type;
4590 result->ts.kind = kind;
4591 result->expr_type = EXPR_ARRAY;
4592 result->value.constructor = head;
4593 result->shape = gfc_copy_shape (e->shape, e->rank);
4594 result->where = e->where;
4595 result->rank = e->rank;