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->ts.type == BT_CLASS)
3332 if (array->expr_type != EXPR_VARIABLE)
3339 /* Follow any component references. */
3340 as = array->symtree->n.sym->as;
3341 for (ref = array->ref; ref; ref = ref->next)
3346 switch (ref->u.ar.type)
3353 /* We're done because 'as' has already been set in the
3354 previous iteration. */
3371 as = ref->u.c.component->as;
3383 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE))
3388 /* Multi-dimensional bounds. */
3389 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3393 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3394 if (upper && as && as->type == AS_ASSUMED_SIZE)
3396 /* An error message will be emitted in
3397 check_assumed_size_reference (resolve.c). */
3398 return &gfc_bad_expr;
3401 /* Simplify the bounds for each dimension. */
3402 for (d = 0; d < array->rank; d++)
3404 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
3406 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3410 for (j = 0; j < d; j++)
3411 gfc_free_expr (bounds[j]);
3416 /* Allocate the result expression. */
3417 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3418 gfc_default_integer_kind);
3420 return &gfc_bad_expr;
3422 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
3424 /* The result is a rank 1 array; its size is the rank of the first
3425 argument to {L,U}BOUND. */
3427 e->shape = gfc_get_shape (1);
3428 mpz_init_set_ui (e->shape[0], array->rank);
3430 /* Create the constructor for this array. */
3431 for (d = 0; d < array->rank; d++)
3432 gfc_constructor_append_expr (&e->value.constructor,
3433 bounds[d], &e->where);
3439 /* A DIM argument is specified. */
3440 if (dim->expr_type != EXPR_CONSTANT)
3443 d = mpz_get_si (dim->value.integer);
3445 if (d < 1 || d > array->rank
3446 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
3448 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3449 return &gfc_bad_expr;
3452 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3458 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3464 if (array->expr_type != EXPR_VARIABLE)
3467 /* Follow any component references. */
3468 as = (array->ts.type == BT_CLASS && array->ts.u.derived->components)
3469 ? array->ts.u.derived->components->as
3470 : array->symtree->n.sym->as;
3471 for (ref = array->ref; ref; ref = ref->next)
3476 switch (ref->u.ar.type)
3479 if (ref->u.ar.as->corank > 0)
3481 gcc_assert (as == ref->u.ar.as);
3488 /* We're done because 'as' has already been set in the
3489 previous iteration. */
3506 as = ref->u.c.component->as;
3519 if (as->cotype == AS_DEFERRED || as->cotype == AS_ASSUMED_SHAPE)
3524 /* Multi-dimensional cobounds. */
3525 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3529 /* Simplify the cobounds for each dimension. */
3530 for (d = 0; d < as->corank; d++)
3532 bounds[d] = simplify_bound_dim (array, kind, d + 1 + as->rank,
3533 upper, as, ref, true);
3534 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3538 for (j = 0; j < d; j++)
3539 gfc_free_expr (bounds[j]);
3544 /* Allocate the result expression. */
3545 e = gfc_get_expr ();
3546 e->where = array->where;
3547 e->expr_type = EXPR_ARRAY;
3548 e->ts.type = BT_INTEGER;
3549 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3550 gfc_default_integer_kind);
3554 return &gfc_bad_expr;
3558 /* The result is a rank 1 array; its size is the rank of the first
3559 argument to {L,U}COBOUND. */
3561 e->shape = gfc_get_shape (1);
3562 mpz_init_set_ui (e->shape[0], as->corank);
3564 /* Create the constructor for this array. */
3565 for (d = 0; d < as->corank; d++)
3566 gfc_constructor_append_expr (&e->value.constructor,
3567 bounds[d], &e->where);
3572 /* A DIM argument is specified. */
3573 if (dim->expr_type != EXPR_CONSTANT)
3576 d = mpz_get_si (dim->value.integer);
3578 if (d < 1 || d > as->corank)
3580 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3581 return &gfc_bad_expr;
3584 return simplify_bound_dim (array, kind, d+as->rank, upper, as, ref, true);
3590 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3592 return simplify_bound (array, dim, kind, 0);
3597 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3599 return simplify_cobound (array, dim, kind, 0);
3603 gfc_simplify_leadz (gfc_expr *e)
3605 unsigned long lz, bs;
3608 if (e->expr_type != EXPR_CONSTANT)
3611 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3612 bs = gfc_integer_kinds[i].bit_size;
3613 if (mpz_cmp_si (e->value.integer, 0) == 0)
3615 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3618 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3620 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3625 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3628 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3631 return &gfc_bad_expr;
3633 if (e->expr_type == EXPR_CONSTANT)
3635 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3636 mpz_set_si (result->value.integer, e->value.character.length);
3637 return range_check (result, "LEN");
3639 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3640 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3641 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3643 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3644 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3645 return range_check (result, "LEN");
3653 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3657 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3660 return &gfc_bad_expr;
3662 if (e->expr_type != EXPR_CONSTANT)
3665 len = e->value.character.length;
3666 for (count = 0, i = 1; i <= len; i++)
3667 if (e->value.character.string[len - i] == ' ')
3672 result = gfc_get_int_expr (k, &e->where, len - count);
3673 return range_check (result, "LEN_TRIM");
3677 gfc_simplify_lgamma (gfc_expr *x)
3682 if (x->expr_type != EXPR_CONSTANT)
3685 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3686 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
3688 return range_check (result, "LGAMMA");
3693 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
3695 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3698 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3699 gfc_compare_string (a, b) >= 0);
3704 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
3706 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3709 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3710 gfc_compare_string (a, b) > 0);
3715 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
3717 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3720 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3721 gfc_compare_string (a, b) <= 0);
3726 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
3728 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3731 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3732 gfc_compare_string (a, b) < 0);
3737 gfc_simplify_log (gfc_expr *x)
3741 if (x->expr_type != EXPR_CONSTANT)
3744 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3749 if (mpfr_sgn (x->value.real) <= 0)
3751 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3752 "to zero", &x->where);
3753 gfc_free_expr (result);
3754 return &gfc_bad_expr;
3757 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
3761 if ((mpfr_sgn (mpc_realref (x->value.complex)) == 0)
3762 && (mpfr_sgn (mpc_imagref (x->value.complex)) == 0))
3764 gfc_error ("Complex argument of LOG at %L cannot be zero",
3766 gfc_free_expr (result);
3767 return &gfc_bad_expr;
3770 gfc_set_model_kind (x->ts.kind);
3771 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
3775 gfc_internal_error ("gfc_simplify_log: bad type");
3778 return range_check (result, "LOG");
3783 gfc_simplify_log10 (gfc_expr *x)
3787 if (x->expr_type != EXPR_CONSTANT)
3790 if (mpfr_sgn (x->value.real) <= 0)
3792 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3793 "to zero", &x->where);
3794 return &gfc_bad_expr;
3797 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3798 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
3800 return range_check (result, "LOG10");
3805 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
3809 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
3811 return &gfc_bad_expr;
3813 if (e->expr_type != EXPR_CONSTANT)
3816 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
3821 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
3824 int row, result_rows, col, result_columns;
3825 int stride_a, offset_a, stride_b, offset_b;
3827 if (!is_constant_array_expr (matrix_a)
3828 || !is_constant_array_expr (matrix_b))
3831 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
3832 result = gfc_get_array_expr (matrix_a->ts.type,
3836 if (matrix_a->rank == 1 && matrix_b->rank == 2)
3839 result_columns = mpz_get_si (matrix_b->shape[0]);
3841 stride_b = mpz_get_si (matrix_b->shape[0]);
3844 result->shape = gfc_get_shape (result->rank);
3845 mpz_init_set_si (result->shape[0], result_columns);
3847 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
3849 result_rows = mpz_get_si (matrix_b->shape[0]);
3851 stride_a = mpz_get_si (matrix_a->shape[0]);
3855 result->shape = gfc_get_shape (result->rank);
3856 mpz_init_set_si (result->shape[0], result_rows);
3858 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
3860 result_rows = mpz_get_si (matrix_a->shape[0]);
3861 result_columns = mpz_get_si (matrix_b->shape[1]);
3862 stride_a = mpz_get_si (matrix_a->shape[1]);
3863 stride_b = mpz_get_si (matrix_b->shape[0]);
3866 result->shape = gfc_get_shape (result->rank);
3867 mpz_init_set_si (result->shape[0], result_rows);
3868 mpz_init_set_si (result->shape[1], result_columns);
3873 offset_a = offset_b = 0;
3874 for (col = 0; col < result_columns; ++col)
3878 for (row = 0; row < result_rows; ++row)
3880 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
3881 matrix_b, 1, offset_b);
3882 gfc_constructor_append_expr (&result->value.constructor,
3888 offset_b += stride_b;
3896 gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
3902 if (i->expr_type != EXPR_CONSTANT)
3905 kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind);
3907 return &gfc_bad_expr;
3908 k = gfc_validate_kind (BT_INTEGER, kind, false);
3910 s = gfc_extract_int (i, &arg);
3913 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
3915 /* MASKR(n) = 2^n - 1 */
3916 mpz_set_ui (result->value.integer, 1);
3917 mpz_mul_2exp (result->value.integer, result->value.integer, arg);
3918 mpz_sub_ui (result->value.integer, result->value.integer, 1);
3920 convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
3927 gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
3934 if (i->expr_type != EXPR_CONSTANT)
3937 kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind);
3939 return &gfc_bad_expr;
3940 k = gfc_validate_kind (BT_INTEGER, kind, false);
3942 s = gfc_extract_int (i, &arg);
3945 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
3947 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
3948 mpz_init_set_ui (z, 1);
3949 mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size);
3950 mpz_set_ui (result->value.integer, 1);
3951 mpz_mul_2exp (result->value.integer, result->value.integer,
3952 gfc_integer_kinds[k].bit_size - arg);
3953 mpz_sub (result->value.integer, z, result->value.integer);
3956 convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
3963 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
3965 if (tsource->expr_type != EXPR_CONSTANT
3966 || fsource->expr_type != EXPR_CONSTANT
3967 || mask->expr_type != EXPR_CONSTANT)
3970 return gfc_copy_expr (mask->value.logical ? tsource : fsource);
3975 gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr)
3977 mpz_t arg1, arg2, mask;
3980 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT
3981 || mask_expr->expr_type != EXPR_CONSTANT)
3984 result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where);
3986 /* Convert all argument to unsigned. */
3987 mpz_init_set (arg1, i->value.integer);
3988 mpz_init_set (arg2, j->value.integer);
3989 mpz_init_set (mask, mask_expr->value.integer);
3991 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
3992 mpz_and (arg1, arg1, mask);
3993 mpz_com (mask, mask);
3994 mpz_and (arg2, arg2, mask);
3995 mpz_ior (result->value.integer, arg1, arg2);
4005 /* Selects between current value and extremum for simplify_min_max
4006 and simplify_minval_maxval. */
4008 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
4010 switch (arg->ts.type)
4013 if (mpz_cmp (arg->value.integer,
4014 extremum->value.integer) * sign > 0)
4015 mpz_set (extremum->value.integer, arg->value.integer);
4019 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4021 mpfr_max (extremum->value.real, extremum->value.real,
4022 arg->value.real, GFC_RND_MODE);
4024 mpfr_min (extremum->value.real, extremum->value.real,
4025 arg->value.real, GFC_RND_MODE);
4029 #define LENGTH(x) ((x)->value.character.length)
4030 #define STRING(x) ((x)->value.character.string)
4031 if (LENGTH(extremum) < LENGTH(arg))
4033 gfc_char_t *tmp = STRING(extremum);
4035 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
4036 memcpy (STRING(extremum), tmp,
4037 LENGTH(extremum) * sizeof (gfc_char_t));
4038 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
4039 LENGTH(arg) - LENGTH(extremum));
4040 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
4041 LENGTH(extremum) = LENGTH(arg);
4045 if (gfc_compare_string (arg, extremum) * sign > 0)
4047 free (STRING(extremum));
4048 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
4049 memcpy (STRING(extremum), STRING(arg),
4050 LENGTH(arg) * sizeof (gfc_char_t));
4051 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
4052 LENGTH(extremum) - LENGTH(arg));
4053 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
4060 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4065 /* This function is special since MAX() can take any number of
4066 arguments. The simplified expression is a rewritten version of the
4067 argument list containing at most one constant element. Other
4068 constant elements are deleted. Because the argument list has
4069 already been checked, this function always succeeds. sign is 1 for
4070 MAX(), -1 for MIN(). */
4073 simplify_min_max (gfc_expr *expr, int sign)
4075 gfc_actual_arglist *arg, *last, *extremum;
4076 gfc_intrinsic_sym * specific;
4080 specific = expr->value.function.isym;
4082 arg = expr->value.function.actual;
4084 for (; arg; last = arg, arg = arg->next)
4086 if (arg->expr->expr_type != EXPR_CONSTANT)
4089 if (extremum == NULL)
4095 min_max_choose (arg->expr, extremum->expr, sign);
4097 /* Delete the extra constant argument. */
4099 expr->value.function.actual = arg->next;
4101 last->next = arg->next;
4104 gfc_free_actual_arglist (arg);
4108 /* If there is one value left, replace the function call with the
4110 if (expr->value.function.actual->next != NULL)
4113 /* Convert to the correct type and kind. */
4114 if (expr->ts.type != BT_UNKNOWN)
4115 return gfc_convert_constant (expr->value.function.actual->expr,
4116 expr->ts.type, expr->ts.kind);
4118 if (specific->ts.type != BT_UNKNOWN)
4119 return gfc_convert_constant (expr->value.function.actual->expr,
4120 specific->ts.type, specific->ts.kind);
4122 return gfc_copy_expr (expr->value.function.actual->expr);
4127 gfc_simplify_min (gfc_expr *e)
4129 return simplify_min_max (e, -1);
4134 gfc_simplify_max (gfc_expr *e)
4136 return simplify_min_max (e, 1);
4140 /* This is a simplified version of simplify_min_max to provide
4141 simplification of minval and maxval for a vector. */
4144 simplify_minval_maxval (gfc_expr *expr, int sign)
4146 gfc_constructor *c, *extremum;
4147 gfc_intrinsic_sym * specific;
4150 specific = expr->value.function.isym;
4152 for (c = gfc_constructor_first (expr->value.constructor);
4153 c; c = gfc_constructor_next (c))
4155 if (c->expr->expr_type != EXPR_CONSTANT)
4158 if (extremum == NULL)
4164 min_max_choose (c->expr, extremum->expr, sign);
4167 if (extremum == NULL)
4170 /* Convert to the correct type and kind. */
4171 if (expr->ts.type != BT_UNKNOWN)
4172 return gfc_convert_constant (extremum->expr,
4173 expr->ts.type, expr->ts.kind);
4175 if (specific->ts.type != BT_UNKNOWN)
4176 return gfc_convert_constant (extremum->expr,
4177 specific->ts.type, specific->ts.kind);
4179 return gfc_copy_expr (extremum->expr);
4184 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4186 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4189 return simplify_minval_maxval (array, -1);
4194 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4196 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4199 return simplify_minval_maxval (array, 1);
4204 gfc_simplify_maxexponent (gfc_expr *x)
4206 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4207 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4208 gfc_real_kinds[i].max_exponent);
4213 gfc_simplify_minexponent (gfc_expr *x)
4215 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4216 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4217 gfc_real_kinds[i].min_exponent);
4222 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
4228 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4231 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4232 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4237 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4239 /* Result is processor-dependent. */
4240 gfc_error ("Second argument MOD at %L is zero", &a->where);
4241 gfc_free_expr (result);
4242 return &gfc_bad_expr;
4244 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
4248 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4250 /* Result is processor-dependent. */
4251 gfc_error ("Second argument of MOD at %L is zero", &p->where);
4252 gfc_free_expr (result);
4253 return &gfc_bad_expr;
4256 gfc_set_model_kind (kind);
4258 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
4259 mpfr_trunc (tmp, tmp);
4260 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
4261 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
4266 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4269 return range_check (result, "MOD");
4274 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
4280 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4283 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4284 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4289 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4291 /* Result is processor-dependent. This processor just opts
4292 to not handle it at all. */
4293 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
4294 gfc_free_expr (result);
4295 return &gfc_bad_expr;
4297 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
4302 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4304 /* Result is processor-dependent. */
4305 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
4306 gfc_free_expr (result);
4307 return &gfc_bad_expr;
4310 gfc_set_model_kind (kind);
4312 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
4313 mpfr_floor (tmp, tmp);
4314 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
4315 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
4320 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4323 return range_check (result, "MODULO");
4327 /* Exists for the sole purpose of consistency with other intrinsics. */
4329 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
4330 gfc_expr *fp ATTRIBUTE_UNUSED,
4331 gfc_expr *l ATTRIBUTE_UNUSED,
4332 gfc_expr *to ATTRIBUTE_UNUSED,
4333 gfc_expr *tp ATTRIBUTE_UNUSED)
4340 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
4343 mp_exp_t emin, emax;
4346 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
4349 result = gfc_copy_expr (x);
4351 /* Save current values of emin and emax. */
4352 emin = mpfr_get_emin ();
4353 emax = mpfr_get_emax ();
4355 /* Set emin and emax for the current model number. */
4356 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
4357 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
4358 mpfr_get_prec(result->value.real) + 1);
4359 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
4360 mpfr_check_range (result->value.real, 0, GMP_RNDU);
4362 if (mpfr_sgn (s->value.real) > 0)
4364 mpfr_nextabove (result->value.real);
4365 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
4369 mpfr_nextbelow (result->value.real);
4370 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
4373 mpfr_set_emin (emin);
4374 mpfr_set_emax (emax);
4376 /* Only NaN can occur. Do not use range check as it gives an
4377 error for denormal numbers. */
4378 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
4380 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
4381 gfc_free_expr (result);
4382 return &gfc_bad_expr;
4390 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
4392 gfc_expr *itrunc, *result;
4395 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4397 return &gfc_bad_expr;
4399 if (e->expr_type != EXPR_CONSTANT)
4402 itrunc = gfc_copy_expr (e);
4403 mpfr_round (itrunc->value.real, e->value.real);
4405 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4406 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4408 gfc_free_expr (itrunc);
4410 return range_check (result, name);
4415 gfc_simplify_new_line (gfc_expr *e)
4419 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4420 result->value.character.string[0] = '\n';
4427 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4429 return simplify_nint ("NINT", e, k);
4434 gfc_simplify_idnint (gfc_expr *e)
4436 return simplify_nint ("IDNINT", e, NULL);
4441 add_squared (gfc_expr *result, gfc_expr *e)
4445 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4446 gcc_assert (result->ts.type == BT_REAL
4447 && result->expr_type == EXPR_CONSTANT);
4449 gfc_set_model_kind (result->ts.kind);
4451 mpfr_pow_ui (tmp, e->value.real, 2, GFC_RND_MODE);
4452 mpfr_add (result->value.real, result->value.real, tmp,
4461 do_sqrt (gfc_expr *result, gfc_expr *e)
4463 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4464 gcc_assert (result->ts.type == BT_REAL
4465 && result->expr_type == EXPR_CONSTANT);
4467 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
4468 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4474 gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
4478 if (!is_constant_array_expr (e)
4479 || (dim != NULL && !gfc_is_constant_expr (dim)))
4482 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
4483 init_result_expr (result, 0, NULL);
4485 if (!dim || e->rank == 1)
4487 result = simplify_transformation_to_scalar (result, e, NULL,
4489 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4492 result = simplify_transformation_to_array (result, e, dim, NULL,
4493 add_squared, &do_sqrt);
4500 gfc_simplify_not (gfc_expr *e)
4504 if (e->expr_type != EXPR_CONSTANT)
4507 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4508 mpz_com (result->value.integer, e->value.integer);
4510 return range_check (result, "NOT");
4515 gfc_simplify_null (gfc_expr *mold)
4521 result = gfc_copy_expr (mold);
4522 result->expr_type = EXPR_NULL;
4525 result = gfc_get_null_expr (NULL);
4532 gfc_simplify_num_images (void)
4536 if (gfc_option.coarray == GFC_FCOARRAY_NONE)
4538 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
4539 return &gfc_bad_expr;
4542 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE)
4545 /* FIXME: gfc_current_locus is wrong. */
4546 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4547 &gfc_current_locus);
4548 mpz_set_si (result->value.integer, 1);
4554 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4559 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4562 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4567 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4568 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4569 return range_check (result, "OR");
4572 return gfc_get_logical_expr (kind, &x->where,
4573 x->value.logical || y->value.logical);
4581 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4584 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4586 if (!is_constant_array_expr(array)
4587 || !is_constant_array_expr(vector)
4588 || (!gfc_is_constant_expr (mask)
4589 && !is_constant_array_expr(mask)))
4592 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4593 if (array->ts.type == BT_DERIVED)
4594 result->ts.u.derived = array->ts.u.derived;
4596 array_ctor = gfc_constructor_first (array->value.constructor);
4597 vector_ctor = vector
4598 ? gfc_constructor_first (vector->value.constructor)
4601 if (mask->expr_type == EXPR_CONSTANT
4602 && mask->value.logical)
4604 /* Copy all elements of ARRAY to RESULT. */
4607 gfc_constructor_append_expr (&result->value.constructor,
4608 gfc_copy_expr (array_ctor->expr),
4611 array_ctor = gfc_constructor_next (array_ctor);
4612 vector_ctor = gfc_constructor_next (vector_ctor);
4615 else if (mask->expr_type == EXPR_ARRAY)
4617 /* Copy only those elements of ARRAY to RESULT whose
4618 MASK equals .TRUE.. */
4619 mask_ctor = gfc_constructor_first (mask->value.constructor);
4622 if (mask_ctor->expr->value.logical)
4624 gfc_constructor_append_expr (&result->value.constructor,
4625 gfc_copy_expr (array_ctor->expr),
4627 vector_ctor = gfc_constructor_next (vector_ctor);
4630 array_ctor = gfc_constructor_next (array_ctor);
4631 mask_ctor = gfc_constructor_next (mask_ctor);
4635 /* Append any left-over elements from VECTOR to RESULT. */
4638 gfc_constructor_append_expr (&result->value.constructor,
4639 gfc_copy_expr (vector_ctor->expr),
4641 vector_ctor = gfc_constructor_next (vector_ctor);
4644 result->shape = gfc_get_shape (1);
4645 gfc_array_size (result, &result->shape[0]);
4647 if (array->ts.type == BT_CHARACTER)
4648 result->ts.u.cl = array->ts.u.cl;
4655 do_xor (gfc_expr *result, gfc_expr *e)
4657 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
4658 gcc_assert (result->ts.type == BT_LOGICAL
4659 && result->expr_type == EXPR_CONSTANT);
4661 result->value.logical = result->value.logical != e->value.logical;
4668 gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
4670 return simplify_transformation (e, dim, NULL, 0, do_xor);
4675 gfc_simplify_popcnt (gfc_expr *e)
4680 if (e->expr_type != EXPR_CONSTANT)
4683 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4685 /* Convert argument to unsigned, then count the '1' bits. */
4686 mpz_init_set (x, e->value.integer);
4687 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
4688 res = mpz_popcount (x);
4691 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res);
4696 gfc_simplify_poppar (gfc_expr *e)
4702 if (e->expr_type != EXPR_CONSTANT)
4705 popcnt = gfc_simplify_popcnt (e);
4706 gcc_assert (popcnt);
4708 s = gfc_extract_int (popcnt, &i);
4711 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2);
4716 gfc_simplify_precision (gfc_expr *e)
4718 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4719 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
4720 gfc_real_kinds[i].precision);
4725 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
4727 return simplify_transformation (array, dim, mask, 1, gfc_multiply);
4732 gfc_simplify_radix (gfc_expr *e)
4735 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4740 i = gfc_integer_kinds[i].radix;
4744 i = gfc_real_kinds[i].radix;
4751 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4756 gfc_simplify_range (gfc_expr *e)
4759 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4764 i = gfc_integer_kinds[i].range;
4769 i = gfc_real_kinds[i].range;
4776 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4781 gfc_simplify_rank (gfc_expr *e)
4783 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, e->rank);
4788 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
4790 gfc_expr *result = NULL;
4793 if (e->ts.type == BT_COMPLEX)
4794 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
4796 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
4799 return &gfc_bad_expr;
4801 if (e->expr_type != EXPR_CONSTANT)
4804 if (convert_boz (e, kind) == &gfc_bad_expr)
4805 return &gfc_bad_expr;
4807 result = gfc_convert_constant (e, BT_REAL, kind);
4808 if (result == &gfc_bad_expr)
4809 return &gfc_bad_expr;
4811 return range_check (result, "REAL");
4816 gfc_simplify_realpart (gfc_expr *e)
4820 if (e->expr_type != EXPR_CONSTANT)
4823 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
4824 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
4826 return range_check (result, "REALPART");
4830 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
4833 int i, j, len, ncop, nlen;
4835 bool have_length = false;
4837 /* If NCOPIES isn't a constant, there's nothing we can do. */
4838 if (n->expr_type != EXPR_CONSTANT)
4841 /* If NCOPIES is negative, it's an error. */
4842 if (mpz_sgn (n->value.integer) < 0)
4844 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4846 return &gfc_bad_expr;
4849 /* If we don't know the character length, we can do no more. */
4850 if (e->ts.u.cl && e->ts.u.cl->length
4851 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
4853 len = mpz_get_si (e->ts.u.cl->length->value.integer);
4856 else if (e->expr_type == EXPR_CONSTANT
4857 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
4859 len = e->value.character.length;
4864 /* If the source length is 0, any value of NCOPIES is valid
4865 and everything behaves as if NCOPIES == 0. */
4868 mpz_set_ui (ncopies, 0);
4870 mpz_set (ncopies, n->value.integer);
4872 /* Check that NCOPIES isn't too large. */
4878 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4880 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4884 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
4885 e->ts.u.cl->length->value.integer);
4889 mpz_init_set_si (mlen, len);
4890 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
4894 /* The check itself. */
4895 if (mpz_cmp (ncopies, max) > 0)
4898 mpz_clear (ncopies);
4899 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4901 return &gfc_bad_expr;
4906 mpz_clear (ncopies);
4908 /* For further simplification, we need the character string to be
4910 if (e->expr_type != EXPR_CONSTANT)
4914 (e->ts.u.cl->length &&
4915 mpz_sgn (e->ts.u.cl->length->value.integer)) != 0)
4917 const char *res = gfc_extract_int (n, &ncop);
4918 gcc_assert (res == NULL);
4923 len = e->value.character.length;
4926 result = gfc_get_constant_expr (BT_CHARACTER, e->ts.kind, &e->where);
4929 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
4931 len = e->value.character.length;
4934 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
4935 for (i = 0; i < ncop; i++)
4936 for (j = 0; j < len; j++)
4937 result->value.character.string[j+i*len]= e->value.character.string[j];
4939 result->value.character.string[nlen] = '\0'; /* For debugger */
4944 /* This one is a bear, but mainly has to do with shuffling elements. */
4947 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
4948 gfc_expr *pad, gfc_expr *order_exp)
4950 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
4951 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
4955 gfc_expr *e, *result;
4957 /* Check that argument expression types are OK. */
4958 if (!is_constant_array_expr (source)
4959 || !is_constant_array_expr (shape_exp)
4960 || !is_constant_array_expr (pad)
4961 || !is_constant_array_expr (order_exp))
4964 /* Proceed with simplification, unpacking the array. */
4971 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
4975 gfc_extract_int (e, &shape[rank]);
4977 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
4978 gcc_assert (shape[rank] >= 0);
4983 gcc_assert (rank > 0);
4985 /* Now unpack the order array if present. */
4986 if (order_exp == NULL)
4988 for (i = 0; i < rank; i++)
4993 for (i = 0; i < rank; i++)
4996 for (i = 0; i < rank; i++)
4998 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
5001 gfc_extract_int (e, &order[i]);
5003 gcc_assert (order[i] >= 1 && order[i] <= rank);
5005 gcc_assert (x[order[i]] == 0);
5010 /* Count the elements in the source and padding arrays. */
5015 gfc_array_size (pad, &size);
5016 npad = mpz_get_ui (size);
5020 gfc_array_size (source, &size);
5021 nsource = mpz_get_ui (size);
5024 /* If it weren't for that pesky permutation we could just loop
5025 through the source and round out any shortage with pad elements.
5026 But no, someone just had to have the compiler do something the
5027 user should be doing. */
5029 for (i = 0; i < rank; i++)
5032 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5034 if (source->ts.type == BT_DERIVED)
5035 result->ts.u.derived = source->ts.u.derived;
5036 result->rank = rank;
5037 result->shape = gfc_get_shape (rank);
5038 for (i = 0; i < rank; i++)
5039 mpz_init_set_ui (result->shape[i], shape[i]);
5041 while (nsource > 0 || npad > 0)
5043 /* Figure out which element to extract. */
5044 mpz_set_ui (index, 0);
5046 for (i = rank - 1; i >= 0; i--)
5048 mpz_add_ui (index, index, x[order[i]]);
5050 mpz_mul_ui (index, index, shape[order[i - 1]]);
5053 if (mpz_cmp_ui (index, INT_MAX) > 0)
5054 gfc_internal_error ("Reshaped array too large at %C");
5056 j = mpz_get_ui (index);
5059 e = gfc_constructor_lookup_expr (source->value.constructor, j);
5062 gcc_assert (npad > 0);
5066 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
5070 gfc_constructor_append_expr (&result->value.constructor,
5071 gfc_copy_expr (e), &e->where);
5073 /* Calculate the next element. */
5077 if (++x[i] < shape[i])
5093 gfc_simplify_rrspacing (gfc_expr *x)
5099 if (x->expr_type != EXPR_CONSTANT)
5102 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5104 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5105 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5107 /* Special case x = -0 and 0. */
5108 if (mpfr_sgn (result->value.real) == 0)
5110 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5114 /* | x * 2**(-e) | * 2**p. */
5115 e = - (long int) mpfr_get_exp (x->value.real);
5116 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
5118 p = (long int) gfc_real_kinds[i].digits;
5119 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
5121 return range_check (result, "RRSPACING");
5126 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
5128 int k, neg_flag, power, exp_range;
5129 mpfr_t scale, radix;
5132 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5135 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5137 if (mpfr_sgn (x->value.real) == 0)
5139 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5143 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
5145 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
5147 /* This check filters out values of i that would overflow an int. */
5148 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
5149 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
5151 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
5152 gfc_free_expr (result);
5153 return &gfc_bad_expr;
5156 /* Compute scale = radix ** power. */
5157 power = mpz_get_si (i->value.integer);
5167 gfc_set_model_kind (x->ts.kind);
5170 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
5171 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
5174 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
5176 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
5178 mpfr_clears (scale, radix, NULL);
5180 return range_check (result, "SCALE");
5184 /* Variants of strspn and strcspn that operate on wide characters. */
5187 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
5190 const gfc_char_t *c;
5194 for (c = s2; *c; c++)
5208 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
5211 const gfc_char_t *c;
5215 for (c = s2; *c; c++)
5230 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
5235 size_t indx, len, lenc;
5236 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
5239 return &gfc_bad_expr;
5241 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
5244 if (b != NULL && b->value.logical != 0)
5249 len = e->value.character.length;
5250 lenc = c->value.character.length;
5252 if (len == 0 || lenc == 0)
5260 indx = wide_strcspn (e->value.character.string,
5261 c->value.character.string) + 1;
5268 for (indx = len; indx > 0; indx--)
5270 for (i = 0; i < lenc; i++)
5272 if (c->value.character.string[i]
5273 == e->value.character.string[indx - 1])
5282 result = gfc_get_int_expr (k, &e->where, indx);
5283 return range_check (result, "SCAN");
5288 gfc_simplify_selected_char_kind (gfc_expr *e)
5292 if (e->expr_type != EXPR_CONSTANT)
5295 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
5296 || gfc_compare_with_Cstring (e, "default", false) == 0)
5298 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
5303 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5308 gfc_simplify_selected_int_kind (gfc_expr *e)
5312 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
5317 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
5318 if (gfc_integer_kinds[i].range >= range
5319 && gfc_integer_kinds[i].kind < kind)
5320 kind = gfc_integer_kinds[i].kind;
5322 if (kind == INT_MAX)
5325 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5330 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
5332 int range, precision, radix, i, kind, found_precision, found_range,
5334 locus *loc = &gfc_current_locus;
5340 if (p->expr_type != EXPR_CONSTANT
5341 || gfc_extract_int (p, &precision) != NULL)
5350 if (q->expr_type != EXPR_CONSTANT
5351 || gfc_extract_int (q, &range) != NULL)
5362 if (rdx->expr_type != EXPR_CONSTANT
5363 || gfc_extract_int (rdx, &radix) != NULL)
5371 found_precision = 0;
5375 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
5377 if (gfc_real_kinds[i].precision >= precision)
5378 found_precision = 1;
5380 if (gfc_real_kinds[i].range >= range)
5383 if (gfc_real_kinds[i].radix >= radix)
5386 if (gfc_real_kinds[i].precision >= precision
5387 && gfc_real_kinds[i].range >= range
5388 && gfc_real_kinds[i].radix >= radix && gfc_real_kinds[i].kind < kind)
5389 kind = gfc_real_kinds[i].kind;
5392 if (kind == INT_MAX)
5394 if (found_radix && found_range && !found_precision)
5396 else if (found_radix && found_precision && !found_range)
5398 else if (found_radix && !found_precision && !found_range)
5400 else if (found_radix)
5406 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
5411 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
5414 mpfr_t exp, absv, log2, pow2, frac;
5417 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5420 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5422 if (mpfr_sgn (x->value.real) == 0)
5424 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5428 gfc_set_model_kind (x->ts.kind);
5435 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
5436 mpfr_log2 (log2, absv, GFC_RND_MODE);
5438 mpfr_trunc (log2, log2);
5439 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
5441 /* Old exponent value, and fraction. */
5442 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
5444 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
5447 exp2 = (unsigned long) mpz_get_d (i->value.integer);
5448 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
5450 mpfr_clears (absv, log2, pow2, frac, NULL);
5452 return range_check (result, "SET_EXPONENT");
5457 gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
5459 mpz_t shape[GFC_MAX_DIMENSIONS];
5460 gfc_expr *result, *e, *f;
5464 int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind);
5466 result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
5468 if (source->rank == 0)
5471 if (source->expr_type == EXPR_VARIABLE)
5473 ar = gfc_find_array_ref (source);
5474 t = gfc_array_ref_shape (ar, shape);
5476 else if (source->shape)
5479 for (n = 0; n < source->rank; n++)
5481 mpz_init (shape[n]);
5482 mpz_set (shape[n], source->shape[n]);
5488 for (n = 0; n < source->rank; n++)
5490 e = gfc_get_constant_expr (BT_INTEGER, k, &source->where);
5494 mpz_set (e->value.integer, shape[n]);
5495 mpz_clear (shape[n]);
5499 mpz_set_ui (e->value.integer, n + 1);
5501 f = gfc_simplify_size (source, e, NULL);
5505 gfc_free_expr (result);
5512 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5520 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5523 gfc_expr *return_value;
5525 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
5528 return &gfc_bad_expr;
5530 /* For unary operations, the size of the result is given by the size
5531 of the operand. For binary ones, it's the size of the first operand
5532 unless it is scalar, then it is the size of the second. */
5533 if (array->expr_type == EXPR_OP && !array->value.op.uop)
5535 gfc_expr* replacement;
5536 gfc_expr* simplified;
5538 switch (array->value.op.op)
5540 /* Unary operations. */
5542 case INTRINSIC_UPLUS:
5543 case INTRINSIC_UMINUS:
5544 replacement = array->value.op.op1;
5547 /* Binary operations. If any one of the operands is scalar, take
5548 the other one's size. If both of them are arrays, it does not
5549 matter -- try to find one with known shape, if possible. */
5551 if (array->value.op.op1->rank == 0)
5552 replacement = array->value.op.op2;
5553 else if (array->value.op.op2->rank == 0)
5554 replacement = array->value.op.op1;
5557 simplified = gfc_simplify_size (array->value.op.op1, dim, kind);
5561 replacement = array->value.op.op2;
5566 /* Try to reduce it directly if possible. */
5567 simplified = gfc_simplify_size (replacement, dim, kind);
5569 /* Otherwise, we build a new SIZE call. This is hopefully at least
5570 simpler than the original one. */
5572 simplified = gfc_build_intrinsic_call ("size", array->where, 3,
5573 gfc_copy_expr (replacement),
5574 gfc_copy_expr (dim),
5575 gfc_copy_expr (kind));
5582 if (gfc_array_size (array, &size) == FAILURE)
5587 if (dim->expr_type != EXPR_CONSTANT)
5590 d = mpz_get_ui (dim->value.integer) - 1;
5591 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
5595 return_value = gfc_get_int_expr (k, &array->where, mpz_get_si (size));
5597 return return_value;
5602 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
5606 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
5609 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5614 mpz_abs (result->value.integer, x->value.integer);
5615 if (mpz_sgn (y->value.integer) < 0)
5616 mpz_neg (result->value.integer, result->value.integer);
5620 if (gfc_option.flag_sign_zero)
5621 mpfr_copysign (result->value.real, x->value.real, y->value.real,
5624 mpfr_setsign (result->value.real, x->value.real,
5625 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
5629 gfc_internal_error ("Bad type in gfc_simplify_sign");
5637 gfc_simplify_sin (gfc_expr *x)
5641 if (x->expr_type != EXPR_CONSTANT)
5644 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5649 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
5653 gfc_set_model (x->value.real);
5654 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5658 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
5661 return range_check (result, "SIN");
5666 gfc_simplify_sinh (gfc_expr *x)
5670 if (x->expr_type != EXPR_CONSTANT)
5673 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5678 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
5682 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5689 return range_check (result, "SINH");
5693 /* The argument is always a double precision real that is converted to
5694 single precision. TODO: Rounding! */
5697 gfc_simplify_sngl (gfc_expr *a)
5701 if (a->expr_type != EXPR_CONSTANT)
5704 result = gfc_real2real (a, gfc_default_real_kind);
5705 return range_check (result, "SNGL");
5710 gfc_simplify_spacing (gfc_expr *x)
5716 if (x->expr_type != EXPR_CONSTANT)
5719 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5721 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5723 /* Special case x = 0 and -0. */
5724 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5725 if (mpfr_sgn (result->value.real) == 0)
5727 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5731 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5732 are the radix, exponent of x, and precision. This excludes the
5733 possibility of subnormal numbers. Fortran 2003 states the result is
5734 b**max(e - p, emin - 1). */
5736 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
5737 en = (long int) gfc_real_kinds[i].min_exponent - 1;
5738 en = en > ep ? en : ep;
5740 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
5741 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
5743 return range_check (result, "SPACING");
5748 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
5750 gfc_expr *result = 0L;
5751 int i, j, dim, ncopies;
5754 if ((!gfc_is_constant_expr (source)
5755 && !is_constant_array_expr (source))
5756 || !gfc_is_constant_expr (dim_expr)
5757 || !gfc_is_constant_expr (ncopies_expr))
5760 gcc_assert (dim_expr->ts.type == BT_INTEGER);
5761 gfc_extract_int (dim_expr, &dim);
5762 dim -= 1; /* zero-base DIM */
5764 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
5765 gfc_extract_int (ncopies_expr, &ncopies);
5766 ncopies = MAX (ncopies, 0);
5768 /* Do not allow the array size to exceed the limit for an array
5770 if (source->expr_type == EXPR_ARRAY)
5772 if (gfc_array_size (source, &size) == FAILURE)
5773 gfc_internal_error ("Failure getting length of a constant array.");
5776 mpz_init_set_ui (size, 1);
5778 if (mpz_get_si (size)*ncopies > gfc_option.flag_max_array_constructor)
5781 if (source->expr_type == EXPR_CONSTANT)
5783 gcc_assert (dim == 0);
5785 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5787 if (source->ts.type == BT_DERIVED)
5788 result->ts.u.derived = source->ts.u.derived;
5790 result->shape = gfc_get_shape (result->rank);
5791 mpz_init_set_si (result->shape[0], ncopies);
5793 for (i = 0; i < ncopies; ++i)
5794 gfc_constructor_append_expr (&result->value.constructor,
5795 gfc_copy_expr (source), NULL);
5797 else if (source->expr_type == EXPR_ARRAY)
5799 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
5800 gfc_constructor *source_ctor;
5802 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
5803 gcc_assert (dim >= 0 && dim <= source->rank);
5805 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5807 if (source->ts.type == BT_DERIVED)
5808 result->ts.u.derived = source->ts.u.derived;
5809 result->rank = source->rank + 1;
5810 result->shape = gfc_get_shape (result->rank);
5812 for (i = 0, j = 0; i < result->rank; ++i)
5815 mpz_init_set (result->shape[i], source->shape[j++]);
5817 mpz_init_set_si (result->shape[i], ncopies);
5819 extent[i] = mpz_get_si (result->shape[i]);
5820 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
5824 for (source_ctor = gfc_constructor_first (source->value.constructor);
5825 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
5827 for (i = 0; i < ncopies; ++i)
5828 gfc_constructor_insert_expr (&result->value.constructor,
5829 gfc_copy_expr (source_ctor->expr),
5830 NULL, offset + i * rstride[dim]);
5832 offset += (dim == 0 ? ncopies : 1);
5836 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
5837 Replace NULL with gcc_unreachable() after implementing
5838 gfc_simplify_cshift(). */
5841 if (source->ts.type == BT_CHARACTER)
5842 result->ts.u.cl = source->ts.u.cl;
5849 gfc_simplify_sqrt (gfc_expr *e)
5851 gfc_expr *result = NULL;
5853 if (e->expr_type != EXPR_CONSTANT)
5859 if (mpfr_cmp_si (e->value.real, 0) < 0)
5861 gfc_error ("Argument of SQRT at %L has a negative value",
5863 return &gfc_bad_expr;
5865 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5866 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
5870 gfc_set_model (e->value.real);
5872 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5873 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
5877 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
5880 return range_check (result, "SQRT");
5885 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5887 return simplify_transformation (array, dim, mask, 0, gfc_add);
5892 gfc_simplify_tan (gfc_expr *x)
5896 if (x->expr_type != EXPR_CONSTANT)
5899 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5904 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
5908 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5915 return range_check (result, "TAN");
5920 gfc_simplify_tanh (gfc_expr *x)
5924 if (x->expr_type != EXPR_CONSTANT)
5927 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5932 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
5936 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5943 return range_check (result, "TANH");
5948 gfc_simplify_tiny (gfc_expr *e)
5953 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
5955 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
5956 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5963 gfc_simplify_trailz (gfc_expr *e)
5965 unsigned long tz, bs;
5968 if (e->expr_type != EXPR_CONSTANT)
5971 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5972 bs = gfc_integer_kinds[i].bit_size;
5973 tz = mpz_scan1 (e->value.integer, 0);
5975 return gfc_get_int_expr (gfc_default_integer_kind,
5976 &e->where, MIN (tz, bs));
5981 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
5984 gfc_expr *mold_element;
5989 unsigned char *buffer;
5990 size_t result_length;
5993 if (!gfc_is_constant_expr (source)
5994 || (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
5995 || !gfc_is_constant_expr (size))
5998 if (gfc_calculate_transfer_sizes (source, mold, size, &source_size,
5999 &result_size, &result_length) == FAILURE)
6002 /* Calculate the size of the source. */
6003 if (source->expr_type == EXPR_ARRAY
6004 && gfc_array_size (source, &tmp) == FAILURE)
6005 gfc_internal_error ("Failure getting length of a constant array.");
6007 /* Create an empty new expression with the appropriate characteristics. */
6008 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
6010 result->ts = mold->ts;
6012 mold_element = mold->expr_type == EXPR_ARRAY
6013 ? gfc_constructor_first (mold->value.constructor)->expr
6016 /* Set result character length, if needed. Note that this needs to be
6017 set even for array expressions, in order to pass this information into
6018 gfc_target_interpret_expr. */
6019 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
6020 result->value.character.length = mold_element->value.character.length;
6022 /* Set the number of elements in the result, and determine its size. */
6024 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
6026 result->expr_type = EXPR_ARRAY;
6028 result->shape = gfc_get_shape (1);
6029 mpz_init_set_ui (result->shape[0], result_length);
6034 /* Allocate the buffer to store the binary version of the source. */
6035 buffer_size = MAX (source_size, result_size);
6036 buffer = (unsigned char*)alloca (buffer_size);
6037 memset (buffer, 0, buffer_size);
6039 /* Now write source to the buffer. */
6040 gfc_target_encode_expr (source, buffer, buffer_size);
6042 /* And read the buffer back into the new expression. */
6043 gfc_target_interpret_expr (buffer, buffer_size, result, false);
6050 gfc_simplify_transpose (gfc_expr *matrix)
6052 int row, matrix_rows, col, matrix_cols;
6055 if (!is_constant_array_expr (matrix))
6058 gcc_assert (matrix->rank == 2);
6060 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
6063 result->shape = gfc_get_shape (result->rank);
6064 mpz_set (result->shape[0], matrix->shape[1]);
6065 mpz_set (result->shape[1], matrix->shape[0]);
6067 if (matrix->ts.type == BT_CHARACTER)
6068 result->ts.u.cl = matrix->ts.u.cl;
6069 else if (matrix->ts.type == BT_DERIVED)
6070 result->ts.u.derived = matrix->ts.u.derived;
6072 matrix_rows = mpz_get_si (matrix->shape[0]);
6073 matrix_cols = mpz_get_si (matrix->shape[1]);
6074 for (row = 0; row < matrix_rows; ++row)
6075 for (col = 0; col < matrix_cols; ++col)
6077 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
6078 col * matrix_rows + row);
6079 gfc_constructor_insert_expr (&result->value.constructor,
6080 gfc_copy_expr (e), &matrix->where,
6081 row * matrix_cols + col);
6089 gfc_simplify_trim (gfc_expr *e)
6092 int count, i, len, lentrim;
6094 if (e->expr_type != EXPR_CONSTANT)
6097 len = e->value.character.length;
6098 for (count = 0, i = 1; i <= len; ++i)
6100 if (e->value.character.string[len - i] == ' ')
6106 lentrim = len - count;
6108 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
6109 for (i = 0; i < lentrim; i++)
6110 result->value.character.string[i] = e->value.character.string[i];
6117 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
6122 gfc_constructor *sub_cons;
6126 if (!is_constant_array_expr (sub))
6129 /* Follow any component references. */
6130 as = coarray->symtree->n.sym->as;
6131 for (ref = coarray->ref; ref; ref = ref->next)
6132 if (ref->type == REF_COMPONENT)
6135 if (as->type == AS_DEFERRED)
6138 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6139 the cosubscript addresses the first image. */
6141 sub_cons = gfc_constructor_first (sub->value.constructor);
6144 for (d = 1; d <= as->corank; d++)
6149 gcc_assert (sub_cons != NULL);
6151 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
6153 if (ca_bound == NULL)
6156 if (ca_bound == &gfc_bad_expr)
6159 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
6163 gfc_free_expr (ca_bound);
6164 sub_cons = gfc_constructor_next (sub_cons);
6168 first_image = false;
6172 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6173 "SUB has %ld and COARRAY lower bound is %ld)",
6175 mpz_get_si (sub_cons->expr->value.integer),
6176 mpz_get_si (ca_bound->value.integer));
6177 gfc_free_expr (ca_bound);
6178 return &gfc_bad_expr;
6181 gfc_free_expr (ca_bound);
6183 /* Check whether upperbound is valid for the multi-images case. */
6186 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
6188 if (ca_bound == &gfc_bad_expr)
6191 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
6192 && mpz_cmp (ca_bound->value.integer,
6193 sub_cons->expr->value.integer) < 0)
6195 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6196 "SUB has %ld and COARRAY upper bound is %ld)",
6198 mpz_get_si (sub_cons->expr->value.integer),
6199 mpz_get_si (ca_bound->value.integer));
6200 gfc_free_expr (ca_bound);
6201 return &gfc_bad_expr;
6205 gfc_free_expr (ca_bound);
6208 sub_cons = gfc_constructor_next (sub_cons);
6211 gcc_assert (sub_cons == NULL);
6213 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE && !first_image)
6216 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6217 &gfc_current_locus);
6219 mpz_set_si (result->value.integer, 1);
6221 mpz_set_si (result->value.integer, 0);
6228 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim)
6230 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE)
6233 if (coarray == NULL)
6236 /* FIXME: gfc_current_locus is wrong. */
6237 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6238 &gfc_current_locus);
6239 mpz_set_si (result->value.integer, 1);
6243 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6244 return simplify_cobound (coarray, dim, NULL, 0);
6249 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6251 return simplify_bound (array, dim, kind, 1);
6255 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6257 return simplify_cobound (array, dim, kind, 1);
6262 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
6264 gfc_expr *result, *e;
6265 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
6267 if (!is_constant_array_expr (vector)
6268 || !is_constant_array_expr (mask)
6269 || (!gfc_is_constant_expr (field)
6270 && !is_constant_array_expr(field)))
6273 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
6275 if (vector->ts.type == BT_DERIVED)
6276 result->ts.u.derived = vector->ts.u.derived;
6277 result->rank = mask->rank;
6278 result->shape = gfc_copy_shape (mask->shape, mask->rank);
6280 if (vector->ts.type == BT_CHARACTER)
6281 result->ts.u.cl = vector->ts.u.cl;
6283 vector_ctor = gfc_constructor_first (vector->value.constructor);
6284 mask_ctor = gfc_constructor_first (mask->value.constructor);
6286 = field->expr_type == EXPR_ARRAY
6287 ? gfc_constructor_first (field->value.constructor)
6292 if (mask_ctor->expr->value.logical)
6294 gcc_assert (vector_ctor);
6295 e = gfc_copy_expr (vector_ctor->expr);
6296 vector_ctor = gfc_constructor_next (vector_ctor);
6298 else if (field->expr_type == EXPR_ARRAY)
6299 e = gfc_copy_expr (field_ctor->expr);
6301 e = gfc_copy_expr (field);
6303 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
6305 mask_ctor = gfc_constructor_next (mask_ctor);
6306 field_ctor = gfc_constructor_next (field_ctor);
6314 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
6318 size_t index, len, lenset;
6320 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
6323 return &gfc_bad_expr;
6325 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
6328 if (b != NULL && b->value.logical != 0)
6333 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
6335 len = s->value.character.length;
6336 lenset = set->value.character.length;
6340 mpz_set_ui (result->value.integer, 0);
6348 mpz_set_ui (result->value.integer, 1);
6352 index = wide_strspn (s->value.character.string,
6353 set->value.character.string) + 1;
6362 mpz_set_ui (result->value.integer, len);
6365 for (index = len; index > 0; index --)
6367 for (i = 0; i < lenset; i++)
6369 if (s->value.character.string[index - 1]
6370 == set->value.character.string[i])
6378 mpz_set_ui (result->value.integer, index);
6384 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
6389 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6392 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
6397 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
6398 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
6399 return range_check (result, "XOR");
6402 return gfc_get_logical_expr (kind, &x->where,
6403 (x->value.logical && !y->value.logical)
6404 || (!x->value.logical && y->value.logical));
6412 /****************** Constant simplification *****************/
6414 /* Master function to convert one constant to another. While this is
6415 used as a simplification function, it requires the destination type
6416 and kind information which is supplied by a special case in
6420 gfc_convert_constant (gfc_expr *e, bt type, int kind)
6422 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
6437 f = gfc_int2complex;
6457 f = gfc_real2complex;
6468 f = gfc_complex2int;
6471 f = gfc_complex2real;
6474 f = gfc_complex2complex;
6500 f = gfc_hollerith2int;
6504 f = gfc_hollerith2real;
6508 f = gfc_hollerith2complex;
6512 f = gfc_hollerith2character;
6516 f = gfc_hollerith2logical;
6526 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
6531 switch (e->expr_type)
6534 result = f (e, kind);
6536 return &gfc_bad_expr;
6540 if (!gfc_is_constant_expr (e))
6543 result = gfc_get_array_expr (type, kind, &e->where);
6544 result->shape = gfc_copy_shape (e->shape, e->rank);
6545 result->rank = e->rank;
6547 for (c = gfc_constructor_first (e->value.constructor);
6548 c; c = gfc_constructor_next (c))
6551 if (c->iterator == NULL)
6552 tmp = f (c->expr, kind);
6555 g = gfc_convert_constant (c->expr, type, kind);
6556 if (g == &gfc_bad_expr)
6558 gfc_free_expr (result);
6566 gfc_free_expr (result);
6570 gfc_constructor_append_expr (&result->value.constructor,
6584 /* Function for converting character constants. */
6586 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
6591 if (!gfc_is_constant_expr (e))
6594 if (e->expr_type == EXPR_CONSTANT)
6596 /* Simple case of a scalar. */
6597 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
6599 return &gfc_bad_expr;
6601 result->value.character.length = e->value.character.length;
6602 result->value.character.string
6603 = gfc_get_wide_string (e->value.character.length + 1);
6604 memcpy (result->value.character.string, e->value.character.string,
6605 (e->value.character.length + 1) * sizeof (gfc_char_t));
6607 /* Check we only have values representable in the destination kind. */
6608 for (i = 0; i < result->value.character.length; i++)
6609 if (!gfc_check_character_range (result->value.character.string[i],
6612 gfc_error ("Character '%s' in string at %L cannot be converted "
6613 "into character kind %d",
6614 gfc_print_wide_char (result->value.character.string[i]),
6616 return &gfc_bad_expr;
6621 else if (e->expr_type == EXPR_ARRAY)
6623 /* For an array constructor, we convert each constructor element. */
6626 result = gfc_get_array_expr (type, kind, &e->where);
6627 result->shape = gfc_copy_shape (e->shape, e->rank);
6628 result->rank = e->rank;
6629 result->ts.u.cl = e->ts.u.cl;
6631 for (c = gfc_constructor_first (e->value.constructor);
6632 c; c = gfc_constructor_next (c))
6634 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
6635 if (tmp == &gfc_bad_expr)
6637 gfc_free_expr (result);
6638 return &gfc_bad_expr;
6643 gfc_free_expr (result);
6647 gfc_constructor_append_expr (&result->value.constructor,
6659 gfc_simplify_compiler_options (void)
6664 str = gfc_get_option_string ();
6665 result = gfc_get_character_expr (gfc_default_character_kind,
6666 &gfc_current_locus, str, strlen (str));
6673 gfc_simplify_compiler_version (void)
6678 len = strlen ("GCC version ") + strlen (version_string);
6679 buffer = XALLOCAVEC (char, len + 1);
6680 snprintf (buffer, len + 1, "GCC version %s", version_string);
6681 return gfc_get_character_expr (gfc_default_character_kind,
6682 &gfc_current_locus, buffer, len);