1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010, 2011 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"
29 #include "constructor.h"
30 #include "version.h" /* For version_string. */
33 gfc_expr gfc_bad_expr;
36 /* Note that 'simplification' is not just transforming expressions.
37 For functions that are not simplified at compile time, range
38 checking is done if possible.
40 The return convention is that each simplification function returns:
42 A new expression node corresponding to the simplified arguments.
43 The original arguments are destroyed by the caller, and must not
44 be a part of the new expression.
46 NULL pointer indicating that no simplification was possible and
47 the original expression should remain intact.
49 An expression pointer to gfc_bad_expr (a static placeholder)
50 indicating that some error has prevented simplification. The
51 error is generated within the function and should be propagated
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 only passed to these subroutines that implement
62 the simplification of transformational intrinsics.
64 The functions in this file don't have much comment with them, but
65 everything is reasonably straight-forward. The Standard, chapter 13
66 is the best comment you'll find for this file anyway. */
68 /* Range checks an expression node. If all goes well, returns the
69 node, otherwise returns &gfc_bad_expr and frees the node. */
72 range_check (gfc_expr *result, const char *name)
77 if (result->expr_type != EXPR_CONSTANT)
80 switch (gfc_range_check (result))
86 gfc_error ("Result of %s overflows its kind at %L", name,
91 gfc_error ("Result of %s underflows its kind at %L", name,
96 gfc_error ("Result of %s is NaN at %L", name, &result->where);
100 gfc_error ("Result of %s gives range error for its kind at %L", name,
105 gfc_free_expr (result);
106 return &gfc_bad_expr;
110 /* A helper function that gets an optional and possibly missing
111 kind parameter. Returns the kind, -1 if something went wrong. */
114 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
121 if (k->expr_type != EXPR_CONSTANT)
123 gfc_error ("KIND parameter of %s at %L must be an initialization "
124 "expression", name, &k->where);
128 if (gfc_extract_int (k, &kind) != NULL
129 || gfc_validate_kind (type, kind, true) < 0)
131 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
139 /* Converts an mpz_t signed variable into an unsigned one, assuming
140 two's complement representations and a binary width of bitsize.
141 The conversion is a no-op unless x is negative; otherwise, it can
142 be accomplished by masking out the high bits. */
145 convert_mpz_to_unsigned (mpz_t x, int bitsize)
151 /* Confirm that no bits above the signed range are unset. */
152 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
154 mpz_init_set_ui (mask, 1);
155 mpz_mul_2exp (mask, mask, bitsize);
156 mpz_sub_ui (mask, mask, 1);
158 mpz_and (x, x, mask);
164 /* Confirm that no bits above the signed range are set. */
165 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
170 /* Converts an mpz_t unsigned variable into a signed one, assuming
171 two's complement representations and a binary width of bitsize.
172 If the bitsize-1 bit is set, this is taken as a sign bit and
173 the number is converted to the corresponding negative number. */
176 convert_mpz_to_signed (mpz_t x, int bitsize)
180 /* Confirm that no bits above the unsigned range are set. */
181 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
183 if (mpz_tstbit (x, bitsize - 1) == 1)
185 mpz_init_set_ui (mask, 1);
186 mpz_mul_2exp (mask, mask, bitsize);
187 mpz_sub_ui (mask, mask, 1);
189 /* We negate the number by hand, zeroing the high bits, that is
190 make it the corresponding positive number, and then have it
191 negated by GMP, giving the correct representation of the
194 mpz_add_ui (x, x, 1);
195 mpz_and (x, x, mask);
204 /* In-place convert BOZ to REAL of the specified kind. */
207 convert_boz (gfc_expr *x, int kind)
209 if (x && x->ts.type == BT_INTEGER && x->is_boz)
216 if (!gfc_convert_boz (x, &ts))
217 return &gfc_bad_expr;
224 /* Test that the expression is an constant array. */
227 is_constant_array_expr (gfc_expr *e)
234 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
237 for (c = gfc_constructor_first (e->value.constructor);
238 c; c = gfc_constructor_next (c))
239 if (c->expr->expr_type != EXPR_CONSTANT
240 && c->expr->expr_type != EXPR_STRUCTURE)
247 /* Initialize a transformational result expression with a given value. */
250 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
252 if (e && e->expr_type == EXPR_ARRAY)
254 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
257 init_result_expr (ctor->expr, init, array);
258 ctor = gfc_constructor_next (ctor);
261 else if (e && e->expr_type == EXPR_CONSTANT)
263 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
270 e->value.logical = (init ? 1 : 0);
275 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
276 else if (init == INT_MAX)
277 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
279 mpz_set_si (e->value.integer, init);
285 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
286 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
288 else if (init == INT_MAX)
289 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
291 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
295 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
301 gfc_expr *len = gfc_simplify_len (array, NULL);
302 gfc_extract_int (len, &length);
303 string = gfc_get_wide_string (length + 1);
304 gfc_wide_memset (string, 0, length);
306 else if (init == INT_MAX)
308 gfc_expr *len = gfc_simplify_len (array, NULL);
309 gfc_extract_int (len, &length);
310 string = gfc_get_wide_string (length + 1);
311 gfc_wide_memset (string, 255, length);
316 string = gfc_get_wide_string (1);
319 string[length] = '\0';
320 e->value.character.length = length;
321 e->value.character.string = string;
333 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul. */
336 compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
337 gfc_expr *matrix_b, int stride_b, int offset_b)
339 gfc_expr *result, *a, *b;
341 result = gfc_get_constant_expr (matrix_a->ts.type, matrix_a->ts.kind,
343 init_result_expr (result, 0, NULL);
345 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
346 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
349 /* Copying of expressions is required as operands are free'd
350 by the gfc_arith routines. */
351 switch (result->ts.type)
354 result = gfc_or (result,
355 gfc_and (gfc_copy_expr (a),
362 result = gfc_add (result,
363 gfc_multiply (gfc_copy_expr (a),
371 offset_a += stride_a;
372 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
374 offset_b += stride_b;
375 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
382 /* Build a result expression for transformational intrinsics,
386 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
387 int kind, locus* where)
392 if (!dim || array->rank == 1)
393 return gfc_get_constant_expr (type, kind, where);
395 result = gfc_get_array_expr (type, kind, where);
396 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
397 result->rank = array->rank - 1;
399 /* gfc_array_size() would count the number of elements in the constructor,
400 we have not built those yet. */
402 for (i = 0; i < result->rank; ++i)
403 nelem *= mpz_get_ui (result->shape[i]);
405 for (i = 0; i < nelem; ++i)
407 gfc_constructor_append_expr (&result->value.constructor,
408 gfc_get_constant_expr (type, kind, where),
416 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
418 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
419 of COUNT intrinsic is .TRUE..
421 Interface and implimentation mimics arith functions as
422 gfc_add, gfc_multiply, etc. */
424 static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
428 gcc_assert (op1->ts.type == BT_INTEGER);
429 gcc_assert (op2->ts.type == BT_LOGICAL);
430 gcc_assert (op2->value.logical);
432 result = gfc_copy_expr (op1);
433 mpz_add_ui (result->value.integer, result->value.integer, 1);
441 /* Transforms an ARRAY with operation OP, according to MASK, to a
442 scalar RESULT. E.g. called if
444 REAL, PARAMETER :: array(n, m) = ...
445 REAL, PARAMETER :: s = SUM(array)
447 where OP == gfc_add(). */
450 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
451 transformational_op op)
454 gfc_constructor *array_ctor, *mask_ctor;
456 /* Shortcut for constant .FALSE. MASK. */
458 && mask->expr_type == EXPR_CONSTANT
459 && !mask->value.logical)
462 array_ctor = gfc_constructor_first (array->value.constructor);
464 if (mask && mask->expr_type == EXPR_ARRAY)
465 mask_ctor = gfc_constructor_first (mask->value.constructor);
469 a = array_ctor->expr;
470 array_ctor = gfc_constructor_next (array_ctor);
472 /* A constant MASK equals .TRUE. here and can be ignored. */
476 mask_ctor = gfc_constructor_next (mask_ctor);
477 if (!m->value.logical)
481 result = op (result, gfc_copy_expr (a));
487 /* Transforms an ARRAY with operation OP, according to MASK, to an
488 array RESULT. E.g. called if
490 REAL, PARAMETER :: array(n, m) = ...
491 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
493 where OP == gfc_multiply(). The result might be post processed using post_op. */
496 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
497 gfc_expr *mask, transformational_op op,
498 transformational_op post_op)
501 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
502 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
503 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
505 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
506 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
507 tmpstride[GFC_MAX_DIMENSIONS];
509 /* Shortcut for constant .FALSE. MASK. */
511 && mask->expr_type == EXPR_CONSTANT
512 && !mask->value.logical)
515 /* Build an indexed table for array element expressions to minimize
516 linked-list traversal. Masked elements are set to NULL. */
517 gfc_array_size (array, &size);
518 arraysize = mpz_get_ui (size);
521 arrayvec = XCNEWVEC (gfc_expr*, arraysize);
523 array_ctor = gfc_constructor_first (array->value.constructor);
525 if (mask && mask->expr_type == EXPR_ARRAY)
526 mask_ctor = gfc_constructor_first (mask->value.constructor);
528 for (i = 0; i < arraysize; ++i)
530 arrayvec[i] = array_ctor->expr;
531 array_ctor = gfc_constructor_next (array_ctor);
535 if (!mask_ctor->expr->value.logical)
538 mask_ctor = gfc_constructor_next (mask_ctor);
542 /* Same for the result expression. */
543 gfc_array_size (result, &size);
544 resultsize = mpz_get_ui (size);
547 resultvec = XCNEWVEC (gfc_expr*, resultsize);
548 result_ctor = gfc_constructor_first (result->value.constructor);
549 for (i = 0; i < resultsize; ++i)
551 resultvec[i] = result_ctor->expr;
552 result_ctor = gfc_constructor_next (result_ctor);
555 gfc_extract_int (dim, &dim_index);
556 dim_index -= 1; /* zero-base index */
560 for (i = 0, n = 0; i < array->rank; ++i)
563 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
566 dim_extent = mpz_get_si (array->shape[i]);
567 dim_stride = tmpstride[i];
571 extent[n] = mpz_get_si (array->shape[i]);
572 sstride[n] = tmpstride[i];
573 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
582 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
584 *dest = op (*dest, gfc_copy_expr (*src));
591 while (!done && count[n] == extent[n])
594 base -= sstride[n] * extent[n];
595 dest -= dstride[n] * extent[n];
598 if (n < result->rank)
609 /* Place updated expression in result constructor. */
610 result_ctor = gfc_constructor_first (result->value.constructor);
611 for (i = 0; i < resultsize; ++i)
614 result_ctor->expr = post_op (result_ctor->expr, resultvec[i]);
616 result_ctor->expr = resultvec[i];
617 result_ctor = gfc_constructor_next (result_ctor);
627 simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
628 int init_val, transformational_op op)
632 if (!is_constant_array_expr (array)
633 || !gfc_is_constant_expr (dim))
637 && !is_constant_array_expr (mask)
638 && mask->expr_type != EXPR_CONSTANT)
641 result = transformational_result (array, dim, array->ts.type,
642 array->ts.kind, &array->where);
643 init_result_expr (result, init_val, NULL);
645 return !dim || array->rank == 1 ?
646 simplify_transformation_to_scalar (result, array, mask, op) :
647 simplify_transformation_to_array (result, array, dim, mask, op, NULL);
651 /********************** Simplification functions *****************************/
654 gfc_simplify_abs (gfc_expr *e)
658 if (e->expr_type != EXPR_CONSTANT)
664 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
665 mpz_abs (result->value.integer, e->value.integer);
666 return range_check (result, "IABS");
669 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
670 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
671 return range_check (result, "ABS");
674 gfc_set_model_kind (e->ts.kind);
675 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
676 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
677 return range_check (result, "CABS");
680 gfc_internal_error ("gfc_simplify_abs(): Bad type");
686 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
690 bool too_large = false;
692 if (e->expr_type != EXPR_CONSTANT)
695 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
697 return &gfc_bad_expr;
699 if (mpz_cmp_si (e->value.integer, 0) < 0)
701 gfc_error ("Argument of %s function at %L is negative", name,
703 return &gfc_bad_expr;
706 if (ascii && gfc_option.warn_surprising
707 && mpz_cmp_si (e->value.integer, 127) > 0)
708 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
711 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
716 mpz_init_set_ui (t, 2);
717 mpz_pow_ui (t, t, 32);
718 mpz_sub_ui (t, t, 1);
719 if (mpz_cmp (e->value.integer, t) > 0)
726 gfc_error ("Argument of %s function at %L is too large for the "
727 "collating sequence of kind %d", name, &e->where, kind);
728 return &gfc_bad_expr;
731 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
732 result->value.character.string[0] = mpz_get_ui (e->value.integer);
739 /* We use the processor's collating sequence, because all
740 systems that gfortran currently works on are ASCII. */
743 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
745 return simplify_achar_char (e, k, "ACHAR", true);
750 gfc_simplify_acos (gfc_expr *x)
754 if (x->expr_type != EXPR_CONSTANT)
760 if (mpfr_cmp_si (x->value.real, 1) > 0
761 || mpfr_cmp_si (x->value.real, -1) < 0)
763 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
765 return &gfc_bad_expr;
767 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
768 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
772 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
773 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
777 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
780 return range_check (result, "ACOS");
784 gfc_simplify_acosh (gfc_expr *x)
788 if (x->expr_type != EXPR_CONSTANT)
794 if (mpfr_cmp_si (x->value.real, 1) < 0)
796 gfc_error ("Argument of ACOSH at %L must not be less than 1",
798 return &gfc_bad_expr;
801 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
802 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
806 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
807 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
811 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
814 return range_check (result, "ACOSH");
818 gfc_simplify_adjustl (gfc_expr *e)
824 if (e->expr_type != EXPR_CONSTANT)
827 len = e->value.character.length;
829 for (count = 0, i = 0; i < len; ++i)
831 ch = e->value.character.string[i];
837 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
838 for (i = 0; i < len - count; ++i)
839 result->value.character.string[i] = e->value.character.string[count + i];
846 gfc_simplify_adjustr (gfc_expr *e)
852 if (e->expr_type != EXPR_CONSTANT)
855 len = e->value.character.length;
857 for (count = 0, i = len - 1; i >= 0; --i)
859 ch = e->value.character.string[i];
865 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
866 for (i = 0; i < count; ++i)
867 result->value.character.string[i] = ' ';
869 for (i = count; i < len; ++i)
870 result->value.character.string[i] = e->value.character.string[i - count];
877 gfc_simplify_aimag (gfc_expr *e)
881 if (e->expr_type != EXPR_CONSTANT)
884 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
885 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
887 return range_check (result, "AIMAG");
892 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
894 gfc_expr *rtrunc, *result;
897 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
899 return &gfc_bad_expr;
901 if (e->expr_type != EXPR_CONSTANT)
904 rtrunc = gfc_copy_expr (e);
905 mpfr_trunc (rtrunc->value.real, e->value.real);
907 result = gfc_real2real (rtrunc, kind);
909 gfc_free_expr (rtrunc);
911 return range_check (result, "AINT");
916 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
918 return simplify_transformation (mask, dim, NULL, true, gfc_and);
923 gfc_simplify_dint (gfc_expr *e)
925 gfc_expr *rtrunc, *result;
927 if (e->expr_type != EXPR_CONSTANT)
930 rtrunc = gfc_copy_expr (e);
931 mpfr_trunc (rtrunc->value.real, e->value.real);
933 result = gfc_real2real (rtrunc, gfc_default_double_kind);
935 gfc_free_expr (rtrunc);
937 return range_check (result, "DINT");
942 gfc_simplify_dreal (gfc_expr *e)
944 gfc_expr *result = NULL;
946 if (e->expr_type != EXPR_CONSTANT)
949 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
950 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
952 return range_check (result, "DREAL");
957 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
962 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
964 return &gfc_bad_expr;
966 if (e->expr_type != EXPR_CONSTANT)
969 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
970 mpfr_round (result->value.real, e->value.real);
972 return range_check (result, "ANINT");
977 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
982 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
985 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
990 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
991 mpz_and (result->value.integer, x->value.integer, y->value.integer);
992 return range_check (result, "AND");
995 return gfc_get_logical_expr (kind, &x->where,
996 x->value.logical && y->value.logical);
1005 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
1007 return simplify_transformation (mask, dim, NULL, false, gfc_or);
1012 gfc_simplify_dnint (gfc_expr *e)
1016 if (e->expr_type != EXPR_CONSTANT)
1019 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
1020 mpfr_round (result->value.real, e->value.real);
1022 return range_check (result, "DNINT");
1027 gfc_simplify_asin (gfc_expr *x)
1031 if (x->expr_type != EXPR_CONSTANT)
1037 if (mpfr_cmp_si (x->value.real, 1) > 0
1038 || mpfr_cmp_si (x->value.real, -1) < 0)
1040 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1042 return &gfc_bad_expr;
1044 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1045 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1049 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1050 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1054 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1057 return range_check (result, "ASIN");
1062 gfc_simplify_asinh (gfc_expr *x)
1066 if (x->expr_type != EXPR_CONSTANT)
1069 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1074 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1078 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1082 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1085 return range_check (result, "ASINH");
1090 gfc_simplify_atan (gfc_expr *x)
1094 if (x->expr_type != EXPR_CONSTANT)
1097 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1102 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1106 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1110 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1113 return range_check (result, "ATAN");
1118 gfc_simplify_atanh (gfc_expr *x)
1122 if (x->expr_type != EXPR_CONSTANT)
1128 if (mpfr_cmp_si (x->value.real, 1) >= 0
1129 || mpfr_cmp_si (x->value.real, -1) <= 0)
1131 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1133 return &gfc_bad_expr;
1135 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1136 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1140 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1141 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1145 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1148 return range_check (result, "ATANH");
1153 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1157 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1160 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
1162 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1163 "second argument must not be zero", &x->where);
1164 return &gfc_bad_expr;
1167 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1168 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1170 return range_check (result, "ATAN2");
1175 gfc_simplify_bessel_j0 (gfc_expr *x)
1179 if (x->expr_type != EXPR_CONSTANT)
1182 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1183 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1185 return range_check (result, "BESSEL_J0");
1190 gfc_simplify_bessel_j1 (gfc_expr *x)
1194 if (x->expr_type != EXPR_CONSTANT)
1197 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1198 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1200 return range_check (result, "BESSEL_J1");
1205 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1210 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1213 n = mpz_get_si (order->value.integer);
1214 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1215 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1217 return range_check (result, "BESSEL_JN");
1221 /* Simplify transformational form of JN and YN. */
1224 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1231 mpfr_t x2rev, last1, last2;
1233 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1234 || order2->expr_type != EXPR_CONSTANT)
1237 n1 = mpz_get_si (order1->value.integer);
1238 n2 = mpz_get_si (order2->value.integer);
1239 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1241 result->shape = gfc_get_shape (1);
1242 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1247 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1248 YN(N, 0.0) = -Inf. */
1250 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1252 if (!jn && gfc_option.flag_range_check)
1254 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1255 gfc_free_expr (result);
1256 return &gfc_bad_expr;
1261 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1262 mpfr_set_ui (e->value.real, 1, GFC_RND_MODE);
1263 gfc_constructor_append_expr (&result->value.constructor, e,
1268 for (i = n1; i <= n2; i++)
1270 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1272 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
1274 mpfr_set_inf (e->value.real, -1);
1275 gfc_constructor_append_expr (&result->value.constructor, e,
1282 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1283 are stable for downward recursion and Neumann functions are stable
1284 for upward recursion. It is
1286 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1287 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1288 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1290 gfc_set_model_kind (x->ts.kind);
1292 /* Get first recursion anchor. */
1296 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1298 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1300 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1301 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1302 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1306 gfc_free_expr (result);
1307 return &gfc_bad_expr;
1309 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1317 /* Get second recursion anchor. */
1321 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1323 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1325 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1326 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1327 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1332 gfc_free_expr (result);
1333 return &gfc_bad_expr;
1336 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1338 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1347 /* Start actual recursion. */
1350 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1352 for (i = 2; i <= n2-n1; i++)
1354 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1356 /* Special case: For YN, if the previous N gave -INF, set
1357 also N+1 to -INF. */
1358 if (!jn && !gfc_option.flag_range_check && mpfr_inf_p (last2))
1360 mpfr_set_inf (e->value.real, -1);
1361 gfc_constructor_append_expr (&result->value.constructor, e,
1366 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1368 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1369 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1371 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1375 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1378 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1380 mpfr_set (last1, last2, GFC_RND_MODE);
1381 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1394 gfc_free_expr (result);
1395 return &gfc_bad_expr;
1400 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1402 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1407 gfc_simplify_bessel_y0 (gfc_expr *x)
1411 if (x->expr_type != EXPR_CONSTANT)
1414 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1415 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1417 return range_check (result, "BESSEL_Y0");
1422 gfc_simplify_bessel_y1 (gfc_expr *x)
1426 if (x->expr_type != EXPR_CONSTANT)
1429 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1430 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1432 return range_check (result, "BESSEL_Y1");
1437 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1442 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1445 n = mpz_get_si (order->value.integer);
1446 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1447 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1449 return range_check (result, "BESSEL_YN");
1454 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1456 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1461 gfc_simplify_bit_size (gfc_expr *e)
1463 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1464 return gfc_get_int_expr (e->ts.kind, &e->where,
1465 gfc_integer_kinds[i].bit_size);
1470 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1474 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1477 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1478 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1480 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1481 mpz_tstbit (e->value.integer, b));
1486 compare_bitwise (gfc_expr *i, gfc_expr *j)
1491 gcc_assert (i->ts.type == BT_INTEGER);
1492 gcc_assert (j->ts.type == BT_INTEGER);
1494 mpz_init_set (x, i->value.integer);
1495 k = gfc_validate_kind (i->ts.type, i->ts.kind, false);
1496 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
1498 mpz_init_set (y, j->value.integer);
1499 k = gfc_validate_kind (j->ts.type, j->ts.kind, false);
1500 convert_mpz_to_unsigned (y, gfc_integer_kinds[k].bit_size);
1502 res = mpz_cmp (x, y);
1510 gfc_simplify_bge (gfc_expr *i, gfc_expr *j)
1512 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1515 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1516 compare_bitwise (i, j) >= 0);
1521 gfc_simplify_bgt (gfc_expr *i, gfc_expr *j)
1523 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1526 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1527 compare_bitwise (i, j) > 0);
1532 gfc_simplify_ble (gfc_expr *i, gfc_expr *j)
1534 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1537 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1538 compare_bitwise (i, j) <= 0);
1543 gfc_simplify_blt (gfc_expr *i, gfc_expr *j)
1545 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1548 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1549 compare_bitwise (i, j) < 0);
1554 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1556 gfc_expr *ceil, *result;
1559 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1561 return &gfc_bad_expr;
1563 if (e->expr_type != EXPR_CONSTANT)
1566 ceil = gfc_copy_expr (e);
1567 mpfr_ceil (ceil->value.real, e->value.real);
1569 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1570 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1572 gfc_free_expr (ceil);
1574 return range_check (result, "CEILING");
1579 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1581 return simplify_achar_char (e, k, "CHAR", false);
1585 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1588 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1592 if (convert_boz (x, kind) == &gfc_bad_expr)
1593 return &gfc_bad_expr;
1595 if (convert_boz (y, kind) == &gfc_bad_expr)
1596 return &gfc_bad_expr;
1598 if (x->expr_type != EXPR_CONSTANT
1599 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1602 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1607 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1611 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1615 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1619 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1623 return range_check (result, name);
1628 mpfr_set_z (mpc_imagref (result->value.complex),
1629 y->value.integer, GFC_RND_MODE);
1633 mpfr_set (mpc_imagref (result->value.complex),
1634 y->value.real, GFC_RND_MODE);
1638 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1641 return range_check (result, name);
1646 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1650 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1652 return &gfc_bad_expr;
1654 return simplify_cmplx ("CMPLX", x, y, kind);
1659 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1663 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1664 kind = gfc_default_complex_kind;
1665 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1667 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1669 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1670 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1674 return simplify_cmplx ("COMPLEX", x, y, kind);
1679 gfc_simplify_conjg (gfc_expr *e)
1683 if (e->expr_type != EXPR_CONSTANT)
1686 result = gfc_copy_expr (e);
1687 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1689 return range_check (result, "CONJG");
1694 gfc_simplify_cos (gfc_expr *x)
1698 if (x->expr_type != EXPR_CONSTANT)
1701 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1706 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1710 gfc_set_model_kind (x->ts.kind);
1711 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1715 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1718 return range_check (result, "COS");
1723 gfc_simplify_cosh (gfc_expr *x)
1727 if (x->expr_type != EXPR_CONSTANT)
1730 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1735 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1739 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1746 return range_check (result, "COSH");
1751 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1755 if (!is_constant_array_expr (mask)
1756 || !gfc_is_constant_expr (dim)
1757 || !gfc_is_constant_expr (kind))
1760 result = transformational_result (mask, dim,
1762 get_kind (BT_INTEGER, kind, "COUNT",
1763 gfc_default_integer_kind),
1766 init_result_expr (result, 0, NULL);
1768 /* Passing MASK twice, once as data array, once as mask.
1769 Whenever gfc_count is called, '1' is added to the result. */
1770 return !dim || mask->rank == 1 ?
1771 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1772 simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL);
1777 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
1779 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
1784 gfc_simplify_dble (gfc_expr *e)
1786 gfc_expr *result = NULL;
1788 if (e->expr_type != EXPR_CONSTANT)
1791 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
1792 return &gfc_bad_expr;
1794 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
1795 if (result == &gfc_bad_expr)
1796 return &gfc_bad_expr;
1798 return range_check (result, "DBLE");
1803 gfc_simplify_digits (gfc_expr *x)
1807 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1812 digits = gfc_integer_kinds[i].digits;
1817 digits = gfc_real_kinds[i].digits;
1824 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
1829 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1834 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1837 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1838 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
1843 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1844 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1846 mpz_set_ui (result->value.integer, 0);
1851 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1852 mpfr_sub (result->value.real, x->value.real, y->value.real,
1855 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1860 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1863 return range_check (result, "DIM");
1868 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
1870 if (!is_constant_array_expr (vector_a)
1871 || !is_constant_array_expr (vector_b))
1874 gcc_assert (vector_a->rank == 1);
1875 gcc_assert (vector_b->rank == 1);
1876 gcc_assert (gfc_compare_types (&vector_a->ts, &vector_b->ts));
1878 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0);
1883 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1885 gfc_expr *a1, *a2, *result;
1887 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1890 a1 = gfc_real2real (x, gfc_default_double_kind);
1891 a2 = gfc_real2real (y, gfc_default_double_kind);
1893 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
1894 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1899 return range_check (result, "DPROD");
1904 simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg,
1908 int i, k, size, shift;
1910 if (arg1->expr_type != EXPR_CONSTANT || arg2->expr_type != EXPR_CONSTANT
1911 || shiftarg->expr_type != EXPR_CONSTANT)
1914 k = gfc_validate_kind (BT_INTEGER, arg1->ts.kind, false);
1915 size = gfc_integer_kinds[k].bit_size;
1917 gfc_extract_int (shiftarg, &shift);
1919 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
1921 shift = size - shift;
1923 result = gfc_get_constant_expr (BT_INTEGER, arg1->ts.kind, &arg1->where);
1924 mpz_set_ui (result->value.integer, 0);
1926 for (i = 0; i < shift; i++)
1927 if (mpz_tstbit (arg2->value.integer, size - shift + i))
1928 mpz_setbit (result->value.integer, i);
1930 for (i = 0; i < size - shift; i++)
1931 if (mpz_tstbit (arg1->value.integer, i))
1932 mpz_setbit (result->value.integer, shift + i);
1934 /* Convert to a signed value. */
1935 convert_mpz_to_signed (result->value.integer, size);
1942 gfc_simplify_dshiftr (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
1944 return simplify_dshift (arg1, arg2, shiftarg, true);
1949 gfc_simplify_dshiftl (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
1951 return simplify_dshift (arg1, arg2, shiftarg, false);
1956 gfc_simplify_erf (gfc_expr *x)
1960 if (x->expr_type != EXPR_CONSTANT)
1963 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1964 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1966 return range_check (result, "ERF");
1971 gfc_simplify_erfc (gfc_expr *x)
1975 if (x->expr_type != EXPR_CONSTANT)
1978 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1979 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1981 return range_check (result, "ERFC");
1985 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
1987 #define MAX_ITER 200
1988 #define ARG_LIMIT 12
1990 /* Calculate ERFC_SCALED directly by its definition:
1992 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
1994 using a large precision for intermediate results. This is used for all
1995 but large values of the argument. */
1997 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
2002 prec = mpfr_get_default_prec ();
2003 mpfr_set_default_prec (10 * prec);
2008 mpfr_set (a, arg, GFC_RND_MODE);
2009 mpfr_sqr (b, a, GFC_RND_MODE);
2010 mpfr_exp (b, b, GFC_RND_MODE);
2011 mpfr_erfc (a, a, GFC_RND_MODE);
2012 mpfr_mul (a, a, b, GFC_RND_MODE);
2014 mpfr_set (res, a, GFC_RND_MODE);
2015 mpfr_set_default_prec (prec);
2021 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2023 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2024 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2027 This is used for large values of the argument. Intermediate calculations
2028 are performed with twice the precision. We don't do a fixed number of
2029 iterations of the sum, but stop when it has converged to the required
2032 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
2034 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
2039 prec = mpfr_get_default_prec ();
2040 mpfr_set_default_prec (2 * prec);
2050 mpfr_init (sumtrunc);
2051 mpfr_set_prec (oldsum, prec);
2052 mpfr_set_prec (sumtrunc, prec);
2054 mpfr_set (x, arg, GFC_RND_MODE);
2055 mpfr_set_ui (sum, 1, GFC_RND_MODE);
2056 mpz_set_ui (num, 1);
2058 mpfr_set (u, x, GFC_RND_MODE);
2059 mpfr_sqr (u, u, GFC_RND_MODE);
2060 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
2061 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
2063 for (i = 1; i < MAX_ITER; i++)
2065 mpfr_set (oldsum, sum, GFC_RND_MODE);
2067 mpz_mul_ui (num, num, 2 * i - 1);
2070 mpfr_set (w, u, GFC_RND_MODE);
2071 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
2073 mpfr_set_z (v, num, GFC_RND_MODE);
2074 mpfr_mul (v, v, w, GFC_RND_MODE);
2076 mpfr_add (sum, sum, v, GFC_RND_MODE);
2078 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
2079 if (mpfr_cmp (sumtrunc, oldsum) == 0)
2083 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2085 gcc_assert (i < MAX_ITER);
2087 /* Divide by x * sqrt(Pi). */
2088 mpfr_const_pi (u, GFC_RND_MODE);
2089 mpfr_sqrt (u, u, GFC_RND_MODE);
2090 mpfr_mul (u, u, x, GFC_RND_MODE);
2091 mpfr_div (sum, sum, u, GFC_RND_MODE);
2093 mpfr_set (res, sum, GFC_RND_MODE);
2094 mpfr_set_default_prec (prec);
2096 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
2102 gfc_simplify_erfc_scaled (gfc_expr *x)
2106 if (x->expr_type != EXPR_CONSTANT)
2109 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2110 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
2111 asympt_erfc_scaled (result->value.real, x->value.real);
2113 fullprec_erfc_scaled (result->value.real, x->value.real);
2115 return range_check (result, "ERFC_SCALED");
2123 gfc_simplify_epsilon (gfc_expr *e)
2128 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2130 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
2131 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
2133 return range_check (result, "EPSILON");
2138 gfc_simplify_exp (gfc_expr *x)
2142 if (x->expr_type != EXPR_CONSTANT)
2145 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2150 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2154 gfc_set_model_kind (x->ts.kind);
2155 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2159 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2162 return range_check (result, "EXP");
2167 gfc_simplify_exponent (gfc_expr *x)
2172 if (x->expr_type != EXPR_CONSTANT)
2175 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2178 gfc_set_model (x->value.real);
2180 if (mpfr_sgn (x->value.real) == 0)
2182 mpz_set_ui (result->value.integer, 0);
2186 i = (int) mpfr_get_exp (x->value.real);
2187 mpz_set_si (result->value.integer, i);
2189 return range_check (result, "EXPONENT");
2194 gfc_simplify_float (gfc_expr *a)
2198 if (a->expr_type != EXPR_CONSTANT)
2203 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2204 return &gfc_bad_expr;
2206 result = gfc_copy_expr (a);
2209 result = gfc_int2real (a, gfc_default_real_kind);
2211 return range_check (result, "FLOAT");
2216 is_last_ref_vtab (gfc_expr *e)
2219 gfc_component *comp = NULL;
2221 if (e->expr_type != EXPR_VARIABLE)
2224 for (ref = e->ref; ref; ref = ref->next)
2225 if (ref->type == REF_COMPONENT)
2226 comp = ref->u.c.component;
2228 if (!e->ref || !comp)
2229 return e->symtree->n.sym->attr.vtab;
2231 if (comp->name[0] == '_' && strcmp (comp->name, "_vptr") == 0)
2239 gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold)
2241 /* Avoid simplification of resolved symbols. */
2242 if (is_last_ref_vtab (a) || is_last_ref_vtab (mold))
2245 if (a->ts.type == BT_DERIVED && mold->ts.type == BT_DERIVED)
2246 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2247 gfc_type_is_extension_of (mold->ts.u.derived,
2249 /* Return .false. if the dynamic type can never be the same. */
2250 if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS
2251 && !gfc_type_is_extension_of
2252 (mold->ts.u.derived->components->ts.u.derived,
2253 a->ts.u.derived->components->ts.u.derived)
2254 && !gfc_type_is_extension_of
2255 (a->ts.u.derived->components->ts.u.derived,
2256 mold->ts.u.derived->components->ts.u.derived))
2257 || (a->ts.type == BT_DERIVED && mold->ts.type == BT_CLASS
2258 && !gfc_type_is_extension_of
2260 mold->ts.u.derived->components->ts.u.derived)
2261 && !gfc_type_is_extension_of
2262 (mold->ts.u.derived->components->ts.u.derived,
2264 || (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
2265 && !gfc_type_is_extension_of
2266 (mold->ts.u.derived,
2267 a->ts.u.derived->components->ts.u.derived)))
2268 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2270 if (mold->ts.type == BT_DERIVED
2271 && gfc_type_is_extension_of (mold->ts.u.derived,
2272 a->ts.u.derived->components->ts.u.derived))
2273 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, true);
2280 gfc_simplify_same_type_as (gfc_expr *a, gfc_expr *b)
2282 /* Avoid simplification of resolved symbols. */
2283 if (is_last_ref_vtab (a) || is_last_ref_vtab (b))
2286 /* Return .false. if the dynamic type can never be the
2288 if ((a->ts.type == BT_CLASS || b->ts.type == BT_CLASS)
2289 && !gfc_type_compatible (&a->ts, &b->ts)
2290 && !gfc_type_compatible (&b->ts, &a->ts))
2291 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2293 if (a->ts.type != BT_DERIVED || b->ts.type != BT_DERIVED)
2296 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2297 gfc_compare_derived_types (a->ts.u.derived,
2303 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
2309 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
2311 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2313 if (e->expr_type != EXPR_CONSTANT)
2316 gfc_set_model_kind (kind);
2319 mpfr_floor (floor, e->value.real);
2321 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
2322 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2326 return range_check (result, "FLOOR");
2331 gfc_simplify_fraction (gfc_expr *x)
2334 mpfr_t absv, exp, pow2;
2336 if (x->expr_type != EXPR_CONSTANT)
2339 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
2341 if (mpfr_sgn (x->value.real) == 0)
2343 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2347 gfc_set_model_kind (x->ts.kind);
2352 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2353 mpfr_log2 (exp, absv, GFC_RND_MODE);
2355 mpfr_trunc (exp, exp);
2356 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2358 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2360 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
2362 mpfr_clears (exp, absv, pow2, NULL);
2364 return range_check (result, "FRACTION");
2369 gfc_simplify_gamma (gfc_expr *x)
2373 if (x->expr_type != EXPR_CONSTANT)
2376 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2377 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2379 return range_check (result, "GAMMA");
2384 gfc_simplify_huge (gfc_expr *e)
2389 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2390 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2395 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2399 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2411 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2415 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2418 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2419 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2420 return range_check (result, "HYPOT");
2424 /* We use the processor's collating sequence, because all
2425 systems that gfortran currently works on are ASCII. */
2428 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2434 if (e->expr_type != EXPR_CONSTANT)
2437 if (e->value.character.length != 1)
2439 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2440 return &gfc_bad_expr;
2443 index = e->value.character.string[0];
2445 if (gfc_option.warn_surprising && index > 127)
2446 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2449 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
2451 return &gfc_bad_expr;
2453 result = gfc_get_int_expr (k, &e->where, index);
2455 return range_check (result, "IACHAR");
2460 do_bit_and (gfc_expr *result, gfc_expr *e)
2462 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2463 gcc_assert (result->ts.type == BT_INTEGER
2464 && result->expr_type == EXPR_CONSTANT);
2466 mpz_and (result->value.integer, result->value.integer, e->value.integer);
2472 gfc_simplify_iall (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2474 return simplify_transformation (array, dim, mask, -1, do_bit_and);
2479 do_bit_ior (gfc_expr *result, gfc_expr *e)
2481 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2482 gcc_assert (result->ts.type == BT_INTEGER
2483 && result->expr_type == EXPR_CONSTANT);
2485 mpz_ior (result->value.integer, result->value.integer, e->value.integer);
2491 gfc_simplify_iany (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2493 return simplify_transformation (array, dim, mask, 0, do_bit_ior);
2498 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2502 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2505 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2506 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2508 return range_check (result, "IAND");
2513 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2518 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2521 gfc_extract_int (y, &pos);
2523 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2525 result = gfc_copy_expr (x);
2527 convert_mpz_to_unsigned (result->value.integer,
2528 gfc_integer_kinds[k].bit_size);
2530 mpz_clrbit (result->value.integer, pos);
2532 convert_mpz_to_signed (result->value.integer,
2533 gfc_integer_kinds[k].bit_size);
2540 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2547 if (x->expr_type != EXPR_CONSTANT
2548 || y->expr_type != EXPR_CONSTANT
2549 || z->expr_type != EXPR_CONSTANT)
2552 gfc_extract_int (y, &pos);
2553 gfc_extract_int (z, &len);
2555 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2557 bitsize = gfc_integer_kinds[k].bit_size;
2559 if (pos + len > bitsize)
2561 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2562 "bit size at %L", &y->where);
2563 return &gfc_bad_expr;
2566 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2567 convert_mpz_to_unsigned (result->value.integer,
2568 gfc_integer_kinds[k].bit_size);
2570 bits = XCNEWVEC (int, bitsize);
2572 for (i = 0; i < bitsize; i++)
2575 for (i = 0; i < len; i++)
2576 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2578 for (i = 0; i < bitsize; i++)
2581 mpz_clrbit (result->value.integer, i);
2582 else if (bits[i] == 1)
2583 mpz_setbit (result->value.integer, i);
2585 gfc_internal_error ("IBITS: Bad bit");
2590 convert_mpz_to_signed (result->value.integer,
2591 gfc_integer_kinds[k].bit_size);
2598 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2603 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2606 gfc_extract_int (y, &pos);
2608 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2610 result = gfc_copy_expr (x);
2612 convert_mpz_to_unsigned (result->value.integer,
2613 gfc_integer_kinds[k].bit_size);
2615 mpz_setbit (result->value.integer, pos);
2617 convert_mpz_to_signed (result->value.integer,
2618 gfc_integer_kinds[k].bit_size);
2625 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2631 if (e->expr_type != EXPR_CONSTANT)
2634 if (e->value.character.length != 1)
2636 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2637 return &gfc_bad_expr;
2640 index = e->value.character.string[0];
2642 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
2644 return &gfc_bad_expr;
2646 result = gfc_get_int_expr (k, &e->where, index);
2648 return range_check (result, "ICHAR");
2653 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2657 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2660 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2661 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2663 return range_check (result, "IEOR");
2668 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2671 int back, len, lensub;
2672 int i, j, k, count, index = 0, start;
2674 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2675 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2678 if (b != NULL && b->value.logical != 0)
2683 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2685 return &gfc_bad_expr;
2687 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
2689 len = x->value.character.length;
2690 lensub = y->value.character.length;
2694 mpz_set_si (result->value.integer, 0);
2702 mpz_set_si (result->value.integer, 1);
2705 else if (lensub == 1)
2707 for (i = 0; i < len; i++)
2709 for (j = 0; j < lensub; j++)
2711 if (y->value.character.string[j]
2712 == x->value.character.string[i])
2722 for (i = 0; i < len; i++)
2724 for (j = 0; j < lensub; j++)
2726 if (y->value.character.string[j]
2727 == x->value.character.string[i])
2732 for (k = 0; k < lensub; k++)
2734 if (y->value.character.string[k]
2735 == x->value.character.string[k + start])
2739 if (count == lensub)
2754 mpz_set_si (result->value.integer, len + 1);
2757 else if (lensub == 1)
2759 for (i = 0; i < len; i++)
2761 for (j = 0; j < lensub; j++)
2763 if (y->value.character.string[j]
2764 == x->value.character.string[len - i])
2766 index = len - i + 1;
2774 for (i = 0; i < len; i++)
2776 for (j = 0; j < lensub; j++)
2778 if (y->value.character.string[j]
2779 == x->value.character.string[len - i])
2782 if (start <= len - lensub)
2785 for (k = 0; k < lensub; k++)
2786 if (y->value.character.string[k]
2787 == x->value.character.string[k + start])
2790 if (count == lensub)
2807 mpz_set_si (result->value.integer, index);
2808 return range_check (result, "INDEX");
2813 simplify_intconv (gfc_expr *e, int kind, const char *name)
2815 gfc_expr *result = NULL;
2817 if (e->expr_type != EXPR_CONSTANT)
2820 result = gfc_convert_constant (e, BT_INTEGER, kind);
2821 if (result == &gfc_bad_expr)
2822 return &gfc_bad_expr;
2824 return range_check (result, name);
2829 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
2833 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
2835 return &gfc_bad_expr;
2837 return simplify_intconv (e, kind, "INT");
2841 gfc_simplify_int2 (gfc_expr *e)
2843 return simplify_intconv (e, 2, "INT2");
2848 gfc_simplify_int8 (gfc_expr *e)
2850 return simplify_intconv (e, 8, "INT8");
2855 gfc_simplify_long (gfc_expr *e)
2857 return simplify_intconv (e, 4, "LONG");
2862 gfc_simplify_ifix (gfc_expr *e)
2864 gfc_expr *rtrunc, *result;
2866 if (e->expr_type != EXPR_CONSTANT)
2869 rtrunc = gfc_copy_expr (e);
2870 mpfr_trunc (rtrunc->value.real, e->value.real);
2872 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2874 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2876 gfc_free_expr (rtrunc);
2878 return range_check (result, "IFIX");
2883 gfc_simplify_idint (gfc_expr *e)
2885 gfc_expr *rtrunc, *result;
2887 if (e->expr_type != EXPR_CONSTANT)
2890 rtrunc = gfc_copy_expr (e);
2891 mpfr_trunc (rtrunc->value.real, e->value.real);
2893 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2895 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2897 gfc_free_expr (rtrunc);
2899 return range_check (result, "IDINT");
2904 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
2908 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2911 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2912 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2914 return range_check (result, "IOR");
2919 do_bit_xor (gfc_expr *result, gfc_expr *e)
2921 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2922 gcc_assert (result->ts.type == BT_INTEGER
2923 && result->expr_type == EXPR_CONSTANT);
2925 mpz_xor (result->value.integer, result->value.integer, e->value.integer);
2931 gfc_simplify_iparity (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2933 return simplify_transformation (array, dim, mask, 0, do_bit_xor);
2939 gfc_simplify_is_iostat_end (gfc_expr *x)
2941 if (x->expr_type != EXPR_CONSTANT)
2944 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2945 mpz_cmp_si (x->value.integer,
2946 LIBERROR_END) == 0);
2951 gfc_simplify_is_iostat_eor (gfc_expr *x)
2953 if (x->expr_type != EXPR_CONSTANT)
2956 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2957 mpz_cmp_si (x->value.integer,
2958 LIBERROR_EOR) == 0);
2963 gfc_simplify_isnan (gfc_expr *x)
2965 if (x->expr_type != EXPR_CONSTANT)
2968 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2969 mpfr_nan_p (x->value.real));
2973 /* Performs a shift on its first argument. Depending on the last
2974 argument, the shift can be arithmetic, i.e. with filling from the
2975 left like in the SHIFTA intrinsic. */
2977 simplify_shift (gfc_expr *e, gfc_expr *s, const char *name,
2978 bool arithmetic, int direction)
2981 int ashift, *bits, i, k, bitsize, shift;
2983 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2986 gfc_extract_int (s, &shift);
2988 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2989 bitsize = gfc_integer_kinds[k].bit_size;
2991 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2995 mpz_set (result->value.integer, e->value.integer);
2999 if (direction > 0 && shift < 0)
3001 /* Left shift, as in SHIFTL. */
3002 gfc_error ("Second argument of %s is negative at %L", name, &e->where);
3003 return &gfc_bad_expr;
3005 else if (direction < 0)
3007 /* Right shift, as in SHIFTR or SHIFTA. */
3010 gfc_error ("Second argument of %s is negative at %L",
3012 return &gfc_bad_expr;
3018 ashift = (shift >= 0 ? shift : -shift);
3020 if (ashift > bitsize)
3022 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3023 "at %L", name, &e->where);
3024 return &gfc_bad_expr;
3027 bits = XCNEWVEC (int, bitsize);
3029 for (i = 0; i < bitsize; i++)
3030 bits[i] = mpz_tstbit (e->value.integer, i);
3035 for (i = 0; i < shift; i++)
3036 mpz_clrbit (result->value.integer, i);
3038 for (i = 0; i < bitsize - shift; i++)
3041 mpz_clrbit (result->value.integer, i + shift);
3043 mpz_setbit (result->value.integer, i + shift);
3049 if (arithmetic && bits[bitsize - 1])
3050 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3051 mpz_setbit (result->value.integer, i);
3053 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3054 mpz_clrbit (result->value.integer, i);
3056 for (i = bitsize - 1; i >= ashift; i--)
3059 mpz_clrbit (result->value.integer, i - ashift);
3061 mpz_setbit (result->value.integer, i - ashift);
3065 convert_mpz_to_signed (result->value.integer, bitsize);
3073 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
3075 return simplify_shift (e, s, "ISHFT", false, 0);
3080 gfc_simplify_lshift (gfc_expr *e, gfc_expr *s)
3082 return simplify_shift (e, s, "LSHIFT", false, 1);
3087 gfc_simplify_rshift (gfc_expr *e, gfc_expr *s)
3089 return simplify_shift (e, s, "RSHIFT", true, -1);
3094 gfc_simplify_shifta (gfc_expr *e, gfc_expr *s)
3096 return simplify_shift (e, s, "SHIFTA", true, -1);
3101 gfc_simplify_shiftl (gfc_expr *e, gfc_expr *s)
3103 return simplify_shift (e, s, "SHIFTL", false, 1);
3108 gfc_simplify_shiftr (gfc_expr *e, gfc_expr *s)
3110 return simplify_shift (e, s, "SHIFTR", false, -1);
3115 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
3118 int shift, ashift, isize, ssize, delta, k;
3121 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3124 gfc_extract_int (s, &shift);
3126 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3127 isize = gfc_integer_kinds[k].bit_size;
3131 if (sz->expr_type != EXPR_CONSTANT)
3134 gfc_extract_int (sz, &ssize);
3148 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3149 "BIT_SIZE of first argument at %L", &s->where);
3150 return &gfc_bad_expr;
3153 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3155 mpz_set (result->value.integer, e->value.integer);
3160 convert_mpz_to_unsigned (result->value.integer, isize);
3162 bits = XCNEWVEC (int, ssize);
3164 for (i = 0; i < ssize; i++)
3165 bits[i] = mpz_tstbit (e->value.integer, i);
3167 delta = ssize - ashift;
3171 for (i = 0; i < delta; i++)
3174 mpz_clrbit (result->value.integer, i + shift);
3176 mpz_setbit (result->value.integer, i + shift);
3179 for (i = delta; i < ssize; i++)
3182 mpz_clrbit (result->value.integer, i - delta);
3184 mpz_setbit (result->value.integer, i - delta);
3189 for (i = 0; i < ashift; i++)
3192 mpz_clrbit (result->value.integer, i + delta);
3194 mpz_setbit (result->value.integer, i + delta);
3197 for (i = ashift; i < ssize; i++)
3200 mpz_clrbit (result->value.integer, i + shift);
3202 mpz_setbit (result->value.integer, i + shift);
3206 convert_mpz_to_signed (result->value.integer, isize);
3214 gfc_simplify_kind (gfc_expr *e)
3216 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
3221 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
3222 gfc_array_spec *as, gfc_ref *ref, bool coarray)
3224 gfc_expr *l, *u, *result;
3227 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3228 gfc_default_integer_kind);
3230 return &gfc_bad_expr;
3232 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3234 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3235 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3236 if (!coarray && array->expr_type != EXPR_VARIABLE)
3240 gfc_expr* dim = result;
3241 mpz_set_si (dim->value.integer, d);
3243 result = gfc_simplify_size (array, dim, kind);
3244 gfc_free_expr (dim);
3249 mpz_set_si (result->value.integer, 1);
3254 /* Otherwise, we have a variable expression. */
3255 gcc_assert (array->expr_type == EXPR_VARIABLE);
3258 /* The last dimension of an assumed-size array is special. */
3259 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
3260 || (coarray && d == as->rank + as->corank
3261 && (!upper || gfc_option.coarray == GFC_FCOARRAY_SINGLE)))
3263 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
3265 gfc_free_expr (result);
3266 return gfc_copy_expr (as->lower[d-1]);
3272 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3274 /* Then, we need to know the extent of the given dimension. */
3275 if (coarray || ref->u.ar.type == AR_FULL)
3280 if (l->expr_type != EXPR_CONSTANT || u == NULL
3281 || u->expr_type != EXPR_CONSTANT)
3284 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
3288 mpz_set_si (result->value.integer, 0);
3290 mpz_set_si (result->value.integer, 1);
3294 /* Nonzero extent. */
3296 mpz_set (result->value.integer, u->value.integer);
3298 mpz_set (result->value.integer, l->value.integer);
3305 if (gfc_ref_dimen_size (&ref->u.ar, d-1, &result->value.integer, NULL)
3310 mpz_set_si (result->value.integer, (long int) 1);
3314 return range_check (result, upper ? "UBOUND" : "LBOUND");
3317 gfc_free_expr (result);
3323 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3329 if (array->expr_type != EXPR_VARIABLE)
3336 /* Follow any component references. */
3337 as = array->symtree->n.sym->as;
3338 for (ref = array->ref; ref; ref = ref->next)
3343 switch (ref->u.ar.type)
3350 /* We're done because 'as' has already been set in the
3351 previous iteration. */
3368 as = ref->u.c.component->as;
3380 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE))
3385 /* Multi-dimensional bounds. */
3386 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3390 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3391 if (upper && as && as->type == AS_ASSUMED_SIZE)
3393 /* An error message will be emitted in
3394 check_assumed_size_reference (resolve.c). */
3395 return &gfc_bad_expr;
3398 /* Simplify the bounds for each dimension. */
3399 for (d = 0; d < array->rank; d++)
3401 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
3403 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3407 for (j = 0; j < d; j++)
3408 gfc_free_expr (bounds[j]);
3413 /* Allocate the result expression. */
3414 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3415 gfc_default_integer_kind);
3417 return &gfc_bad_expr;
3419 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
3421 /* The result is a rank 1 array; its size is the rank of the first
3422 argument to {L,U}BOUND. */
3424 e->shape = gfc_get_shape (1);
3425 mpz_init_set_ui (e->shape[0], array->rank);
3427 /* Create the constructor for this array. */
3428 for (d = 0; d < array->rank; d++)
3429 gfc_constructor_append_expr (&e->value.constructor,
3430 bounds[d], &e->where);
3436 /* A DIM argument is specified. */
3437 if (dim->expr_type != EXPR_CONSTANT)
3440 d = mpz_get_si (dim->value.integer);
3442 if (d < 1 || d > array->rank
3443 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
3445 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3446 return &gfc_bad_expr;
3449 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3455 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3461 if (array->expr_type != EXPR_VARIABLE)
3464 /* Follow any component references. */
3465 as = array->symtree->n.sym->as;
3466 for (ref = array->ref; ref; ref = ref->next)
3471 switch (ref->u.ar.type)
3474 if (ref->u.ar.as->corank > 0)
3476 gcc_assert (as == ref->u.ar.as);
3483 /* We're done because 'as' has already been set in the
3484 previous iteration. */
3501 as = ref->u.c.component->as;
3513 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
3518 /* Multi-dimensional cobounds. */
3519 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3523 /* Simplify the cobounds for each dimension. */
3524 for (d = 0; d < as->corank; d++)
3526 bounds[d] = simplify_bound_dim (array, kind, d + 1 + array->rank,
3527 upper, as, ref, true);
3528 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3532 for (j = 0; j < d; j++)
3533 gfc_free_expr (bounds[j]);
3538 /* Allocate the result expression. */
3539 e = gfc_get_expr ();
3540 e->where = array->where;
3541 e->expr_type = EXPR_ARRAY;
3542 e->ts.type = BT_INTEGER;
3543 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3544 gfc_default_integer_kind);
3548 return &gfc_bad_expr;
3552 /* The result is a rank 1 array; its size is the rank of the first
3553 argument to {L,U}COBOUND. */
3555 e->shape = gfc_get_shape (1);
3556 mpz_init_set_ui (e->shape[0], as->corank);
3558 /* Create the constructor for this array. */
3559 for (d = 0; d < as->corank; d++)
3560 gfc_constructor_append_expr (&e->value.constructor,
3561 bounds[d], &e->where);
3566 /* A DIM argument is specified. */
3567 if (dim->expr_type != EXPR_CONSTANT)
3570 d = mpz_get_si (dim->value.integer);
3572 if (d < 1 || d > as->corank)
3574 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3575 return &gfc_bad_expr;
3578 return simplify_bound_dim (array, kind, d+array->rank, upper, as, ref, true);
3584 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3586 return simplify_bound (array, dim, kind, 0);
3591 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3593 return simplify_cobound (array, dim, kind, 0);
3597 gfc_simplify_leadz (gfc_expr *e)
3599 unsigned long lz, bs;
3602 if (e->expr_type != EXPR_CONSTANT)
3605 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3606 bs = gfc_integer_kinds[i].bit_size;
3607 if (mpz_cmp_si (e->value.integer, 0) == 0)
3609 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3612 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3614 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3619 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3622 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3625 return &gfc_bad_expr;
3627 if (e->expr_type == EXPR_CONSTANT)
3629 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3630 mpz_set_si (result->value.integer, e->value.character.length);
3631 return range_check (result, "LEN");
3633 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3634 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3635 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3637 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3638 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3639 return range_check (result, "LEN");
3647 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3651 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3654 return &gfc_bad_expr;
3656 if (e->expr_type != EXPR_CONSTANT)
3659 len = e->value.character.length;
3660 for (count = 0, i = 1; i <= len; i++)
3661 if (e->value.character.string[len - i] == ' ')
3666 result = gfc_get_int_expr (k, &e->where, len - count);
3667 return range_check (result, "LEN_TRIM");
3671 gfc_simplify_lgamma (gfc_expr *x)
3676 if (x->expr_type != EXPR_CONSTANT)
3679 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3680 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
3682 return range_check (result, "LGAMMA");
3687 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
3689 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3692 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3693 gfc_compare_string (a, b) >= 0);
3698 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
3700 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3703 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3704 gfc_compare_string (a, b) > 0);
3709 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
3711 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3714 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3715 gfc_compare_string (a, b) <= 0);
3720 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
3722 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3725 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3726 gfc_compare_string (a, b) < 0);
3731 gfc_simplify_log (gfc_expr *x)
3735 if (x->expr_type != EXPR_CONSTANT)
3738 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3743 if (mpfr_sgn (x->value.real) <= 0)
3745 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3746 "to zero", &x->where);
3747 gfc_free_expr (result);
3748 return &gfc_bad_expr;
3751 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
3755 if ((mpfr_sgn (mpc_realref (x->value.complex)) == 0)
3756 && (mpfr_sgn (mpc_imagref (x->value.complex)) == 0))
3758 gfc_error ("Complex argument of LOG at %L cannot be zero",
3760 gfc_free_expr (result);
3761 return &gfc_bad_expr;
3764 gfc_set_model_kind (x->ts.kind);
3765 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
3769 gfc_internal_error ("gfc_simplify_log: bad type");
3772 return range_check (result, "LOG");
3777 gfc_simplify_log10 (gfc_expr *x)
3781 if (x->expr_type != EXPR_CONSTANT)
3784 if (mpfr_sgn (x->value.real) <= 0)
3786 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3787 "to zero", &x->where);
3788 return &gfc_bad_expr;
3791 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3792 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
3794 return range_check (result, "LOG10");
3799 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
3803 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
3805 return &gfc_bad_expr;
3807 if (e->expr_type != EXPR_CONSTANT)
3810 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
3815 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
3818 int row, result_rows, col, result_columns;
3819 int stride_a, offset_a, stride_b, offset_b;
3821 if (!is_constant_array_expr (matrix_a)
3822 || !is_constant_array_expr (matrix_b))
3825 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
3826 result = gfc_get_array_expr (matrix_a->ts.type,
3830 if (matrix_a->rank == 1 && matrix_b->rank == 2)
3833 result_columns = mpz_get_si (matrix_b->shape[0]);
3835 stride_b = mpz_get_si (matrix_b->shape[0]);
3838 result->shape = gfc_get_shape (result->rank);
3839 mpz_init_set_si (result->shape[0], result_columns);
3841 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
3843 result_rows = mpz_get_si (matrix_b->shape[0]);
3845 stride_a = mpz_get_si (matrix_a->shape[0]);
3849 result->shape = gfc_get_shape (result->rank);
3850 mpz_init_set_si (result->shape[0], result_rows);
3852 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
3854 result_rows = mpz_get_si (matrix_a->shape[0]);
3855 result_columns = mpz_get_si (matrix_b->shape[1]);
3856 stride_a = mpz_get_si (matrix_a->shape[1]);
3857 stride_b = mpz_get_si (matrix_b->shape[0]);
3860 result->shape = gfc_get_shape (result->rank);
3861 mpz_init_set_si (result->shape[0], result_rows);
3862 mpz_init_set_si (result->shape[1], result_columns);
3867 offset_a = offset_b = 0;
3868 for (col = 0; col < result_columns; ++col)
3872 for (row = 0; row < result_rows; ++row)
3874 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
3875 matrix_b, 1, offset_b);
3876 gfc_constructor_append_expr (&result->value.constructor,
3882 offset_b += stride_b;
3890 gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
3896 if (i->expr_type != EXPR_CONSTANT)
3899 kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind);
3901 return &gfc_bad_expr;
3902 k = gfc_validate_kind (BT_INTEGER, kind, false);
3904 s = gfc_extract_int (i, &arg);
3907 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
3909 /* MASKR(n) = 2^n - 1 */
3910 mpz_set_ui (result->value.integer, 1);
3911 mpz_mul_2exp (result->value.integer, result->value.integer, arg);
3912 mpz_sub_ui (result->value.integer, result->value.integer, 1);
3914 convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
3921 gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
3928 if (i->expr_type != EXPR_CONSTANT)
3931 kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind);
3933 return &gfc_bad_expr;
3934 k = gfc_validate_kind (BT_INTEGER, kind, false);
3936 s = gfc_extract_int (i, &arg);
3939 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
3941 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
3942 mpz_init_set_ui (z, 1);
3943 mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size);
3944 mpz_set_ui (result->value.integer, 1);
3945 mpz_mul_2exp (result->value.integer, result->value.integer,
3946 gfc_integer_kinds[k].bit_size - arg);
3947 mpz_sub (result->value.integer, z, result->value.integer);
3950 convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
3957 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
3959 if (tsource->expr_type != EXPR_CONSTANT
3960 || fsource->expr_type != EXPR_CONSTANT
3961 || mask->expr_type != EXPR_CONSTANT)
3964 return gfc_copy_expr (mask->value.logical ? tsource : fsource);
3969 gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr)
3971 mpz_t arg1, arg2, mask;
3974 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT
3975 || mask_expr->expr_type != EXPR_CONSTANT)
3978 result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where);
3980 /* Convert all argument to unsigned. */
3981 mpz_init_set (arg1, i->value.integer);
3982 mpz_init_set (arg2, j->value.integer);
3983 mpz_init_set (mask, mask_expr->value.integer);
3985 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
3986 mpz_and (arg1, arg1, mask);
3987 mpz_com (mask, mask);
3988 mpz_and (arg2, arg2, mask);
3989 mpz_ior (result->value.integer, arg1, arg2);
3999 /* Selects between current value and extremum for simplify_min_max
4000 and simplify_minval_maxval. */
4002 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
4004 switch (arg->ts.type)
4007 if (mpz_cmp (arg->value.integer,
4008 extremum->value.integer) * sign > 0)
4009 mpz_set (extremum->value.integer, arg->value.integer);
4013 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4015 mpfr_max (extremum->value.real, extremum->value.real,
4016 arg->value.real, GFC_RND_MODE);
4018 mpfr_min (extremum->value.real, extremum->value.real,
4019 arg->value.real, GFC_RND_MODE);
4023 #define LENGTH(x) ((x)->value.character.length)
4024 #define STRING(x) ((x)->value.character.string)
4025 if (LENGTH(extremum) < LENGTH(arg))
4027 gfc_char_t *tmp = STRING(extremum);
4029 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
4030 memcpy (STRING(extremum), tmp,
4031 LENGTH(extremum) * sizeof (gfc_char_t));
4032 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
4033 LENGTH(arg) - LENGTH(extremum));
4034 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
4035 LENGTH(extremum) = LENGTH(arg);
4039 if (gfc_compare_string (arg, extremum) * sign > 0)
4041 free (STRING(extremum));
4042 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
4043 memcpy (STRING(extremum), STRING(arg),
4044 LENGTH(arg) * sizeof (gfc_char_t));
4045 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
4046 LENGTH(extremum) - LENGTH(arg));
4047 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
4054 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4059 /* This function is special since MAX() can take any number of
4060 arguments. The simplified expression is a rewritten version of the
4061 argument list containing at most one constant element. Other
4062 constant elements are deleted. Because the argument list has
4063 already been checked, this function always succeeds. sign is 1 for
4064 MAX(), -1 for MIN(). */
4067 simplify_min_max (gfc_expr *expr, int sign)
4069 gfc_actual_arglist *arg, *last, *extremum;
4070 gfc_intrinsic_sym * specific;
4074 specific = expr->value.function.isym;
4076 arg = expr->value.function.actual;
4078 for (; arg; last = arg, arg = arg->next)
4080 if (arg->expr->expr_type != EXPR_CONSTANT)
4083 if (extremum == NULL)
4089 min_max_choose (arg->expr, extremum->expr, sign);
4091 /* Delete the extra constant argument. */
4093 expr->value.function.actual = arg->next;
4095 last->next = arg->next;
4098 gfc_free_actual_arglist (arg);
4102 /* If there is one value left, replace the function call with the
4104 if (expr->value.function.actual->next != NULL)
4107 /* Convert to the correct type and kind. */
4108 if (expr->ts.type != BT_UNKNOWN)
4109 return gfc_convert_constant (expr->value.function.actual->expr,
4110 expr->ts.type, expr->ts.kind);
4112 if (specific->ts.type != BT_UNKNOWN)
4113 return gfc_convert_constant (expr->value.function.actual->expr,
4114 specific->ts.type, specific->ts.kind);
4116 return gfc_copy_expr (expr->value.function.actual->expr);
4121 gfc_simplify_min (gfc_expr *e)
4123 return simplify_min_max (e, -1);
4128 gfc_simplify_max (gfc_expr *e)
4130 return simplify_min_max (e, 1);
4134 /* This is a simplified version of simplify_min_max to provide
4135 simplification of minval and maxval for a vector. */
4138 simplify_minval_maxval (gfc_expr *expr, int sign)
4140 gfc_constructor *c, *extremum;
4141 gfc_intrinsic_sym * specific;
4144 specific = expr->value.function.isym;
4146 for (c = gfc_constructor_first (expr->value.constructor);
4147 c; c = gfc_constructor_next (c))
4149 if (c->expr->expr_type != EXPR_CONSTANT)
4152 if (extremum == NULL)
4158 min_max_choose (c->expr, extremum->expr, sign);
4161 if (extremum == NULL)
4164 /* Convert to the correct type and kind. */
4165 if (expr->ts.type != BT_UNKNOWN)
4166 return gfc_convert_constant (extremum->expr,
4167 expr->ts.type, expr->ts.kind);
4169 if (specific->ts.type != BT_UNKNOWN)
4170 return gfc_convert_constant (extremum->expr,
4171 specific->ts.type, specific->ts.kind);
4173 return gfc_copy_expr (extremum->expr);
4178 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4180 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4183 return simplify_minval_maxval (array, -1);
4188 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4190 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4193 return simplify_minval_maxval (array, 1);
4198 gfc_simplify_maxexponent (gfc_expr *x)
4200 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4201 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4202 gfc_real_kinds[i].max_exponent);
4207 gfc_simplify_minexponent (gfc_expr *x)
4209 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4210 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4211 gfc_real_kinds[i].min_exponent);
4216 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
4222 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4225 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4226 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4231 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4233 /* Result is processor-dependent. */
4234 gfc_error ("Second argument MOD at %L is zero", &a->where);
4235 gfc_free_expr (result);
4236 return &gfc_bad_expr;
4238 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
4242 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4244 /* Result is processor-dependent. */
4245 gfc_error ("Second argument of MOD at %L is zero", &p->where);
4246 gfc_free_expr (result);
4247 return &gfc_bad_expr;
4250 gfc_set_model_kind (kind);
4252 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
4253 mpfr_trunc (tmp, tmp);
4254 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
4255 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
4260 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4263 return range_check (result, "MOD");
4268 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
4274 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4277 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4278 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4283 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4285 /* Result is processor-dependent. This processor just opts
4286 to not handle it at all. */
4287 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
4288 gfc_free_expr (result);
4289 return &gfc_bad_expr;
4291 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
4296 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4298 /* Result is processor-dependent. */
4299 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
4300 gfc_free_expr (result);
4301 return &gfc_bad_expr;
4304 gfc_set_model_kind (kind);
4306 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
4307 mpfr_floor (tmp, tmp);
4308 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
4309 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
4314 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4317 return range_check (result, "MODULO");
4321 /* Exists for the sole purpose of consistency with other intrinsics. */
4323 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
4324 gfc_expr *fp ATTRIBUTE_UNUSED,
4325 gfc_expr *l ATTRIBUTE_UNUSED,
4326 gfc_expr *to ATTRIBUTE_UNUSED,
4327 gfc_expr *tp ATTRIBUTE_UNUSED)
4334 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
4337 mp_exp_t emin, emax;
4340 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
4343 result = gfc_copy_expr (x);
4345 /* Save current values of emin and emax. */
4346 emin = mpfr_get_emin ();
4347 emax = mpfr_get_emax ();
4349 /* Set emin and emax for the current model number. */
4350 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
4351 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
4352 mpfr_get_prec(result->value.real) + 1);
4353 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
4354 mpfr_check_range (result->value.real, 0, GMP_RNDU);
4356 if (mpfr_sgn (s->value.real) > 0)
4358 mpfr_nextabove (result->value.real);
4359 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
4363 mpfr_nextbelow (result->value.real);
4364 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
4367 mpfr_set_emin (emin);
4368 mpfr_set_emax (emax);
4370 /* Only NaN can occur. Do not use range check as it gives an
4371 error for denormal numbers. */
4372 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
4374 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
4375 gfc_free_expr (result);
4376 return &gfc_bad_expr;
4384 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
4386 gfc_expr *itrunc, *result;
4389 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4391 return &gfc_bad_expr;
4393 if (e->expr_type != EXPR_CONSTANT)
4396 itrunc = gfc_copy_expr (e);
4397 mpfr_round (itrunc->value.real, e->value.real);
4399 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4400 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4402 gfc_free_expr (itrunc);
4404 return range_check (result, name);
4409 gfc_simplify_new_line (gfc_expr *e)
4413 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4414 result->value.character.string[0] = '\n';
4421 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4423 return simplify_nint ("NINT", e, k);
4428 gfc_simplify_idnint (gfc_expr *e)
4430 return simplify_nint ("IDNINT", e, NULL);
4435 add_squared (gfc_expr *result, gfc_expr *e)
4439 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4440 gcc_assert (result->ts.type == BT_REAL
4441 && result->expr_type == EXPR_CONSTANT);
4443 gfc_set_model_kind (result->ts.kind);
4445 mpfr_pow_ui (tmp, e->value.real, 2, GFC_RND_MODE);
4446 mpfr_add (result->value.real, result->value.real, tmp,
4455 do_sqrt (gfc_expr *result, gfc_expr *e)
4457 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4458 gcc_assert (result->ts.type == BT_REAL
4459 && result->expr_type == EXPR_CONSTANT);
4461 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
4462 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4468 gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
4472 if (!is_constant_array_expr (e)
4473 || (dim != NULL && !gfc_is_constant_expr (dim)))
4476 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
4477 init_result_expr (result, 0, NULL);
4479 if (!dim || e->rank == 1)
4481 result = simplify_transformation_to_scalar (result, e, NULL,
4483 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4486 result = simplify_transformation_to_array (result, e, dim, NULL,
4487 add_squared, &do_sqrt);
4494 gfc_simplify_not (gfc_expr *e)
4498 if (e->expr_type != EXPR_CONSTANT)
4501 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4502 mpz_com (result->value.integer, e->value.integer);
4504 return range_check (result, "NOT");
4509 gfc_simplify_null (gfc_expr *mold)
4515 result = gfc_copy_expr (mold);
4516 result->expr_type = EXPR_NULL;
4519 result = gfc_get_null_expr (NULL);
4526 gfc_simplify_num_images (void)
4530 if (gfc_option.coarray == GFC_FCOARRAY_NONE)
4532 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
4533 return &gfc_bad_expr;
4536 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE)
4539 /* FIXME: gfc_current_locus is wrong. */
4540 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4541 &gfc_current_locus);
4542 mpz_set_si (result->value.integer, 1);
4548 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4553 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4556 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4561 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4562 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4563 return range_check (result, "OR");
4566 return gfc_get_logical_expr (kind, &x->where,
4567 x->value.logical || y->value.logical);
4575 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4578 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4580 if (!is_constant_array_expr(array)
4581 || !is_constant_array_expr(vector)
4582 || (!gfc_is_constant_expr (mask)
4583 && !is_constant_array_expr(mask)))
4586 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4587 if (array->ts.type == BT_DERIVED)
4588 result->ts.u.derived = array->ts.u.derived;
4590 array_ctor = gfc_constructor_first (array->value.constructor);
4591 vector_ctor = vector
4592 ? gfc_constructor_first (vector->value.constructor)
4595 if (mask->expr_type == EXPR_CONSTANT
4596 && mask->value.logical)
4598 /* Copy all elements of ARRAY to RESULT. */
4601 gfc_constructor_append_expr (&result->value.constructor,
4602 gfc_copy_expr (array_ctor->expr),
4605 array_ctor = gfc_constructor_next (array_ctor);
4606 vector_ctor = gfc_constructor_next (vector_ctor);
4609 else if (mask->expr_type == EXPR_ARRAY)
4611 /* Copy only those elements of ARRAY to RESULT whose
4612 MASK equals .TRUE.. */
4613 mask_ctor = gfc_constructor_first (mask->value.constructor);
4616 if (mask_ctor->expr->value.logical)
4618 gfc_constructor_append_expr (&result->value.constructor,
4619 gfc_copy_expr (array_ctor->expr),
4621 vector_ctor = gfc_constructor_next (vector_ctor);
4624 array_ctor = gfc_constructor_next (array_ctor);
4625 mask_ctor = gfc_constructor_next (mask_ctor);
4629 /* Append any left-over elements from VECTOR to RESULT. */
4632 gfc_constructor_append_expr (&result->value.constructor,
4633 gfc_copy_expr (vector_ctor->expr),
4635 vector_ctor = gfc_constructor_next (vector_ctor);
4638 result->shape = gfc_get_shape (1);
4639 gfc_array_size (result, &result->shape[0]);
4641 if (array->ts.type == BT_CHARACTER)
4642 result->ts.u.cl = array->ts.u.cl;
4649 do_xor (gfc_expr *result, gfc_expr *e)
4651 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
4652 gcc_assert (result->ts.type == BT_LOGICAL
4653 && result->expr_type == EXPR_CONSTANT);
4655 result->value.logical = result->value.logical != e->value.logical;
4662 gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
4664 return simplify_transformation (e, dim, NULL, 0, do_xor);
4669 gfc_simplify_popcnt (gfc_expr *e)
4674 if (e->expr_type != EXPR_CONSTANT)
4677 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4679 /* Convert argument to unsigned, then count the '1' bits. */
4680 mpz_init_set (x, e->value.integer);
4681 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
4682 res = mpz_popcount (x);
4685 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res);
4690 gfc_simplify_poppar (gfc_expr *e)
4696 if (e->expr_type != EXPR_CONSTANT)
4699 popcnt = gfc_simplify_popcnt (e);
4700 gcc_assert (popcnt);
4702 s = gfc_extract_int (popcnt, &i);
4705 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2);
4710 gfc_simplify_precision (gfc_expr *e)
4712 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4713 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
4714 gfc_real_kinds[i].precision);
4719 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
4721 return simplify_transformation (array, dim, mask, 1, gfc_multiply);
4726 gfc_simplify_radix (gfc_expr *e)
4729 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4734 i = gfc_integer_kinds[i].radix;
4738 i = gfc_real_kinds[i].radix;
4745 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4750 gfc_simplify_range (gfc_expr *e)
4753 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4758 i = gfc_integer_kinds[i].range;
4763 i = gfc_real_kinds[i].range;
4770 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4775 gfc_simplify_rank (gfc_expr *e)
4777 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, e->rank);
4782 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
4784 gfc_expr *result = NULL;
4787 if (e->ts.type == BT_COMPLEX)
4788 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
4790 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
4793 return &gfc_bad_expr;
4795 if (e->expr_type != EXPR_CONSTANT)
4798 if (convert_boz (e, kind) == &gfc_bad_expr)
4799 return &gfc_bad_expr;
4801 result = gfc_convert_constant (e, BT_REAL, kind);
4802 if (result == &gfc_bad_expr)
4803 return &gfc_bad_expr;
4805 return range_check (result, "REAL");
4810 gfc_simplify_realpart (gfc_expr *e)
4814 if (e->expr_type != EXPR_CONSTANT)
4817 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
4818 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
4820 return range_check (result, "REALPART");
4824 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
4827 int i, j, len, ncop, nlen;
4829 bool have_length = false;
4831 /* If NCOPIES isn't a constant, there's nothing we can do. */
4832 if (n->expr_type != EXPR_CONSTANT)
4835 /* If NCOPIES is negative, it's an error. */
4836 if (mpz_sgn (n->value.integer) < 0)
4838 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4840 return &gfc_bad_expr;
4843 /* If we don't know the character length, we can do no more. */
4844 if (e->ts.u.cl && e->ts.u.cl->length
4845 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
4847 len = mpz_get_si (e->ts.u.cl->length->value.integer);
4850 else if (e->expr_type == EXPR_CONSTANT
4851 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
4853 len = e->value.character.length;
4858 /* If the source length is 0, any value of NCOPIES is valid
4859 and everything behaves as if NCOPIES == 0. */
4862 mpz_set_ui (ncopies, 0);
4864 mpz_set (ncopies, n->value.integer);
4866 /* Check that NCOPIES isn't too large. */
4872 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4874 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4878 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
4879 e->ts.u.cl->length->value.integer);
4883 mpz_init_set_si (mlen, len);
4884 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
4888 /* The check itself. */
4889 if (mpz_cmp (ncopies, max) > 0)
4892 mpz_clear (ncopies);
4893 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4895 return &gfc_bad_expr;
4900 mpz_clear (ncopies);
4902 /* For further simplification, we need the character string to be
4904 if (e->expr_type != EXPR_CONSTANT)
4908 (e->ts.u.cl->length &&
4909 mpz_sgn (e->ts.u.cl->length->value.integer)) != 0)
4911 const char *res = gfc_extract_int (n, &ncop);
4912 gcc_assert (res == NULL);
4917 len = e->value.character.length;
4920 result = gfc_get_constant_expr (BT_CHARACTER, e->ts.kind, &e->where);
4923 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
4925 len = e->value.character.length;
4928 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
4929 for (i = 0; i < ncop; i++)
4930 for (j = 0; j < len; j++)
4931 result->value.character.string[j+i*len]= e->value.character.string[j];
4933 result->value.character.string[nlen] = '\0'; /* For debugger */
4938 /* This one is a bear, but mainly has to do with shuffling elements. */
4941 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
4942 gfc_expr *pad, gfc_expr *order_exp)
4944 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
4945 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
4949 gfc_expr *e, *result;
4951 /* Check that argument expression types are OK. */
4952 if (!is_constant_array_expr (source)
4953 || !is_constant_array_expr (shape_exp)
4954 || !is_constant_array_expr (pad)
4955 || !is_constant_array_expr (order_exp))
4958 /* Proceed with simplification, unpacking the array. */
4965 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
4969 gfc_extract_int (e, &shape[rank]);
4971 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
4972 gcc_assert (shape[rank] >= 0);
4977 gcc_assert (rank > 0);
4979 /* Now unpack the order array if present. */
4980 if (order_exp == NULL)
4982 for (i = 0; i < rank; i++)
4987 for (i = 0; i < rank; i++)
4990 for (i = 0; i < rank; i++)
4992 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
4995 gfc_extract_int (e, &order[i]);
4997 gcc_assert (order[i] >= 1 && order[i] <= rank);
4999 gcc_assert (x[order[i]] == 0);
5004 /* Count the elements in the source and padding arrays. */
5009 gfc_array_size (pad, &size);
5010 npad = mpz_get_ui (size);
5014 gfc_array_size (source, &size);
5015 nsource = mpz_get_ui (size);
5018 /* If it weren't for that pesky permutation we could just loop
5019 through the source and round out any shortage with pad elements.
5020 But no, someone just had to have the compiler do something the
5021 user should be doing. */
5023 for (i = 0; i < rank; i++)
5026 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5028 if (source->ts.type == BT_DERIVED)
5029 result->ts.u.derived = source->ts.u.derived;
5030 result->rank = rank;
5031 result->shape = gfc_get_shape (rank);
5032 for (i = 0; i < rank; i++)
5033 mpz_init_set_ui (result->shape[i], shape[i]);
5035 while (nsource > 0 || npad > 0)
5037 /* Figure out which element to extract. */
5038 mpz_set_ui (index, 0);
5040 for (i = rank - 1; i >= 0; i--)
5042 mpz_add_ui (index, index, x[order[i]]);
5044 mpz_mul_ui (index, index, shape[order[i - 1]]);
5047 if (mpz_cmp_ui (index, INT_MAX) > 0)
5048 gfc_internal_error ("Reshaped array too large at %C");
5050 j = mpz_get_ui (index);
5053 e = gfc_constructor_lookup_expr (source->value.constructor, j);
5056 gcc_assert (npad > 0);
5060 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
5064 gfc_constructor_append_expr (&result->value.constructor,
5065 gfc_copy_expr (e), &e->where);
5067 /* Calculate the next element. */
5071 if (++x[i] < shape[i])
5087 gfc_simplify_rrspacing (gfc_expr *x)
5093 if (x->expr_type != EXPR_CONSTANT)
5096 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5098 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5099 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5101 /* Special case x = -0 and 0. */
5102 if (mpfr_sgn (result->value.real) == 0)
5104 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5108 /* | x * 2**(-e) | * 2**p. */
5109 e = - (long int) mpfr_get_exp (x->value.real);
5110 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
5112 p = (long int) gfc_real_kinds[i].digits;
5113 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
5115 return range_check (result, "RRSPACING");
5120 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
5122 int k, neg_flag, power, exp_range;
5123 mpfr_t scale, radix;
5126 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5129 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5131 if (mpfr_sgn (x->value.real) == 0)
5133 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5137 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
5139 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
5141 /* This check filters out values of i that would overflow an int. */
5142 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
5143 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
5145 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
5146 gfc_free_expr (result);
5147 return &gfc_bad_expr;
5150 /* Compute scale = radix ** power. */
5151 power = mpz_get_si (i->value.integer);
5161 gfc_set_model_kind (x->ts.kind);
5164 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
5165 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
5168 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
5170 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
5172 mpfr_clears (scale, radix, NULL);
5174 return range_check (result, "SCALE");
5178 /* Variants of strspn and strcspn that operate on wide characters. */
5181 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
5184 const gfc_char_t *c;
5188 for (c = s2; *c; c++)
5202 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
5205 const gfc_char_t *c;
5209 for (c = s2; *c; c++)
5224 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
5229 size_t indx, len, lenc;
5230 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
5233 return &gfc_bad_expr;
5235 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
5238 if (b != NULL && b->value.logical != 0)
5243 len = e->value.character.length;
5244 lenc = c->value.character.length;
5246 if (len == 0 || lenc == 0)
5254 indx = wide_strcspn (e->value.character.string,
5255 c->value.character.string) + 1;
5262 for (indx = len; indx > 0; indx--)
5264 for (i = 0; i < lenc; i++)
5266 if (c->value.character.string[i]
5267 == e->value.character.string[indx - 1])
5276 result = gfc_get_int_expr (k, &e->where, indx);
5277 return range_check (result, "SCAN");
5282 gfc_simplify_selected_char_kind (gfc_expr *e)
5286 if (e->expr_type != EXPR_CONSTANT)
5289 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
5290 || gfc_compare_with_Cstring (e, "default", false) == 0)
5292 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
5297 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5302 gfc_simplify_selected_int_kind (gfc_expr *e)
5306 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
5311 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
5312 if (gfc_integer_kinds[i].range >= range
5313 && gfc_integer_kinds[i].kind < kind)
5314 kind = gfc_integer_kinds[i].kind;
5316 if (kind == INT_MAX)
5319 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5324 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
5326 int range, precision, radix, i, kind, found_precision, found_range,
5328 locus *loc = &gfc_current_locus;
5334 if (p->expr_type != EXPR_CONSTANT
5335 || gfc_extract_int (p, &precision) != NULL)
5344 if (q->expr_type != EXPR_CONSTANT
5345 || gfc_extract_int (q, &range) != NULL)
5356 if (rdx->expr_type != EXPR_CONSTANT
5357 || gfc_extract_int (rdx, &radix) != NULL)
5365 found_precision = 0;
5369 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
5371 if (gfc_real_kinds[i].precision >= precision)
5372 found_precision = 1;
5374 if (gfc_real_kinds[i].range >= range)
5377 if (gfc_real_kinds[i].radix >= radix)
5380 if (gfc_real_kinds[i].precision >= precision
5381 && gfc_real_kinds[i].range >= range
5382 && gfc_real_kinds[i].radix >= radix && gfc_real_kinds[i].kind < kind)
5383 kind = gfc_real_kinds[i].kind;
5386 if (kind == INT_MAX)
5388 if (found_radix && found_range && !found_precision)
5390 else if (found_radix && found_precision && !found_range)
5392 else if (found_radix && !found_precision && !found_range)
5394 else if (found_radix)
5400 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
5405 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
5408 mpfr_t exp, absv, log2, pow2, frac;
5411 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5414 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5416 if (mpfr_sgn (x->value.real) == 0)
5418 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5422 gfc_set_model_kind (x->ts.kind);
5429 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
5430 mpfr_log2 (log2, absv, GFC_RND_MODE);
5432 mpfr_trunc (log2, log2);
5433 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
5435 /* Old exponent value, and fraction. */
5436 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
5438 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
5441 exp2 = (unsigned long) mpz_get_d (i->value.integer);
5442 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
5444 mpfr_clears (absv, log2, pow2, frac, NULL);
5446 return range_check (result, "SET_EXPONENT");
5451 gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
5453 mpz_t shape[GFC_MAX_DIMENSIONS];
5454 gfc_expr *result, *e, *f;
5458 int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind);
5460 result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
5462 if (source->rank == 0)
5465 if (source->expr_type == EXPR_VARIABLE)
5467 ar = gfc_find_array_ref (source);
5468 t = gfc_array_ref_shape (ar, shape);
5470 else if (source->shape)
5473 for (n = 0; n < source->rank; n++)
5475 mpz_init (shape[n]);
5476 mpz_set (shape[n], source->shape[n]);
5482 for (n = 0; n < source->rank; n++)
5484 e = gfc_get_constant_expr (BT_INTEGER, k, &source->where);
5488 mpz_set (e->value.integer, shape[n]);
5489 mpz_clear (shape[n]);
5493 mpz_set_ui (e->value.integer, n + 1);
5495 f = gfc_simplify_size (source, e, NULL);
5499 gfc_free_expr (result);
5506 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5514 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5517 gfc_expr *return_value;
5519 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
5522 return &gfc_bad_expr;
5524 /* For unary operations, the size of the result is given by the size
5525 of the operand. For binary ones, it's the size of the first operand
5526 unless it is scalar, then it is the size of the second. */
5527 if (array->expr_type == EXPR_OP && !array->value.op.uop)
5529 gfc_expr* replacement;
5530 gfc_expr* simplified;
5532 switch (array->value.op.op)
5534 /* Unary operations. */
5536 case INTRINSIC_UPLUS:
5537 case INTRINSIC_UMINUS:
5538 replacement = array->value.op.op1;
5541 /* Binary operations. If any one of the operands is scalar, take
5542 the other one's size. If both of them are arrays, it does not
5543 matter -- try to find one with known shape, if possible. */
5545 if (array->value.op.op1->rank == 0)
5546 replacement = array->value.op.op2;
5547 else if (array->value.op.op2->rank == 0)
5548 replacement = array->value.op.op1;
5551 simplified = gfc_simplify_size (array->value.op.op1, dim, kind);
5555 replacement = array->value.op.op2;
5560 /* Try to reduce it directly if possible. */
5561 simplified = gfc_simplify_size (replacement, dim, kind);
5563 /* Otherwise, we build a new SIZE call. This is hopefully at least
5564 simpler than the original one. */
5566 simplified = gfc_build_intrinsic_call ("size", array->where, 3,
5567 gfc_copy_expr (replacement),
5568 gfc_copy_expr (dim),
5569 gfc_copy_expr (kind));
5576 if (gfc_array_size (array, &size) == FAILURE)
5581 if (dim->expr_type != EXPR_CONSTANT)
5584 d = mpz_get_ui (dim->value.integer) - 1;
5585 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
5589 return_value = gfc_get_int_expr (k, &array->where, mpz_get_si (size));
5591 return return_value;
5596 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
5600 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
5603 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5608 mpz_abs (result->value.integer, x->value.integer);
5609 if (mpz_sgn (y->value.integer) < 0)
5610 mpz_neg (result->value.integer, result->value.integer);
5614 if (gfc_option.flag_sign_zero)
5615 mpfr_copysign (result->value.real, x->value.real, y->value.real,
5618 mpfr_setsign (result->value.real, x->value.real,
5619 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
5623 gfc_internal_error ("Bad type in gfc_simplify_sign");
5631 gfc_simplify_sin (gfc_expr *x)
5635 if (x->expr_type != EXPR_CONSTANT)
5638 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5643 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
5647 gfc_set_model (x->value.real);
5648 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5652 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
5655 return range_check (result, "SIN");
5660 gfc_simplify_sinh (gfc_expr *x)
5664 if (x->expr_type != EXPR_CONSTANT)
5667 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5672 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
5676 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5683 return range_check (result, "SINH");
5687 /* The argument is always a double precision real that is converted to
5688 single precision. TODO: Rounding! */
5691 gfc_simplify_sngl (gfc_expr *a)
5695 if (a->expr_type != EXPR_CONSTANT)
5698 result = gfc_real2real (a, gfc_default_real_kind);
5699 return range_check (result, "SNGL");
5704 gfc_simplify_spacing (gfc_expr *x)
5710 if (x->expr_type != EXPR_CONSTANT)
5713 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5715 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5717 /* Special case x = 0 and -0. */
5718 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5719 if (mpfr_sgn (result->value.real) == 0)
5721 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5725 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5726 are the radix, exponent of x, and precision. This excludes the
5727 possibility of subnormal numbers. Fortran 2003 states the result is
5728 b**max(e - p, emin - 1). */
5730 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
5731 en = (long int) gfc_real_kinds[i].min_exponent - 1;
5732 en = en > ep ? en : ep;
5734 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
5735 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
5737 return range_check (result, "SPACING");
5742 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
5744 gfc_expr *result = 0L;
5745 int i, j, dim, ncopies;
5748 if ((!gfc_is_constant_expr (source)
5749 && !is_constant_array_expr (source))
5750 || !gfc_is_constant_expr (dim_expr)
5751 || !gfc_is_constant_expr (ncopies_expr))
5754 gcc_assert (dim_expr->ts.type == BT_INTEGER);
5755 gfc_extract_int (dim_expr, &dim);
5756 dim -= 1; /* zero-base DIM */
5758 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
5759 gfc_extract_int (ncopies_expr, &ncopies);
5760 ncopies = MAX (ncopies, 0);
5762 /* Do not allow the array size to exceed the limit for an array
5764 if (source->expr_type == EXPR_ARRAY)
5766 if (gfc_array_size (source, &size) == FAILURE)
5767 gfc_internal_error ("Failure getting length of a constant array.");
5770 mpz_init_set_ui (size, 1);
5772 if (mpz_get_si (size)*ncopies > gfc_option.flag_max_array_constructor)
5775 if (source->expr_type == EXPR_CONSTANT)
5777 gcc_assert (dim == 0);
5779 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5781 if (source->ts.type == BT_DERIVED)
5782 result->ts.u.derived = source->ts.u.derived;
5784 result->shape = gfc_get_shape (result->rank);
5785 mpz_init_set_si (result->shape[0], ncopies);
5787 for (i = 0; i < ncopies; ++i)
5788 gfc_constructor_append_expr (&result->value.constructor,
5789 gfc_copy_expr (source), NULL);
5791 else if (source->expr_type == EXPR_ARRAY)
5793 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
5794 gfc_constructor *source_ctor;
5796 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
5797 gcc_assert (dim >= 0 && dim <= source->rank);
5799 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5801 if (source->ts.type == BT_DERIVED)
5802 result->ts.u.derived = source->ts.u.derived;
5803 result->rank = source->rank + 1;
5804 result->shape = gfc_get_shape (result->rank);
5806 for (i = 0, j = 0; i < result->rank; ++i)
5809 mpz_init_set (result->shape[i], source->shape[j++]);
5811 mpz_init_set_si (result->shape[i], ncopies);
5813 extent[i] = mpz_get_si (result->shape[i]);
5814 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
5818 for (source_ctor = gfc_constructor_first (source->value.constructor);
5819 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
5821 for (i = 0; i < ncopies; ++i)
5822 gfc_constructor_insert_expr (&result->value.constructor,
5823 gfc_copy_expr (source_ctor->expr),
5824 NULL, offset + i * rstride[dim]);
5826 offset += (dim == 0 ? ncopies : 1);
5830 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
5831 Replace NULL with gcc_unreachable() after implementing
5832 gfc_simplify_cshift(). */
5835 if (source->ts.type == BT_CHARACTER)
5836 result->ts.u.cl = source->ts.u.cl;
5843 gfc_simplify_sqrt (gfc_expr *e)
5845 gfc_expr *result = NULL;
5847 if (e->expr_type != EXPR_CONSTANT)
5853 if (mpfr_cmp_si (e->value.real, 0) < 0)
5855 gfc_error ("Argument of SQRT at %L has a negative value",
5857 return &gfc_bad_expr;
5859 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5860 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
5864 gfc_set_model (e->value.real);
5866 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5867 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
5871 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
5874 return range_check (result, "SQRT");
5879 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5881 return simplify_transformation (array, dim, mask, 0, gfc_add);
5886 gfc_simplify_tan (gfc_expr *x)
5890 if (x->expr_type != EXPR_CONSTANT)
5893 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5898 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
5902 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5909 return range_check (result, "TAN");
5914 gfc_simplify_tanh (gfc_expr *x)
5918 if (x->expr_type != EXPR_CONSTANT)
5921 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5926 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
5930 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5937 return range_check (result, "TANH");
5942 gfc_simplify_tiny (gfc_expr *e)
5947 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
5949 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
5950 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5957 gfc_simplify_trailz (gfc_expr *e)
5959 unsigned long tz, bs;
5962 if (e->expr_type != EXPR_CONSTANT)
5965 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5966 bs = gfc_integer_kinds[i].bit_size;
5967 tz = mpz_scan1 (e->value.integer, 0);
5969 return gfc_get_int_expr (gfc_default_integer_kind,
5970 &e->where, MIN (tz, bs));
5975 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
5978 gfc_expr *mold_element;
5983 unsigned char *buffer;
5984 size_t result_length;
5987 if (!gfc_is_constant_expr (source)
5988 || (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
5989 || !gfc_is_constant_expr (size))
5992 if (gfc_calculate_transfer_sizes (source, mold, size, &source_size,
5993 &result_size, &result_length) == FAILURE)
5996 /* Calculate the size of the source. */
5997 if (source->expr_type == EXPR_ARRAY
5998 && gfc_array_size (source, &tmp) == FAILURE)
5999 gfc_internal_error ("Failure getting length of a constant array.");
6001 /* Create an empty new expression with the appropriate characteristics. */
6002 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
6004 result->ts = mold->ts;
6006 mold_element = mold->expr_type == EXPR_ARRAY
6007 ? gfc_constructor_first (mold->value.constructor)->expr
6010 /* Set result character length, if needed. Note that this needs to be
6011 set even for array expressions, in order to pass this information into
6012 gfc_target_interpret_expr. */
6013 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
6014 result->value.character.length = mold_element->value.character.length;
6016 /* Set the number of elements in the result, and determine its size. */
6018 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
6020 result->expr_type = EXPR_ARRAY;
6022 result->shape = gfc_get_shape (1);
6023 mpz_init_set_ui (result->shape[0], result_length);
6028 /* Allocate the buffer to store the binary version of the source. */
6029 buffer_size = MAX (source_size, result_size);
6030 buffer = (unsigned char*)alloca (buffer_size);
6031 memset (buffer, 0, buffer_size);
6033 /* Now write source to the buffer. */
6034 gfc_target_encode_expr (source, buffer, buffer_size);
6036 /* And read the buffer back into the new expression. */
6037 gfc_target_interpret_expr (buffer, buffer_size, result, false);
6044 gfc_simplify_transpose (gfc_expr *matrix)
6046 int row, matrix_rows, col, matrix_cols;
6049 if (!is_constant_array_expr (matrix))
6052 gcc_assert (matrix->rank == 2);
6054 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
6057 result->shape = gfc_get_shape (result->rank);
6058 mpz_set (result->shape[0], matrix->shape[1]);
6059 mpz_set (result->shape[1], matrix->shape[0]);
6061 if (matrix->ts.type == BT_CHARACTER)
6062 result->ts.u.cl = matrix->ts.u.cl;
6063 else if (matrix->ts.type == BT_DERIVED)
6064 result->ts.u.derived = matrix->ts.u.derived;
6066 matrix_rows = mpz_get_si (matrix->shape[0]);
6067 matrix_cols = mpz_get_si (matrix->shape[1]);
6068 for (row = 0; row < matrix_rows; ++row)
6069 for (col = 0; col < matrix_cols; ++col)
6071 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
6072 col * matrix_rows + row);
6073 gfc_constructor_insert_expr (&result->value.constructor,
6074 gfc_copy_expr (e), &matrix->where,
6075 row * matrix_cols + col);
6083 gfc_simplify_trim (gfc_expr *e)
6086 int count, i, len, lentrim;
6088 if (e->expr_type != EXPR_CONSTANT)
6091 len = e->value.character.length;
6092 for (count = 0, i = 1; i <= len; ++i)
6094 if (e->value.character.string[len - i] == ' ')
6100 lentrim = len - count;
6102 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
6103 for (i = 0; i < lentrim; i++)
6104 result->value.character.string[i] = e->value.character.string[i];
6111 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
6116 gfc_constructor *sub_cons;
6120 if (!is_constant_array_expr (sub))
6123 /* Follow any component references. */
6124 as = coarray->symtree->n.sym->as;
6125 for (ref = coarray->ref; ref; ref = ref->next)
6126 if (ref->type == REF_COMPONENT)
6129 if (as->type == AS_DEFERRED)
6132 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6133 the cosubscript addresses the first image. */
6135 sub_cons = gfc_constructor_first (sub->value.constructor);
6138 for (d = 1; d <= as->corank; d++)
6143 gcc_assert (sub_cons != NULL);
6145 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
6147 if (ca_bound == NULL)
6150 if (ca_bound == &gfc_bad_expr)
6153 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
6157 gfc_free_expr (ca_bound);
6158 sub_cons = gfc_constructor_next (sub_cons);
6162 first_image = false;
6166 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6167 "SUB has %ld and COARRAY lower bound is %ld)",
6169 mpz_get_si (sub_cons->expr->value.integer),
6170 mpz_get_si (ca_bound->value.integer));
6171 gfc_free_expr (ca_bound);
6172 return &gfc_bad_expr;
6175 gfc_free_expr (ca_bound);
6177 /* Check whether upperbound is valid for the multi-images case. */
6180 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
6182 if (ca_bound == &gfc_bad_expr)
6185 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
6186 && mpz_cmp (ca_bound->value.integer,
6187 sub_cons->expr->value.integer) < 0)
6189 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6190 "SUB has %ld and COARRAY upper bound is %ld)",
6192 mpz_get_si (sub_cons->expr->value.integer),
6193 mpz_get_si (ca_bound->value.integer));
6194 gfc_free_expr (ca_bound);
6195 return &gfc_bad_expr;
6199 gfc_free_expr (ca_bound);
6202 sub_cons = gfc_constructor_next (sub_cons);
6205 gcc_assert (sub_cons == NULL);
6207 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE && !first_image)
6210 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6211 &gfc_current_locus);
6213 mpz_set_si (result->value.integer, 1);
6215 mpz_set_si (result->value.integer, 0);
6222 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim)
6228 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE)
6231 if (coarray == NULL)
6234 /* FIXME: gfc_current_locus is wrong. */
6235 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6236 &gfc_current_locus);
6237 mpz_set_si (result->value.integer, 1);
6241 gcc_assert (coarray->expr_type == EXPR_VARIABLE);
6243 /* Follow any component references. */
6244 as = coarray->symtree->n.sym->as;
6245 for (ref = coarray->ref; ref; ref = ref->next)
6246 if (ref->type == REF_COMPONENT)
6249 if (as->type == AS_DEFERRED)
6254 /* Multi-dimensional bounds. */
6255 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
6258 /* Simplify the bounds for each dimension. */
6259 for (d = 0; d < as->corank; d++)
6261 bounds[d] = simplify_bound_dim (coarray, NULL, d + as->rank + 1, 0,
6263 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
6267 for (j = 0; j < d; j++)
6268 gfc_free_expr (bounds[j]);
6274 /* Allocate the result expression. */
6275 e = gfc_get_expr ();
6276 e->where = coarray->where;
6277 e->expr_type = EXPR_ARRAY;
6278 e->ts.type = BT_INTEGER;
6279 e->ts.kind = gfc_default_integer_kind;
6282 e->shape = gfc_get_shape (1);
6283 mpz_init_set_ui (e->shape[0], as->corank);
6285 /* Create the constructor for this array. */
6286 for (d = 0; d < as->corank; d++)
6287 gfc_constructor_append_expr (&e->value.constructor,
6288 bounds[d], &e->where);
6294 /* A DIM argument is specified. */
6295 if (dim->expr_type != EXPR_CONSTANT)
6298 d = mpz_get_si (dim->value.integer);
6300 if (d < 1 || d > as->corank)
6302 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
6303 return &gfc_bad_expr;
6306 return simplify_bound_dim (coarray, NULL, d + as->rank, 0, as, NULL,
6313 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6315 return simplify_bound (array, dim, kind, 1);
6319 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6321 return simplify_cobound (array, dim, kind, 1);
6326 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
6328 gfc_expr *result, *e;
6329 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
6331 if (!is_constant_array_expr (vector)
6332 || !is_constant_array_expr (mask)
6333 || (!gfc_is_constant_expr (field)
6334 && !is_constant_array_expr(field)))
6337 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
6339 if (vector->ts.type == BT_DERIVED)
6340 result->ts.u.derived = vector->ts.u.derived;
6341 result->rank = mask->rank;
6342 result->shape = gfc_copy_shape (mask->shape, mask->rank);
6344 if (vector->ts.type == BT_CHARACTER)
6345 result->ts.u.cl = vector->ts.u.cl;
6347 vector_ctor = gfc_constructor_first (vector->value.constructor);
6348 mask_ctor = gfc_constructor_first (mask->value.constructor);
6350 = field->expr_type == EXPR_ARRAY
6351 ? gfc_constructor_first (field->value.constructor)
6356 if (mask_ctor->expr->value.logical)
6358 gcc_assert (vector_ctor);
6359 e = gfc_copy_expr (vector_ctor->expr);
6360 vector_ctor = gfc_constructor_next (vector_ctor);
6362 else if (field->expr_type == EXPR_ARRAY)
6363 e = gfc_copy_expr (field_ctor->expr);
6365 e = gfc_copy_expr (field);
6367 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
6369 mask_ctor = gfc_constructor_next (mask_ctor);
6370 field_ctor = gfc_constructor_next (field_ctor);
6378 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
6382 size_t index, len, lenset;
6384 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
6387 return &gfc_bad_expr;
6389 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
6392 if (b != NULL && b->value.logical != 0)
6397 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
6399 len = s->value.character.length;
6400 lenset = set->value.character.length;
6404 mpz_set_ui (result->value.integer, 0);
6412 mpz_set_ui (result->value.integer, 1);
6416 index = wide_strspn (s->value.character.string,
6417 set->value.character.string) + 1;
6426 mpz_set_ui (result->value.integer, len);
6429 for (index = len; index > 0; index --)
6431 for (i = 0; i < lenset; i++)
6433 if (s->value.character.string[index - 1]
6434 == set->value.character.string[i])
6442 mpz_set_ui (result->value.integer, index);
6448 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
6453 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6456 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
6461 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
6462 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
6463 return range_check (result, "XOR");
6466 return gfc_get_logical_expr (kind, &x->where,
6467 (x->value.logical && !y->value.logical)
6468 || (!x->value.logical && y->value.logical));
6476 /****************** Constant simplification *****************/
6478 /* Master function to convert one constant to another. While this is
6479 used as a simplification function, it requires the destination type
6480 and kind information which is supplied by a special case in
6484 gfc_convert_constant (gfc_expr *e, bt type, int kind)
6486 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
6501 f = gfc_int2complex;
6521 f = gfc_real2complex;
6532 f = gfc_complex2int;
6535 f = gfc_complex2real;
6538 f = gfc_complex2complex;
6564 f = gfc_hollerith2int;
6568 f = gfc_hollerith2real;
6572 f = gfc_hollerith2complex;
6576 f = gfc_hollerith2character;
6580 f = gfc_hollerith2logical;
6590 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
6595 switch (e->expr_type)
6598 result = f (e, kind);
6600 return &gfc_bad_expr;
6604 if (!gfc_is_constant_expr (e))
6607 result = gfc_get_array_expr (type, kind, &e->where);
6608 result->shape = gfc_copy_shape (e->shape, e->rank);
6609 result->rank = e->rank;
6611 for (c = gfc_constructor_first (e->value.constructor);
6612 c; c = gfc_constructor_next (c))
6615 if (c->iterator == NULL)
6616 tmp = f (c->expr, kind);
6619 g = gfc_convert_constant (c->expr, type, kind);
6620 if (g == &gfc_bad_expr)
6622 gfc_free_expr (result);
6630 gfc_free_expr (result);
6634 gfc_constructor_append_expr (&result->value.constructor,
6648 /* Function for converting character constants. */
6650 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
6655 if (!gfc_is_constant_expr (e))
6658 if (e->expr_type == EXPR_CONSTANT)
6660 /* Simple case of a scalar. */
6661 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
6663 return &gfc_bad_expr;
6665 result->value.character.length = e->value.character.length;
6666 result->value.character.string
6667 = gfc_get_wide_string (e->value.character.length + 1);
6668 memcpy (result->value.character.string, e->value.character.string,
6669 (e->value.character.length + 1) * sizeof (gfc_char_t));
6671 /* Check we only have values representable in the destination kind. */
6672 for (i = 0; i < result->value.character.length; i++)
6673 if (!gfc_check_character_range (result->value.character.string[i],
6676 gfc_error ("Character '%s' in string at %L cannot be converted "
6677 "into character kind %d",
6678 gfc_print_wide_char (result->value.character.string[i]),
6680 return &gfc_bad_expr;
6685 else if (e->expr_type == EXPR_ARRAY)
6687 /* For an array constructor, we convert each constructor element. */
6690 result = gfc_get_array_expr (type, kind, &e->where);
6691 result->shape = gfc_copy_shape (e->shape, e->rank);
6692 result->rank = e->rank;
6693 result->ts.u.cl = e->ts.u.cl;
6695 for (c = gfc_constructor_first (e->value.constructor);
6696 c; c = gfc_constructor_next (c))
6698 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
6699 if (tmp == &gfc_bad_expr)
6701 gfc_free_expr (result);
6702 return &gfc_bad_expr;
6707 gfc_free_expr (result);
6711 gfc_constructor_append_expr (&result->value.constructor,
6723 gfc_simplify_compiler_options (void)
6728 str = gfc_get_option_string ();
6729 result = gfc_get_character_expr (gfc_default_character_kind,
6730 &gfc_current_locus, str, strlen (str));
6737 gfc_simplify_compiler_version (void)
6742 len = strlen ("GCC version ") + strlen (version_string);
6743 buffer = XALLOCAVEC (char, len + 1);
6744 snprintf (buffer, len + 1, "GCC version %s", version_string);
6745 return gfc_get_character_expr (gfc_default_character_kind,
6746 &gfc_current_locus, buffer, len);