1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010 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"
32 gfc_expr gfc_bad_expr;
35 /* Note that 'simplification' is not just transforming expressions.
36 For functions that are not simplified at compile time, range
37 checking is done if possible.
39 The return convention is that each simplification function returns:
41 A new expression node corresponding to the simplified arguments.
42 The original arguments are destroyed by the caller, and must not
43 be a part of the new expression.
45 NULL pointer indicating that no simplification was possible and
46 the original expression should remain intact.
48 An expression pointer to gfc_bad_expr (a static placeholder)
49 indicating that some error has prevented simplification. The
50 error is generated within the function and should be propagated
53 By the time a simplification function gets control, it has been
54 decided that the function call is really supposed to be the
55 intrinsic. No type checking is strictly necessary, since only
56 valid types will be passed on. On the other hand, a simplification
57 subroutine may have to look at the type of an argument as part of
60 Array arguments are only passed to these subroutines that implement
61 the simplification of transformational intrinsics.
63 The functions in this file don't have much comment with them, but
64 everything is reasonably straight-forward. The Standard, chapter 13
65 is the best comment you'll find for this file anyway. */
67 /* Range checks an expression node. If all goes well, returns the
68 node, otherwise returns &gfc_bad_expr and frees the node. */
71 range_check (gfc_expr *result, const char *name)
76 if (result->expr_type != EXPR_CONSTANT)
79 switch (gfc_range_check (result))
85 gfc_error ("Result of %s overflows its kind at %L", name,
90 gfc_error ("Result of %s underflows its kind at %L", name,
95 gfc_error ("Result of %s is NaN at %L", name, &result->where);
99 gfc_error ("Result of %s gives range error for its kind at %L", name,
104 gfc_free_expr (result);
105 return &gfc_bad_expr;
109 /* A helper function that gets an optional and possibly missing
110 kind parameter. Returns the kind, -1 if something went wrong. */
113 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
120 if (k->expr_type != EXPR_CONSTANT)
122 gfc_error ("KIND parameter of %s at %L must be an initialization "
123 "expression", name, &k->where);
127 if (gfc_extract_int (k, &kind) != NULL
128 || gfc_validate_kind (type, kind, true) < 0)
130 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
138 /* Converts an mpz_t signed variable into an unsigned one, assuming
139 two's complement representations and a binary width of bitsize.
140 The conversion is a no-op unless x is negative; otherwise, it can
141 be accomplished by masking out the high bits. */
144 convert_mpz_to_unsigned (mpz_t x, int bitsize)
150 /* Confirm that no bits above the signed range are unset. */
151 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
153 mpz_init_set_ui (mask, 1);
154 mpz_mul_2exp (mask, mask, bitsize);
155 mpz_sub_ui (mask, mask, 1);
157 mpz_and (x, x, mask);
163 /* Confirm that no bits above the signed range are set. */
164 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
169 /* Converts an mpz_t unsigned variable into a signed one, assuming
170 two's complement representations and a binary width of bitsize.
171 If the bitsize-1 bit is set, this is taken as a sign bit and
172 the number is converted to the corresponding negative number. */
175 convert_mpz_to_signed (mpz_t x, int bitsize)
179 /* Confirm that no bits above the unsigned range are set. */
180 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
182 if (mpz_tstbit (x, bitsize - 1) == 1)
184 mpz_init_set_ui (mask, 1);
185 mpz_mul_2exp (mask, mask, bitsize);
186 mpz_sub_ui (mask, mask, 1);
188 /* We negate the number by hand, zeroing the high bits, that is
189 make it the corresponding positive number, and then have it
190 negated by GMP, giving the correct representation of the
193 mpz_add_ui (x, x, 1);
194 mpz_and (x, x, mask);
203 /* In-place convert BOZ to REAL of the specified kind. */
206 convert_boz (gfc_expr *x, int kind)
208 if (x && x->ts.type == BT_INTEGER && x->is_boz)
215 if (!gfc_convert_boz (x, &ts))
216 return &gfc_bad_expr;
223 /* Test that the expression is an constant array. */
226 is_constant_array_expr (gfc_expr *e)
233 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
236 for (c = gfc_constructor_first (e->value.constructor);
237 c; c = gfc_constructor_next (c))
238 if (c->expr->expr_type != EXPR_CONSTANT)
245 /* Initialize a transformational result expression with a given value. */
248 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
250 if (e && e->expr_type == EXPR_ARRAY)
252 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
255 init_result_expr (ctor->expr, init, array);
256 ctor = gfc_constructor_next (ctor);
259 else if (e && e->expr_type == EXPR_CONSTANT)
261 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
268 e->value.logical = (init ? 1 : 0);
273 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
274 else if (init == INT_MAX)
275 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
277 mpz_set_si (e->value.integer, init);
283 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
284 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
286 else if (init == INT_MAX)
287 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
289 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
293 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
299 gfc_expr *len = gfc_simplify_len (array, NULL);
300 gfc_extract_int (len, &length);
301 string = gfc_get_wide_string (length + 1);
302 gfc_wide_memset (string, 0, length);
304 else if (init == INT_MAX)
306 gfc_expr *len = gfc_simplify_len (array, NULL);
307 gfc_extract_int (len, &length);
308 string = gfc_get_wide_string (length + 1);
309 gfc_wide_memset (string, 255, length);
314 string = gfc_get_wide_string (1);
317 string[length] = '\0';
318 e->value.character.length = length;
319 e->value.character.string = string;
331 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul. */
334 compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
335 gfc_expr *matrix_b, int stride_b, int offset_b)
337 gfc_expr *result, *a, *b;
339 result = gfc_get_constant_expr (matrix_a->ts.type, matrix_a->ts.kind,
341 init_result_expr (result, 0, NULL);
343 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
344 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
347 /* Copying of expressions is required as operands are free'd
348 by the gfc_arith routines. */
349 switch (result->ts.type)
352 result = gfc_or (result,
353 gfc_and (gfc_copy_expr (a),
360 result = gfc_add (result,
361 gfc_multiply (gfc_copy_expr (a),
369 offset_a += stride_a;
370 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
372 offset_b += stride_b;
373 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
380 /* Build a result expression for transformational intrinsics,
384 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
385 int kind, locus* where)
390 if (!dim || array->rank == 1)
391 return gfc_get_constant_expr (type, kind, where);
393 result = gfc_get_array_expr (type, kind, where);
394 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
395 result->rank = array->rank - 1;
397 /* gfc_array_size() would count the number of elements in the constructor,
398 we have not built those yet. */
400 for (i = 0; i < result->rank; ++i)
401 nelem *= mpz_get_ui (result->shape[i]);
403 for (i = 0; i < nelem; ++i)
405 gfc_constructor_append_expr (&result->value.constructor,
406 gfc_get_constant_expr (type, kind, where),
414 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
416 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
417 of COUNT intrinsic is .TRUE..
419 Interface and implimentation mimics arith functions as
420 gfc_add, gfc_multiply, etc. */
422 static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
426 gcc_assert (op1->ts.type == BT_INTEGER);
427 gcc_assert (op2->ts.type == BT_LOGICAL);
428 gcc_assert (op2->value.logical);
430 result = gfc_copy_expr (op1);
431 mpz_add_ui (result->value.integer, result->value.integer, 1);
439 /* Transforms an ARRAY with operation OP, according to MASK, to a
440 scalar RESULT. E.g. called if
442 REAL, PARAMETER :: array(n, m) = ...
443 REAL, PARAMETER :: s = SUM(array)
445 where OP == gfc_add(). */
448 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
449 transformational_op op)
452 gfc_constructor *array_ctor, *mask_ctor;
454 /* Shortcut for constant .FALSE. MASK. */
456 && mask->expr_type == EXPR_CONSTANT
457 && !mask->value.logical)
460 array_ctor = gfc_constructor_first (array->value.constructor);
462 if (mask && mask->expr_type == EXPR_ARRAY)
463 mask_ctor = gfc_constructor_first (mask->value.constructor);
467 a = array_ctor->expr;
468 array_ctor = gfc_constructor_next (array_ctor);
470 /* A constant MASK equals .TRUE. here and can be ignored. */
474 mask_ctor = gfc_constructor_next (mask_ctor);
475 if (!m->value.logical)
479 result = op (result, gfc_copy_expr (a));
485 /* Transforms an ARRAY with operation OP, according to MASK, to an
486 array RESULT. E.g. called if
488 REAL, PARAMETER :: array(n, m) = ...
489 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
491 where OP == gfc_multiply(). */
494 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
495 gfc_expr *mask, transformational_op op)
498 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
499 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
500 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
502 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
503 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
504 tmpstride[GFC_MAX_DIMENSIONS];
506 /* Shortcut for constant .FALSE. MASK. */
508 && mask->expr_type == EXPR_CONSTANT
509 && !mask->value.logical)
512 /* Build an indexed table for array element expressions to minimize
513 linked-list traversal. Masked elements are set to NULL. */
514 gfc_array_size (array, &size);
515 arraysize = mpz_get_ui (size);
517 arrayvec = (gfc_expr**) gfc_getmem (sizeof (gfc_expr*) * arraysize);
519 array_ctor = gfc_constructor_first (array->value.constructor);
521 if (mask && mask->expr_type == EXPR_ARRAY)
522 mask_ctor = gfc_constructor_first (mask->value.constructor);
524 for (i = 0; i < arraysize; ++i)
526 arrayvec[i] = array_ctor->expr;
527 array_ctor = gfc_constructor_next (array_ctor);
531 if (!mask_ctor->expr->value.logical)
534 mask_ctor = gfc_constructor_next (mask_ctor);
538 /* Same for the result expression. */
539 gfc_array_size (result, &size);
540 resultsize = mpz_get_ui (size);
543 resultvec = (gfc_expr**) gfc_getmem (sizeof (gfc_expr*) * resultsize);
544 result_ctor = gfc_constructor_first (result->value.constructor);
545 for (i = 0; i < resultsize; ++i)
547 resultvec[i] = result_ctor->expr;
548 result_ctor = gfc_constructor_next (result_ctor);
551 gfc_extract_int (dim, &dim_index);
552 dim_index -= 1; /* zero-base index */
556 for (i = 0, n = 0; i < array->rank; ++i)
559 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
562 dim_extent = mpz_get_si (array->shape[i]);
563 dim_stride = tmpstride[i];
567 extent[n] = mpz_get_si (array->shape[i]);
568 sstride[n] = tmpstride[i];
569 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
578 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
580 *dest = op (*dest, gfc_copy_expr (*src));
587 while (!done && count[n] == extent[n])
590 base -= sstride[n] * extent[n];
591 dest -= dstride[n] * extent[n];
594 if (n < result->rank)
605 /* Place updated expression in result constructor. */
606 result_ctor = gfc_constructor_first (result->value.constructor);
607 for (i = 0; i < resultsize; ++i)
609 result_ctor->expr = resultvec[i];
610 result_ctor = gfc_constructor_next (result_ctor);
614 gfc_free (resultvec);
620 /********************** Simplification functions *****************************/
623 gfc_simplify_abs (gfc_expr *e)
627 if (e->expr_type != EXPR_CONSTANT)
633 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
634 mpz_abs (result->value.integer, e->value.integer);
635 return range_check (result, "IABS");
638 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
639 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
640 return range_check (result, "ABS");
643 gfc_set_model_kind (e->ts.kind);
644 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
645 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
646 return range_check (result, "CABS");
649 gfc_internal_error ("gfc_simplify_abs(): Bad type");
655 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
659 bool too_large = false;
661 if (e->expr_type != EXPR_CONSTANT)
664 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
666 return &gfc_bad_expr;
668 if (mpz_cmp_si (e->value.integer, 0) < 0)
670 gfc_error ("Argument of %s function at %L is negative", name,
672 return &gfc_bad_expr;
675 if (ascii && gfc_option.warn_surprising
676 && mpz_cmp_si (e->value.integer, 127) > 0)
677 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
680 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
685 mpz_init_set_ui (t, 2);
686 mpz_pow_ui (t, t, 32);
687 mpz_sub_ui (t, t, 1);
688 if (mpz_cmp (e->value.integer, t) > 0)
695 gfc_error ("Argument of %s function at %L is too large for the "
696 "collating sequence of kind %d", name, &e->where, kind);
697 return &gfc_bad_expr;
700 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
701 result->value.character.string[0] = mpz_get_ui (e->value.integer);
708 /* We use the processor's collating sequence, because all
709 systems that gfortran currently works on are ASCII. */
712 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
714 return simplify_achar_char (e, k, "ACHAR", true);
719 gfc_simplify_acos (gfc_expr *x)
723 if (x->expr_type != EXPR_CONSTANT)
729 if (mpfr_cmp_si (x->value.real, 1) > 0
730 || mpfr_cmp_si (x->value.real, -1) < 0)
732 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
734 return &gfc_bad_expr;
736 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
737 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
741 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
742 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
746 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
749 return range_check (result, "ACOS");
753 gfc_simplify_acosh (gfc_expr *x)
757 if (x->expr_type != EXPR_CONSTANT)
763 if (mpfr_cmp_si (x->value.real, 1) < 0)
765 gfc_error ("Argument of ACOSH at %L must not be less than 1",
767 return &gfc_bad_expr;
770 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
771 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
775 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
776 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
780 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
783 return range_check (result, "ACOSH");
787 gfc_simplify_adjustl (gfc_expr *e)
793 if (e->expr_type != EXPR_CONSTANT)
796 len = e->value.character.length;
798 for (count = 0, i = 0; i < len; ++i)
800 ch = e->value.character.string[i];
806 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
807 for (i = 0; i < len - count; ++i)
808 result->value.character.string[i] = e->value.character.string[count + i];
815 gfc_simplify_adjustr (gfc_expr *e)
821 if (e->expr_type != EXPR_CONSTANT)
824 len = e->value.character.length;
826 for (count = 0, i = len - 1; i >= 0; --i)
828 ch = e->value.character.string[i];
834 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
835 for (i = 0; i < count; ++i)
836 result->value.character.string[i] = ' ';
838 for (i = count; i < len; ++i)
839 result->value.character.string[i] = e->value.character.string[i - count];
846 gfc_simplify_aimag (gfc_expr *e)
850 if (e->expr_type != EXPR_CONSTANT)
853 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
854 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
856 return range_check (result, "AIMAG");
861 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
863 gfc_expr *rtrunc, *result;
866 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
868 return &gfc_bad_expr;
870 if (e->expr_type != EXPR_CONSTANT)
873 rtrunc = gfc_copy_expr (e);
874 mpfr_trunc (rtrunc->value.real, e->value.real);
876 result = gfc_real2real (rtrunc, kind);
878 gfc_free_expr (rtrunc);
880 return range_check (result, "AINT");
885 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
889 if (!is_constant_array_expr (mask)
890 || !gfc_is_constant_expr (dim))
893 result = transformational_result (mask, dim, mask->ts.type,
894 mask->ts.kind, &mask->where);
895 init_result_expr (result, true, NULL);
897 return !dim || mask->rank == 1 ?
898 simplify_transformation_to_scalar (result, mask, NULL, gfc_and) :
899 simplify_transformation_to_array (result, mask, dim, NULL, gfc_and);
904 gfc_simplify_dint (gfc_expr *e)
906 gfc_expr *rtrunc, *result;
908 if (e->expr_type != EXPR_CONSTANT)
911 rtrunc = gfc_copy_expr (e);
912 mpfr_trunc (rtrunc->value.real, e->value.real);
914 result = gfc_real2real (rtrunc, gfc_default_double_kind);
916 gfc_free_expr (rtrunc);
918 return range_check (result, "DINT");
923 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
928 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
930 return &gfc_bad_expr;
932 if (e->expr_type != EXPR_CONSTANT)
935 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
936 mpfr_round (result->value.real, e->value.real);
938 return range_check (result, "ANINT");
943 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
948 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
951 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
956 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
957 mpz_and (result->value.integer, x->value.integer, y->value.integer);
958 return range_check (result, "AND");
961 return gfc_get_logical_expr (kind, &x->where,
962 x->value.logical && y->value.logical);
971 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
975 if (!is_constant_array_expr (mask)
976 || !gfc_is_constant_expr (dim))
979 result = transformational_result (mask, dim, mask->ts.type,
980 mask->ts.kind, &mask->where);
981 init_result_expr (result, false, NULL);
983 return !dim || mask->rank == 1 ?
984 simplify_transformation_to_scalar (result, mask, NULL, gfc_or) :
985 simplify_transformation_to_array (result, mask, dim, NULL, gfc_or);
990 gfc_simplify_dnint (gfc_expr *e)
994 if (e->expr_type != EXPR_CONSTANT)
997 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
998 mpfr_round (result->value.real, e->value.real);
1000 return range_check (result, "DNINT");
1005 gfc_simplify_asin (gfc_expr *x)
1009 if (x->expr_type != EXPR_CONSTANT)
1015 if (mpfr_cmp_si (x->value.real, 1) > 0
1016 || mpfr_cmp_si (x->value.real, -1) < 0)
1018 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1020 return &gfc_bad_expr;
1022 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1023 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1027 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1028 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1032 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1035 return range_check (result, "ASIN");
1040 gfc_simplify_asinh (gfc_expr *x)
1044 if (x->expr_type != EXPR_CONSTANT)
1047 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1052 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1056 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1060 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1063 return range_check (result, "ASINH");
1068 gfc_simplify_atan (gfc_expr *x)
1072 if (x->expr_type != EXPR_CONSTANT)
1075 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1080 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1084 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1088 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1091 return range_check (result, "ATAN");
1096 gfc_simplify_atanh (gfc_expr *x)
1100 if (x->expr_type != EXPR_CONSTANT)
1106 if (mpfr_cmp_si (x->value.real, 1) >= 0
1107 || mpfr_cmp_si (x->value.real, -1) <= 0)
1109 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1111 return &gfc_bad_expr;
1113 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1114 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1118 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1119 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1123 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1126 return range_check (result, "ATANH");
1131 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1135 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1138 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
1140 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1141 "second argument must not be zero", &x->where);
1142 return &gfc_bad_expr;
1145 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1146 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1148 return range_check (result, "ATAN2");
1153 gfc_simplify_bessel_j0 (gfc_expr *x)
1157 if (x->expr_type != EXPR_CONSTANT)
1160 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1161 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1163 return range_check (result, "BESSEL_J0");
1168 gfc_simplify_bessel_j1 (gfc_expr *x)
1172 if (x->expr_type != EXPR_CONSTANT)
1175 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1176 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1178 return range_check (result, "BESSEL_J1");
1183 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1188 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1191 n = mpz_get_si (order->value.integer);
1192 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1193 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1195 return range_check (result, "BESSEL_JN");
1199 /* Simplify transformational form of JN and YN. */
1202 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1209 mpfr_t x2rev, last1, last2;
1211 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1212 || order2->expr_type != EXPR_CONSTANT)
1214 gfc_error ("Sorry, non-constant transformational Bessel function at %L"
1215 " not yet supported", &order2->where);
1216 return &gfc_bad_expr;
1219 n1 = mpz_get_si (order1->value.integer);
1220 n2 = mpz_get_si (order2->value.integer);
1221 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1223 result->shape = gfc_get_shape (1);
1224 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1229 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1230 YN(N, 0.0) = -Inf. */
1232 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1234 if (!jn && gfc_option.flag_range_check)
1236 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1237 gfc_free_expr (result);
1238 return &gfc_bad_expr;
1243 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1244 mpfr_set_ui (e->value.real, 1.0, GFC_RND_MODE);
1245 gfc_constructor_append_expr (&result->value.constructor, e,
1250 for (i = n1; i <= n2; i++)
1252 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1254 mpfr_set_ui (e->value.real, 0.0, GFC_RND_MODE);
1256 mpfr_set_inf (e->value.real, -1);
1257 gfc_constructor_append_expr (&result->value.constructor, e,
1264 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1265 are stable for downward recursion and Neumann functions are stable
1266 for upward recursion. It is
1268 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1269 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1270 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1272 gfc_set_model_kind (x->ts.kind);
1274 /* Get first recursion anchor. */
1278 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1280 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1282 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1283 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1284 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1288 gfc_free_expr (result);
1289 return &gfc_bad_expr;
1291 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1299 /* Get second recursion anchor. */
1303 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1305 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1307 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1308 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1309 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1314 gfc_free_expr (result);
1315 return &gfc_bad_expr;
1318 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1320 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1329 /* Start actual recursion. */
1332 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1334 for (i = 2; i <= n2-n1; i++)
1336 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1337 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1339 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1340 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1342 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1346 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1349 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1351 mpfr_set (last1, last2, GFC_RND_MODE);
1352 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1365 gfc_free_expr (result);
1366 return &gfc_bad_expr;
1371 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1373 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1378 gfc_simplify_bessel_y0 (gfc_expr *x)
1382 if (x->expr_type != EXPR_CONSTANT)
1385 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1386 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1388 return range_check (result, "BESSEL_Y0");
1393 gfc_simplify_bessel_y1 (gfc_expr *x)
1397 if (x->expr_type != EXPR_CONSTANT)
1400 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1401 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1403 return range_check (result, "BESSEL_Y1");
1408 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1413 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1416 n = mpz_get_si (order->value.integer);
1417 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1418 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1420 return range_check (result, "BESSEL_YN");
1425 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1427 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1432 gfc_simplify_bit_size (gfc_expr *e)
1434 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1435 return gfc_get_int_expr (e->ts.kind, &e->where,
1436 gfc_integer_kinds[i].bit_size);
1441 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1445 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1448 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1449 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1451 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1452 mpz_tstbit (e->value.integer, b));
1457 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1459 gfc_expr *ceil, *result;
1462 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1464 return &gfc_bad_expr;
1466 if (e->expr_type != EXPR_CONSTANT)
1469 ceil = gfc_copy_expr (e);
1470 mpfr_ceil (ceil->value.real, e->value.real);
1472 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1473 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1475 gfc_free_expr (ceil);
1477 return range_check (result, "CEILING");
1482 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1484 return simplify_achar_char (e, k, "CHAR", false);
1488 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1491 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1495 if (convert_boz (x, kind) == &gfc_bad_expr)
1496 return &gfc_bad_expr;
1498 if (convert_boz (y, kind) == &gfc_bad_expr)
1499 return &gfc_bad_expr;
1501 if (x->expr_type != EXPR_CONSTANT
1502 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1505 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1510 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1514 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1518 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1522 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1526 return range_check (result, name);
1531 mpfr_set_z (mpc_imagref (result->value.complex),
1532 y->value.integer, GFC_RND_MODE);
1536 mpfr_set (mpc_imagref (result->value.complex),
1537 y->value.real, GFC_RND_MODE);
1541 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1544 return range_check (result, name);
1549 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1553 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1555 return &gfc_bad_expr;
1557 return simplify_cmplx ("CMPLX", x, y, kind);
1562 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1566 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1567 kind = gfc_default_complex_kind;
1568 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1570 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1572 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1573 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1577 return simplify_cmplx ("COMPLEX", x, y, kind);
1582 gfc_simplify_conjg (gfc_expr *e)
1586 if (e->expr_type != EXPR_CONSTANT)
1589 result = gfc_copy_expr (e);
1590 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1592 return range_check (result, "CONJG");
1597 gfc_simplify_cos (gfc_expr *x)
1601 if (x->expr_type != EXPR_CONSTANT)
1604 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1609 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1613 gfc_set_model_kind (x->ts.kind);
1614 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1618 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1621 return range_check (result, "COS");
1626 gfc_simplify_cosh (gfc_expr *x)
1630 if (x->expr_type != EXPR_CONSTANT)
1633 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1638 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1642 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1649 return range_check (result, "COSH");
1654 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1658 if (!is_constant_array_expr (mask)
1659 || !gfc_is_constant_expr (dim)
1660 || !gfc_is_constant_expr (kind))
1663 result = transformational_result (mask, dim,
1665 get_kind (BT_INTEGER, kind, "COUNT",
1666 gfc_default_integer_kind),
1669 init_result_expr (result, 0, NULL);
1671 /* Passing MASK twice, once as data array, once as mask.
1672 Whenever gfc_count is called, '1' is added to the result. */
1673 return !dim || mask->rank == 1 ?
1674 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1675 simplify_transformation_to_array (result, mask, dim, mask, gfc_count);
1680 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
1682 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
1687 gfc_simplify_dble (gfc_expr *e)
1689 gfc_expr *result = NULL;
1691 if (e->expr_type != EXPR_CONSTANT)
1694 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
1695 return &gfc_bad_expr;
1697 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
1698 if (result == &gfc_bad_expr)
1699 return &gfc_bad_expr;
1701 return range_check (result, "DBLE");
1706 gfc_simplify_digits (gfc_expr *x)
1710 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1715 digits = gfc_integer_kinds[i].digits;
1720 digits = gfc_real_kinds[i].digits;
1727 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
1732 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1737 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1740 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1741 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
1746 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1747 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1749 mpz_set_ui (result->value.integer, 0);
1754 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1755 mpfr_sub (result->value.real, x->value.real, y->value.real,
1758 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1763 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1766 return range_check (result, "DIM");
1771 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
1773 if (!is_constant_array_expr (vector_a)
1774 || !is_constant_array_expr (vector_b))
1777 gcc_assert (vector_a->rank == 1);
1778 gcc_assert (vector_b->rank == 1);
1779 gcc_assert (gfc_compare_types (&vector_a->ts, &vector_b->ts));
1781 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0);
1786 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1788 gfc_expr *a1, *a2, *result;
1790 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1793 a1 = gfc_real2real (x, gfc_default_double_kind);
1794 a2 = gfc_real2real (y, gfc_default_double_kind);
1796 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
1797 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1802 return range_check (result, "DPROD");
1807 gfc_simplify_erf (gfc_expr *x)
1811 if (x->expr_type != EXPR_CONSTANT)
1814 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1815 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1817 return range_check (result, "ERF");
1822 gfc_simplify_erfc (gfc_expr *x)
1826 if (x->expr_type != EXPR_CONSTANT)
1829 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1830 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1832 return range_check (result, "ERFC");
1836 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
1838 #define MAX_ITER 200
1839 #define ARG_LIMIT 12
1841 /* Calculate ERFC_SCALED directly by its definition:
1843 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
1845 using a large precision for intermediate results. This is used for all
1846 but large values of the argument. */
1848 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
1853 prec = mpfr_get_default_prec ();
1854 mpfr_set_default_prec (10 * prec);
1859 mpfr_set (a, arg, GFC_RND_MODE);
1860 mpfr_sqr (b, a, GFC_RND_MODE);
1861 mpfr_exp (b, b, GFC_RND_MODE);
1862 mpfr_erfc (a, a, GFC_RND_MODE);
1863 mpfr_mul (a, a, b, GFC_RND_MODE);
1865 mpfr_set (res, a, GFC_RND_MODE);
1866 mpfr_set_default_prec (prec);
1872 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
1874 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
1875 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
1878 This is used for large values of the argument. Intermediate calculations
1879 are performed with twice the precision. We don't do a fixed number of
1880 iterations of the sum, but stop when it has converged to the required
1883 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
1885 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
1890 prec = mpfr_get_default_prec ();
1891 mpfr_set_default_prec (2 * prec);
1901 mpfr_init (sumtrunc);
1902 mpfr_set_prec (oldsum, prec);
1903 mpfr_set_prec (sumtrunc, prec);
1905 mpfr_set (x, arg, GFC_RND_MODE);
1906 mpfr_set_ui (sum, 1, GFC_RND_MODE);
1907 mpz_set_ui (num, 1);
1909 mpfr_set (u, x, GFC_RND_MODE);
1910 mpfr_sqr (u, u, GFC_RND_MODE);
1911 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
1912 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
1914 for (i = 1; i < MAX_ITER; i++)
1916 mpfr_set (oldsum, sum, GFC_RND_MODE);
1918 mpz_mul_ui (num, num, 2 * i - 1);
1921 mpfr_set (w, u, GFC_RND_MODE);
1922 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
1924 mpfr_set_z (v, num, GFC_RND_MODE);
1925 mpfr_mul (v, v, w, GFC_RND_MODE);
1927 mpfr_add (sum, sum, v, GFC_RND_MODE);
1929 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
1930 if (mpfr_cmp (sumtrunc, oldsum) == 0)
1934 /* We should have converged by now; otherwise, ARG_LIMIT is probably
1936 gcc_assert (i < MAX_ITER);
1938 /* Divide by x * sqrt(Pi). */
1939 mpfr_const_pi (u, GFC_RND_MODE);
1940 mpfr_sqrt (u, u, GFC_RND_MODE);
1941 mpfr_mul (u, u, x, GFC_RND_MODE);
1942 mpfr_div (sum, sum, u, GFC_RND_MODE);
1944 mpfr_set (res, sum, GFC_RND_MODE);
1945 mpfr_set_default_prec (prec);
1947 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
1953 gfc_simplify_erfc_scaled (gfc_expr *x)
1957 if (x->expr_type != EXPR_CONSTANT)
1960 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1961 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
1962 asympt_erfc_scaled (result->value.real, x->value.real);
1964 fullprec_erfc_scaled (result->value.real, x->value.real);
1966 return range_check (result, "ERFC_SCALED");
1974 gfc_simplify_epsilon (gfc_expr *e)
1979 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1981 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
1982 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
1984 return range_check (result, "EPSILON");
1989 gfc_simplify_exp (gfc_expr *x)
1993 if (x->expr_type != EXPR_CONSTANT)
1996 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2001 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2005 gfc_set_model_kind (x->ts.kind);
2006 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2010 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2013 return range_check (result, "EXP");
2018 gfc_simplify_exponent (gfc_expr *x)
2023 if (x->expr_type != EXPR_CONSTANT)
2026 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2029 gfc_set_model (x->value.real);
2031 if (mpfr_sgn (x->value.real) == 0)
2033 mpz_set_ui (result->value.integer, 0);
2037 i = (int) mpfr_get_exp (x->value.real);
2038 mpz_set_si (result->value.integer, i);
2040 return range_check (result, "EXPONENT");
2045 gfc_simplify_float (gfc_expr *a)
2049 if (a->expr_type != EXPR_CONSTANT)
2054 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2055 return &gfc_bad_expr;
2057 result = gfc_copy_expr (a);
2060 result = gfc_int2real (a, gfc_default_real_kind);
2062 return range_check (result, "FLOAT");
2067 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
2073 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
2075 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2077 if (e->expr_type != EXPR_CONSTANT)
2080 gfc_set_model_kind (kind);
2083 mpfr_floor (floor, e->value.real);
2085 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
2086 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2090 return range_check (result, "FLOOR");
2095 gfc_simplify_fraction (gfc_expr *x)
2098 mpfr_t absv, exp, pow2;
2100 if (x->expr_type != EXPR_CONSTANT)
2103 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
2105 if (mpfr_sgn (x->value.real) == 0)
2107 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2111 gfc_set_model_kind (x->ts.kind);
2116 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2117 mpfr_log2 (exp, absv, GFC_RND_MODE);
2119 mpfr_trunc (exp, exp);
2120 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2122 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2124 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
2126 mpfr_clears (exp, absv, pow2, NULL);
2128 return range_check (result, "FRACTION");
2133 gfc_simplify_gamma (gfc_expr *x)
2137 if (x->expr_type != EXPR_CONSTANT)
2140 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2141 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2143 return range_check (result, "GAMMA");
2148 gfc_simplify_huge (gfc_expr *e)
2153 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2154 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2159 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2163 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2175 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2179 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2182 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2183 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2184 return range_check (result, "HYPOT");
2188 /* We use the processor's collating sequence, because all
2189 systems that gfortran currently works on are ASCII. */
2192 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2198 if (e->expr_type != EXPR_CONSTANT)
2201 if (e->value.character.length != 1)
2203 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2204 return &gfc_bad_expr;
2207 index = e->value.character.string[0];
2209 if (gfc_option.warn_surprising && index > 127)
2210 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2213 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
2215 return &gfc_bad_expr;
2217 result = gfc_get_int_expr (k, &e->where, index);
2219 return range_check (result, "IACHAR");
2224 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2228 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2231 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2232 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2234 return range_check (result, "IAND");
2239 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2244 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2247 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2249 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
2250 return &gfc_bad_expr;
2253 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2255 if (pos >= gfc_integer_kinds[k].bit_size)
2257 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
2259 return &gfc_bad_expr;
2262 result = gfc_copy_expr (x);
2264 convert_mpz_to_unsigned (result->value.integer,
2265 gfc_integer_kinds[k].bit_size);
2267 mpz_clrbit (result->value.integer, pos);
2269 convert_mpz_to_signed (result->value.integer,
2270 gfc_integer_kinds[k].bit_size);
2277 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2284 if (x->expr_type != EXPR_CONSTANT
2285 || y->expr_type != EXPR_CONSTANT
2286 || z->expr_type != EXPR_CONSTANT)
2289 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2291 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
2292 return &gfc_bad_expr;
2295 if (gfc_extract_int (z, &len) != NULL || len < 0)
2297 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
2298 return &gfc_bad_expr;
2301 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2303 bitsize = gfc_integer_kinds[k].bit_size;
2305 if (pos + len > bitsize)
2307 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2308 "bit size at %L", &y->where);
2309 return &gfc_bad_expr;
2312 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2313 convert_mpz_to_unsigned (result->value.integer,
2314 gfc_integer_kinds[k].bit_size);
2316 bits = XCNEWVEC (int, bitsize);
2318 for (i = 0; i < bitsize; i++)
2321 for (i = 0; i < len; i++)
2322 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2324 for (i = 0; i < bitsize; i++)
2327 mpz_clrbit (result->value.integer, i);
2328 else if (bits[i] == 1)
2329 mpz_setbit (result->value.integer, i);
2331 gfc_internal_error ("IBITS: Bad bit");
2336 convert_mpz_to_signed (result->value.integer,
2337 gfc_integer_kinds[k].bit_size);
2344 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2349 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2352 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2354 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
2355 return &gfc_bad_expr;
2358 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2360 if (pos >= gfc_integer_kinds[k].bit_size)
2362 gfc_error ("Second argument of IBSET exceeds bit size at %L",
2364 return &gfc_bad_expr;
2367 result = gfc_copy_expr (x);
2369 convert_mpz_to_unsigned (result->value.integer,
2370 gfc_integer_kinds[k].bit_size);
2372 mpz_setbit (result->value.integer, pos);
2374 convert_mpz_to_signed (result->value.integer,
2375 gfc_integer_kinds[k].bit_size);
2382 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2388 if (e->expr_type != EXPR_CONSTANT)
2391 if (e->value.character.length != 1)
2393 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2394 return &gfc_bad_expr;
2397 index = e->value.character.string[0];
2399 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
2401 return &gfc_bad_expr;
2403 result = gfc_get_int_expr (k, &e->where, index);
2405 return range_check (result, "ICHAR");
2410 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2414 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2417 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2418 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2420 return range_check (result, "IEOR");
2425 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2428 int back, len, lensub;
2429 int i, j, k, count, index = 0, start;
2431 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2432 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2435 if (b != NULL && b->value.logical != 0)
2440 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2442 return &gfc_bad_expr;
2444 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
2446 len = x->value.character.length;
2447 lensub = y->value.character.length;
2451 mpz_set_si (result->value.integer, 0);
2459 mpz_set_si (result->value.integer, 1);
2462 else if (lensub == 1)
2464 for (i = 0; i < len; i++)
2466 for (j = 0; j < lensub; j++)
2468 if (y->value.character.string[j]
2469 == x->value.character.string[i])
2479 for (i = 0; i < len; i++)
2481 for (j = 0; j < lensub; j++)
2483 if (y->value.character.string[j]
2484 == x->value.character.string[i])
2489 for (k = 0; k < lensub; k++)
2491 if (y->value.character.string[k]
2492 == x->value.character.string[k + start])
2496 if (count == lensub)
2511 mpz_set_si (result->value.integer, len + 1);
2514 else if (lensub == 1)
2516 for (i = 0; i < len; i++)
2518 for (j = 0; j < lensub; j++)
2520 if (y->value.character.string[j]
2521 == x->value.character.string[len - i])
2523 index = len - i + 1;
2531 for (i = 0; i < len; i++)
2533 for (j = 0; j < lensub; j++)
2535 if (y->value.character.string[j]
2536 == x->value.character.string[len - i])
2539 if (start <= len - lensub)
2542 for (k = 0; k < lensub; k++)
2543 if (y->value.character.string[k]
2544 == x->value.character.string[k + start])
2547 if (count == lensub)
2564 mpz_set_si (result->value.integer, index);
2565 return range_check (result, "INDEX");
2570 simplify_intconv (gfc_expr *e, int kind, const char *name)
2572 gfc_expr *result = NULL;
2574 if (e->expr_type != EXPR_CONSTANT)
2577 result = gfc_convert_constant (e, BT_INTEGER, kind);
2578 if (result == &gfc_bad_expr)
2579 return &gfc_bad_expr;
2581 return range_check (result, name);
2586 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
2590 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
2592 return &gfc_bad_expr;
2594 return simplify_intconv (e, kind, "INT");
2598 gfc_simplify_int2 (gfc_expr *e)
2600 return simplify_intconv (e, 2, "INT2");
2605 gfc_simplify_int8 (gfc_expr *e)
2607 return simplify_intconv (e, 8, "INT8");
2612 gfc_simplify_long (gfc_expr *e)
2614 return simplify_intconv (e, 4, "LONG");
2619 gfc_simplify_ifix (gfc_expr *e)
2621 gfc_expr *rtrunc, *result;
2623 if (e->expr_type != EXPR_CONSTANT)
2626 rtrunc = gfc_copy_expr (e);
2627 mpfr_trunc (rtrunc->value.real, e->value.real);
2629 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2631 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2633 gfc_free_expr (rtrunc);
2635 return range_check (result, "IFIX");
2640 gfc_simplify_idint (gfc_expr *e)
2642 gfc_expr *rtrunc, *result;
2644 if (e->expr_type != EXPR_CONSTANT)
2647 rtrunc = gfc_copy_expr (e);
2648 mpfr_trunc (rtrunc->value.real, e->value.real);
2650 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2652 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2654 gfc_free_expr (rtrunc);
2656 return range_check (result, "IDINT");
2661 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
2665 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2668 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2669 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2671 return range_check (result, "IOR");
2676 gfc_simplify_is_iostat_end (gfc_expr *x)
2678 if (x->expr_type != EXPR_CONSTANT)
2681 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2682 mpz_cmp_si (x->value.integer,
2683 LIBERROR_END) == 0);
2688 gfc_simplify_is_iostat_eor (gfc_expr *x)
2690 if (x->expr_type != EXPR_CONSTANT)
2693 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2694 mpz_cmp_si (x->value.integer,
2695 LIBERROR_EOR) == 0);
2700 gfc_simplify_isnan (gfc_expr *x)
2702 if (x->expr_type != EXPR_CONSTANT)
2705 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2706 mpfr_nan_p (x->value.real));
2711 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
2714 int shift, ashift, isize, k, *bits, i;
2716 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2719 if (gfc_extract_int (s, &shift) != NULL)
2721 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
2722 return &gfc_bad_expr;
2725 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2727 isize = gfc_integer_kinds[k].bit_size;
2736 gfc_error ("Magnitude of second argument of ISHFT exceeds bit size "
2737 "at %L", &s->where);
2738 return &gfc_bad_expr;
2741 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2745 mpz_set (result->value.integer, e->value.integer);
2746 return range_check (result, "ISHFT");
2749 bits = XCNEWVEC (int, isize);
2751 for (i = 0; i < isize; i++)
2752 bits[i] = mpz_tstbit (e->value.integer, i);
2756 for (i = 0; i < shift; i++)
2757 mpz_clrbit (result->value.integer, i);
2759 for (i = 0; i < isize - shift; i++)
2762 mpz_clrbit (result->value.integer, i + shift);
2764 mpz_setbit (result->value.integer, i + shift);
2769 for (i = isize - 1; i >= isize - ashift; i--)
2770 mpz_clrbit (result->value.integer, i);
2772 for (i = isize - 1; i >= ashift; i--)
2775 mpz_clrbit (result->value.integer, i - ashift);
2777 mpz_setbit (result->value.integer, i - ashift);
2781 convert_mpz_to_signed (result->value.integer, isize);
2789 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
2792 int shift, ashift, isize, ssize, delta, k;
2795 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2798 if (gfc_extract_int (s, &shift) != NULL)
2800 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
2801 return &gfc_bad_expr;
2804 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2805 isize = gfc_integer_kinds[k].bit_size;
2809 if (sz->expr_type != EXPR_CONSTANT)
2812 if (gfc_extract_int (sz, &ssize) != NULL || ssize <= 0)
2814 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
2815 return &gfc_bad_expr;
2820 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
2821 "BIT_SIZE of first argument at %L", &s->where);
2822 return &gfc_bad_expr;
2836 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2837 "third argument at %L", &s->where);
2839 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2840 "BIT_SIZE of first argument at %L", &s->where);
2841 return &gfc_bad_expr;
2844 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2846 mpz_set (result->value.integer, e->value.integer);
2851 convert_mpz_to_unsigned (result->value.integer, isize);
2853 bits = XCNEWVEC (int, ssize);
2855 for (i = 0; i < ssize; i++)
2856 bits[i] = mpz_tstbit (e->value.integer, i);
2858 delta = ssize - ashift;
2862 for (i = 0; i < delta; i++)
2865 mpz_clrbit (result->value.integer, i + shift);
2867 mpz_setbit (result->value.integer, i + shift);
2870 for (i = delta; i < ssize; i++)
2873 mpz_clrbit (result->value.integer, i - delta);
2875 mpz_setbit (result->value.integer, i - delta);
2880 for (i = 0; i < ashift; i++)
2883 mpz_clrbit (result->value.integer, i + delta);
2885 mpz_setbit (result->value.integer, i + delta);
2888 for (i = ashift; i < ssize; i++)
2891 mpz_clrbit (result->value.integer, i + shift);
2893 mpz_setbit (result->value.integer, i + shift);
2897 convert_mpz_to_signed (result->value.integer, isize);
2905 gfc_simplify_kind (gfc_expr *e)
2907 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
2912 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
2913 gfc_array_spec *as, gfc_ref *ref, bool coarray)
2915 gfc_expr *l, *u, *result;
2918 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2919 gfc_default_integer_kind);
2921 return &gfc_bad_expr;
2923 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
2925 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
2926 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
2927 if (!coarray && array->expr_type != EXPR_VARIABLE)
2931 gfc_expr* dim = result;
2932 mpz_set_si (dim->value.integer, d);
2934 result = gfc_simplify_size (array, dim, kind);
2935 gfc_free_expr (dim);
2940 mpz_set_si (result->value.integer, 1);
2945 /* Otherwise, we have a variable expression. */
2946 gcc_assert (array->expr_type == EXPR_VARIABLE);
2949 /* The last dimension of an assumed-size array is special. */
2950 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
2951 || (coarray && d == as->rank + as->corank))
2953 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
2955 gfc_free_expr (result);
2956 return gfc_copy_expr (as->lower[d-1]);
2962 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
2964 /* Then, we need to know the extent of the given dimension. */
2965 if (coarray || ref->u.ar.type == AR_FULL)
2970 if (l->expr_type != EXPR_CONSTANT || u == NULL
2971 || u->expr_type != EXPR_CONSTANT)
2974 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
2978 mpz_set_si (result->value.integer, 0);
2980 mpz_set_si (result->value.integer, 1);
2984 /* Nonzero extent. */
2986 mpz_set (result->value.integer, u->value.integer);
2988 mpz_set (result->value.integer, l->value.integer);
2995 if (gfc_ref_dimen_size (&ref->u.ar, d-1, &result->value.integer, NULL)
3000 mpz_set_si (result->value.integer, (long int) 1);
3004 return range_check (result, upper ? "UBOUND" : "LBOUND");
3007 gfc_free_expr (result);
3013 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3019 if (array->expr_type != EXPR_VARIABLE)
3026 /* Follow any component references. */
3027 as = array->symtree->n.sym->as;
3028 for (ref = array->ref; ref; ref = ref->next)
3033 switch (ref->u.ar.type)
3040 /* We're done because 'as' has already been set in the
3041 previous iteration. */
3058 as = ref->u.c.component->as;
3070 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE))
3075 /* Multi-dimensional bounds. */
3076 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3080 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3081 if (upper && as && as->type == AS_ASSUMED_SIZE)
3083 /* An error message will be emitted in
3084 check_assumed_size_reference (resolve.c). */
3085 return &gfc_bad_expr;
3088 /* Simplify the bounds for each dimension. */
3089 for (d = 0; d < array->rank; d++)
3091 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
3093 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3097 for (j = 0; j < d; j++)
3098 gfc_free_expr (bounds[j]);
3103 /* Allocate the result expression. */
3104 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3105 gfc_default_integer_kind);
3107 return &gfc_bad_expr;
3109 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
3111 /* The result is a rank 1 array; its size is the rank of the first
3112 argument to {L,U}BOUND. */
3114 e->shape = gfc_get_shape (1);
3115 mpz_init_set_ui (e->shape[0], array->rank);
3117 /* Create the constructor for this array. */
3118 for (d = 0; d < array->rank; d++)
3119 gfc_constructor_append_expr (&e->value.constructor,
3120 bounds[d], &e->where);
3126 /* A DIM argument is specified. */
3127 if (dim->expr_type != EXPR_CONSTANT)
3130 d = mpz_get_si (dim->value.integer);
3132 if (d < 1 || d > array->rank
3133 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
3135 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3136 return &gfc_bad_expr;
3139 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3145 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3151 if (array->expr_type != EXPR_VARIABLE)
3154 /* Follow any component references. */
3155 as = array->symtree->n.sym->as;
3156 for (ref = array->ref; ref; ref = ref->next)
3161 switch (ref->u.ar.type)
3164 if (ref->next == NULL)
3166 gcc_assert (ref->u.ar.as->corank > 0
3167 && ref->u.ar.as->rank == 0);
3175 /* We're done because 'as' has already been set in the
3176 previous iteration. */
3193 as = ref->u.c.component->as;
3205 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
3210 /* Multi-dimensional cobounds. */
3211 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3215 /* Simplify the cobounds for each dimension. */
3216 for (d = 0; d < as->corank; d++)
3218 bounds[d] = simplify_bound_dim (array, kind, d + 1 + array->rank,
3219 upper, as, ref, true);
3220 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3224 for (j = 0; j < d; j++)
3225 gfc_free_expr (bounds[j]);
3230 /* Allocate the result expression. */
3231 e = gfc_get_expr ();
3232 e->where = array->where;
3233 e->expr_type = EXPR_ARRAY;
3234 e->ts.type = BT_INTEGER;
3235 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3236 gfc_default_integer_kind);
3240 return &gfc_bad_expr;
3244 /* The result is a rank 1 array; its size is the rank of the first
3245 argument to {L,U}COBOUND. */
3247 e->shape = gfc_get_shape (1);
3248 mpz_init_set_ui (e->shape[0], as->corank);
3250 /* Create the constructor for this array. */
3251 for (d = 0; d < as->corank; d++)
3252 gfc_constructor_append_expr (&e->value.constructor,
3253 bounds[d], &e->where);
3258 /* A DIM argument is specified. */
3259 if (dim->expr_type != EXPR_CONSTANT)
3262 d = mpz_get_si (dim->value.integer);
3264 if (d < 1 || d > as->corank)
3266 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3267 return &gfc_bad_expr;
3270 return simplify_bound_dim (array, kind, d+array->rank, upper, as, ref, true);
3276 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3278 return simplify_bound (array, dim, kind, 0);
3283 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3286 /* return simplify_cobound (array, dim, kind, 0);*/
3288 e = simplify_cobound (array, dim, kind, 0);
3292 gfc_error ("Not yet implemented: LCOBOUND for coarray with non-constant "
3293 "cobounds at %L", &array->where);
3294 return &gfc_bad_expr;
3298 gfc_simplify_leadz (gfc_expr *e)
3300 unsigned long lz, bs;
3303 if (e->expr_type != EXPR_CONSTANT)
3306 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3307 bs = gfc_integer_kinds[i].bit_size;
3308 if (mpz_cmp_si (e->value.integer, 0) == 0)
3310 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3313 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3315 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3320 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3323 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3326 return &gfc_bad_expr;
3328 if (e->expr_type == EXPR_CONSTANT)
3330 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3331 mpz_set_si (result->value.integer, e->value.character.length);
3332 return range_check (result, "LEN");
3334 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3335 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3336 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3338 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3339 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3340 return range_check (result, "LEN");
3348 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3352 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3355 return &gfc_bad_expr;
3357 if (e->expr_type != EXPR_CONSTANT)
3360 len = e->value.character.length;
3361 for (count = 0, i = 1; i <= len; i++)
3362 if (e->value.character.string[len - i] == ' ')
3367 result = gfc_get_int_expr (k, &e->where, len - count);
3368 return range_check (result, "LEN_TRIM");
3372 gfc_simplify_lgamma (gfc_expr *x)
3377 if (x->expr_type != EXPR_CONSTANT)
3380 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3381 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
3383 return range_check (result, "LGAMMA");
3388 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
3390 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3393 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3394 gfc_compare_string (a, b) >= 0);
3399 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
3401 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3404 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3405 gfc_compare_string (a, b) > 0);
3410 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
3412 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3415 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3416 gfc_compare_string (a, b) <= 0);
3421 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
3423 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3426 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3427 gfc_compare_string (a, b) < 0);
3432 gfc_simplify_log (gfc_expr *x)
3436 if (x->expr_type != EXPR_CONSTANT)
3439 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3444 if (mpfr_sgn (x->value.real) <= 0)
3446 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3447 "to zero", &x->where);
3448 gfc_free_expr (result);
3449 return &gfc_bad_expr;
3452 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
3456 if ((mpfr_sgn (mpc_realref (x->value.complex)) == 0)
3457 && (mpfr_sgn (mpc_imagref (x->value.complex)) == 0))
3459 gfc_error ("Complex argument of LOG at %L cannot be zero",
3461 gfc_free_expr (result);
3462 return &gfc_bad_expr;
3465 gfc_set_model_kind (x->ts.kind);
3466 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
3470 gfc_internal_error ("gfc_simplify_log: bad type");
3473 return range_check (result, "LOG");
3478 gfc_simplify_log10 (gfc_expr *x)
3482 if (x->expr_type != EXPR_CONSTANT)
3485 if (mpfr_sgn (x->value.real) <= 0)
3487 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3488 "to zero", &x->where);
3489 return &gfc_bad_expr;
3492 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3493 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
3495 return range_check (result, "LOG10");
3500 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
3504 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
3506 return &gfc_bad_expr;
3508 if (e->expr_type != EXPR_CONSTANT)
3511 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
3516 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
3519 int row, result_rows, col, result_columns;
3520 int stride_a, offset_a, stride_b, offset_b;
3522 if (!is_constant_array_expr (matrix_a)
3523 || !is_constant_array_expr (matrix_b))
3526 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
3527 result = gfc_get_array_expr (matrix_a->ts.type,
3531 if (matrix_a->rank == 1 && matrix_b->rank == 2)
3534 result_columns = mpz_get_si (matrix_b->shape[0]);
3536 stride_b = mpz_get_si (matrix_b->shape[0]);
3539 result->shape = gfc_get_shape (result->rank);
3540 mpz_init_set_si (result->shape[0], result_columns);
3542 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
3544 result_rows = mpz_get_si (matrix_b->shape[0]);
3546 stride_a = mpz_get_si (matrix_a->shape[0]);
3550 result->shape = gfc_get_shape (result->rank);
3551 mpz_init_set_si (result->shape[0], result_rows);
3553 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
3555 result_rows = mpz_get_si (matrix_a->shape[0]);
3556 result_columns = mpz_get_si (matrix_b->shape[1]);
3557 stride_a = mpz_get_si (matrix_a->shape[1]);
3558 stride_b = mpz_get_si (matrix_b->shape[0]);
3561 result->shape = gfc_get_shape (result->rank);
3562 mpz_init_set_si (result->shape[0], result_rows);
3563 mpz_init_set_si (result->shape[1], result_columns);
3568 offset_a = offset_b = 0;
3569 for (col = 0; col < result_columns; ++col)
3573 for (row = 0; row < result_rows; ++row)
3575 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
3576 matrix_b, 1, offset_b);
3577 gfc_constructor_append_expr (&result->value.constructor,
3583 offset_b += stride_b;
3591 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
3593 if (tsource->expr_type != EXPR_CONSTANT
3594 || fsource->expr_type != EXPR_CONSTANT
3595 || mask->expr_type != EXPR_CONSTANT)
3598 return gfc_copy_expr (mask->value.logical ? tsource : fsource);
3602 /* Selects bewteen current value and extremum for simplify_min_max
3603 and simplify_minval_maxval. */
3605 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
3607 switch (arg->ts.type)
3610 if (mpz_cmp (arg->value.integer,
3611 extremum->value.integer) * sign > 0)
3612 mpz_set (extremum->value.integer, arg->value.integer);
3616 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
3618 mpfr_max (extremum->value.real, extremum->value.real,
3619 arg->value.real, GFC_RND_MODE);
3621 mpfr_min (extremum->value.real, extremum->value.real,
3622 arg->value.real, GFC_RND_MODE);
3626 #define LENGTH(x) ((x)->value.character.length)
3627 #define STRING(x) ((x)->value.character.string)
3628 if (LENGTH(extremum) < LENGTH(arg))
3630 gfc_char_t *tmp = STRING(extremum);
3632 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
3633 memcpy (STRING(extremum), tmp,
3634 LENGTH(extremum) * sizeof (gfc_char_t));
3635 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
3636 LENGTH(arg) - LENGTH(extremum));
3637 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
3638 LENGTH(extremum) = LENGTH(arg);
3642 if (gfc_compare_string (arg, extremum) * sign > 0)
3644 gfc_free (STRING(extremum));
3645 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
3646 memcpy (STRING(extremum), STRING(arg),
3647 LENGTH(arg) * sizeof (gfc_char_t));
3648 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
3649 LENGTH(extremum) - LENGTH(arg));
3650 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
3657 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
3662 /* This function is special since MAX() can take any number of
3663 arguments. The simplified expression is a rewritten version of the
3664 argument list containing at most one constant element. Other
3665 constant elements are deleted. Because the argument list has
3666 already been checked, this function always succeeds. sign is 1 for
3667 MAX(), -1 for MIN(). */
3670 simplify_min_max (gfc_expr *expr, int sign)
3672 gfc_actual_arglist *arg, *last, *extremum;
3673 gfc_intrinsic_sym * specific;
3677 specific = expr->value.function.isym;
3679 arg = expr->value.function.actual;
3681 for (; arg; last = arg, arg = arg->next)
3683 if (arg->expr->expr_type != EXPR_CONSTANT)
3686 if (extremum == NULL)
3692 min_max_choose (arg->expr, extremum->expr, sign);
3694 /* Delete the extra constant argument. */
3696 expr->value.function.actual = arg->next;
3698 last->next = arg->next;
3701 gfc_free_actual_arglist (arg);
3705 /* If there is one value left, replace the function call with the
3707 if (expr->value.function.actual->next != NULL)
3710 /* Convert to the correct type and kind. */
3711 if (expr->ts.type != BT_UNKNOWN)
3712 return gfc_convert_constant (expr->value.function.actual->expr,
3713 expr->ts.type, expr->ts.kind);
3715 if (specific->ts.type != BT_UNKNOWN)
3716 return gfc_convert_constant (expr->value.function.actual->expr,
3717 specific->ts.type, specific->ts.kind);
3719 return gfc_copy_expr (expr->value.function.actual->expr);
3724 gfc_simplify_min (gfc_expr *e)
3726 return simplify_min_max (e, -1);
3731 gfc_simplify_max (gfc_expr *e)
3733 return simplify_min_max (e, 1);
3737 /* This is a simplified version of simplify_min_max to provide
3738 simplification of minval and maxval for a vector. */
3741 simplify_minval_maxval (gfc_expr *expr, int sign)
3743 gfc_constructor *c, *extremum;
3744 gfc_intrinsic_sym * specific;
3747 specific = expr->value.function.isym;
3749 for (c = gfc_constructor_first (expr->value.constructor);
3750 c; c = gfc_constructor_next (c))
3752 if (c->expr->expr_type != EXPR_CONSTANT)
3755 if (extremum == NULL)
3761 min_max_choose (c->expr, extremum->expr, sign);
3764 if (extremum == NULL)
3767 /* Convert to the correct type and kind. */
3768 if (expr->ts.type != BT_UNKNOWN)
3769 return gfc_convert_constant (extremum->expr,
3770 expr->ts.type, expr->ts.kind);
3772 if (specific->ts.type != BT_UNKNOWN)
3773 return gfc_convert_constant (extremum->expr,
3774 specific->ts.type, specific->ts.kind);
3776 return gfc_copy_expr (extremum->expr);
3781 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
3783 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
3786 return simplify_minval_maxval (array, -1);
3791 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
3793 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
3796 return simplify_minval_maxval (array, 1);
3801 gfc_simplify_maxexponent (gfc_expr *x)
3803 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3804 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
3805 gfc_real_kinds[i].max_exponent);
3810 gfc_simplify_minexponent (gfc_expr *x)
3812 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3813 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
3814 gfc_real_kinds[i].min_exponent);
3819 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
3825 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
3828 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
3829 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
3834 if (mpz_cmp_ui (p->value.integer, 0) == 0)
3836 /* Result is processor-dependent. */
3837 gfc_error ("Second argument MOD at %L is zero", &a->where);
3838 gfc_free_expr (result);
3839 return &gfc_bad_expr;
3841 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
3845 if (mpfr_cmp_ui (p->value.real, 0) == 0)
3847 /* Result is processor-dependent. */
3848 gfc_error ("Second argument of MOD at %L is zero", &p->where);
3849 gfc_free_expr (result);
3850 return &gfc_bad_expr;
3853 gfc_set_model_kind (kind);
3855 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
3856 mpfr_trunc (tmp, tmp);
3857 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
3858 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
3863 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
3866 return range_check (result, "MOD");
3871 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
3877 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
3880 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
3881 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
3886 if (mpz_cmp_ui (p->value.integer, 0) == 0)
3888 /* Result is processor-dependent. This processor just opts
3889 to not handle it at all. */
3890 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
3891 gfc_free_expr (result);
3892 return &gfc_bad_expr;
3894 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
3899 if (mpfr_cmp_ui (p->value.real, 0) == 0)
3901 /* Result is processor-dependent. */
3902 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
3903 gfc_free_expr (result);
3904 return &gfc_bad_expr;
3907 gfc_set_model_kind (kind);
3909 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
3910 mpfr_floor (tmp, tmp);
3911 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
3912 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
3917 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
3920 return range_check (result, "MODULO");
3924 /* Exists for the sole purpose of consistency with other intrinsics. */
3926 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
3927 gfc_expr *fp ATTRIBUTE_UNUSED,
3928 gfc_expr *l ATTRIBUTE_UNUSED,
3929 gfc_expr *to ATTRIBUTE_UNUSED,
3930 gfc_expr *tp ATTRIBUTE_UNUSED)
3937 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
3940 mp_exp_t emin, emax;
3943 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3946 if (mpfr_sgn (s->value.real) == 0)
3948 gfc_error ("Second argument of NEAREST at %L shall not be zero",
3950 return &gfc_bad_expr;
3953 result = gfc_copy_expr (x);
3955 /* Save current values of emin and emax. */
3956 emin = mpfr_get_emin ();
3957 emax = mpfr_get_emax ();
3959 /* Set emin and emax for the current model number. */
3960 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
3961 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
3962 mpfr_get_prec(result->value.real) + 1);
3963 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
3964 mpfr_check_range (result->value.real, 0, GMP_RNDU);
3966 if (mpfr_sgn (s->value.real) > 0)
3968 mpfr_nextabove (result->value.real);
3969 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
3973 mpfr_nextbelow (result->value.real);
3974 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
3977 mpfr_set_emin (emin);
3978 mpfr_set_emax (emax);
3980 /* Only NaN can occur. Do not use range check as it gives an
3981 error for denormal numbers. */
3982 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
3984 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
3985 gfc_free_expr (result);
3986 return &gfc_bad_expr;
3994 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
3996 gfc_expr *itrunc, *result;
3999 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4001 return &gfc_bad_expr;
4003 if (e->expr_type != EXPR_CONSTANT)
4006 itrunc = gfc_copy_expr (e);
4007 mpfr_round (itrunc->value.real, e->value.real);
4009 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4010 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4012 gfc_free_expr (itrunc);
4014 return range_check (result, name);
4019 gfc_simplify_new_line (gfc_expr *e)
4023 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4024 result->value.character.string[0] = '\n';
4031 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4033 return simplify_nint ("NINT", e, k);
4038 gfc_simplify_idnint (gfc_expr *e)
4040 return simplify_nint ("IDNINT", e, NULL);
4045 gfc_simplify_not (gfc_expr *e)
4049 if (e->expr_type != EXPR_CONSTANT)
4052 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4053 mpz_com (result->value.integer, e->value.integer);
4055 return range_check (result, "NOT");
4060 gfc_simplify_null (gfc_expr *mold)
4066 result = gfc_copy_expr (mold);
4067 result->expr_type = EXPR_NULL;
4070 result = gfc_get_null_expr (NULL);
4077 gfc_simplify_num_images (void)
4081 if (gfc_option.coarray == GFC_FCOARRAY_NONE)
4083 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
4084 return &gfc_bad_expr;
4087 /* FIXME: gfc_current_locus is wrong. */
4088 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4089 &gfc_current_locus);
4090 mpz_set_si (result->value.integer, 1);
4096 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4101 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4104 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4109 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4110 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4111 return range_check (result, "OR");
4114 return gfc_get_logical_expr (kind, &x->where,
4115 x->value.logical || y->value.logical);
4123 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4126 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4128 if (!is_constant_array_expr(array)
4129 || !is_constant_array_expr(vector)
4130 || (!gfc_is_constant_expr (mask)
4131 && !is_constant_array_expr(mask)))
4134 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4136 array_ctor = gfc_constructor_first (array->value.constructor);
4137 vector_ctor = vector
4138 ? gfc_constructor_first (vector->value.constructor)
4141 if (mask->expr_type == EXPR_CONSTANT
4142 && mask->value.logical)
4144 /* Copy all elements of ARRAY to RESULT. */
4147 gfc_constructor_append_expr (&result->value.constructor,
4148 gfc_copy_expr (array_ctor->expr),
4151 array_ctor = gfc_constructor_next (array_ctor);
4152 vector_ctor = gfc_constructor_next (vector_ctor);
4155 else if (mask->expr_type == EXPR_ARRAY)
4157 /* Copy only those elements of ARRAY to RESULT whose
4158 MASK equals .TRUE.. */
4159 mask_ctor = gfc_constructor_first (mask->value.constructor);
4162 if (mask_ctor->expr->value.logical)
4164 gfc_constructor_append_expr (&result->value.constructor,
4165 gfc_copy_expr (array_ctor->expr),
4167 vector_ctor = gfc_constructor_next (vector_ctor);
4170 array_ctor = gfc_constructor_next (array_ctor);
4171 mask_ctor = gfc_constructor_next (mask_ctor);
4175 /* Append any left-over elements from VECTOR to RESULT. */
4178 gfc_constructor_append_expr (&result->value.constructor,
4179 gfc_copy_expr (vector_ctor->expr),
4181 vector_ctor = gfc_constructor_next (vector_ctor);
4184 result->shape = gfc_get_shape (1);
4185 gfc_array_size (result, &result->shape[0]);
4187 if (array->ts.type == BT_CHARACTER)
4188 result->ts.u.cl = array->ts.u.cl;
4195 gfc_simplify_precision (gfc_expr *e)
4197 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4198 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
4199 gfc_real_kinds[i].precision);
4204 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
4208 if (!is_constant_array_expr (array)
4209 || !gfc_is_constant_expr (dim))
4213 && !is_constant_array_expr (mask)
4214 && mask->expr_type != EXPR_CONSTANT)
4217 result = transformational_result (array, dim, array->ts.type,
4218 array->ts.kind, &array->where);
4219 init_result_expr (result, 1, NULL);
4221 return !dim || array->rank == 1 ?
4222 simplify_transformation_to_scalar (result, array, mask, gfc_multiply) :
4223 simplify_transformation_to_array (result, array, dim, mask, gfc_multiply);
4228 gfc_simplify_radix (gfc_expr *e)
4231 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4236 i = gfc_integer_kinds[i].radix;
4240 i = gfc_real_kinds[i].radix;
4247 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4252 gfc_simplify_range (gfc_expr *e)
4255 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4260 i = gfc_integer_kinds[i].range;
4265 i = gfc_real_kinds[i].range;
4272 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4277 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
4279 gfc_expr *result = NULL;
4282 if (e->ts.type == BT_COMPLEX)
4283 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
4285 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
4288 return &gfc_bad_expr;
4290 if (e->expr_type != EXPR_CONSTANT)
4293 if (convert_boz (e, kind) == &gfc_bad_expr)
4294 return &gfc_bad_expr;
4296 result = gfc_convert_constant (e, BT_REAL, kind);
4297 if (result == &gfc_bad_expr)
4298 return &gfc_bad_expr;
4300 return range_check (result, "REAL");
4305 gfc_simplify_realpart (gfc_expr *e)
4309 if (e->expr_type != EXPR_CONSTANT)
4312 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
4313 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
4315 return range_check (result, "REALPART");
4319 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
4322 int i, j, len, ncop, nlen;
4324 bool have_length = false;
4326 /* If NCOPIES isn't a constant, there's nothing we can do. */
4327 if (n->expr_type != EXPR_CONSTANT)
4330 /* If NCOPIES is negative, it's an error. */
4331 if (mpz_sgn (n->value.integer) < 0)
4333 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4335 return &gfc_bad_expr;
4338 /* If we don't know the character length, we can do no more. */
4339 if (e->ts.u.cl && e->ts.u.cl->length
4340 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
4342 len = mpz_get_si (e->ts.u.cl->length->value.integer);
4345 else if (e->expr_type == EXPR_CONSTANT
4346 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
4348 len = e->value.character.length;
4353 /* If the source length is 0, any value of NCOPIES is valid
4354 and everything behaves as if NCOPIES == 0. */
4357 mpz_set_ui (ncopies, 0);
4359 mpz_set (ncopies, n->value.integer);
4361 /* Check that NCOPIES isn't too large. */
4367 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4369 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4373 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
4374 e->ts.u.cl->length->value.integer);
4378 mpz_init_set_si (mlen, len);