* gcc.dg/atomic/c11-atomic-exec-5.c (dg-additional-options): Use
[official-gcc.git] / gcc / fortran / simplify.c
blob60d85934b72d62366710db047d9dcfbb71d7171b
1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2014 Free Software Foundation, Inc.
3 Contributed by Andy Vaught & Katherine Holcomb
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "flags.h"
25 #include "gfortran.h"
26 #include "arith.h"
27 #include "intrinsic.h"
28 #include "target-memory.h"
29 #include "constructor.h"
30 #include "tm.h" /* For BITS_PER_UNIT. */
31 #include "version.h" /* For version_string. */
34 gfc_expr gfc_bad_expr;
36 static gfc_expr *simplify_size (gfc_expr *, gfc_expr *, int);
39 /* Note that 'simplification' is not just transforming expressions.
40 For functions that are not simplified at compile time, range
41 checking is done if possible.
43 The return convention is that each simplification function returns:
45 A new expression node corresponding to the simplified arguments.
46 The original arguments are destroyed by the caller, and must not
47 be a part of the new expression.
49 NULL pointer indicating that no simplification was possible and
50 the original expression should remain intact.
52 An expression pointer to gfc_bad_expr (a static placeholder)
53 indicating that some error has prevented simplification. The
54 error is generated within the function and should be propagated
55 upwards
57 By the time a simplification function gets control, it has been
58 decided that the function call is really supposed to be the
59 intrinsic. No type checking is strictly necessary, since only
60 valid types will be passed on. On the other hand, a simplification
61 subroutine may have to look at the type of an argument as part of
62 its processing.
64 Array arguments are only passed to these subroutines that implement
65 the simplification of transformational intrinsics.
67 The functions in this file don't have much comment with them, but
68 everything is reasonably straight-forward. The Standard, chapter 13
69 is the best comment you'll find for this file anyway. */
71 /* Range checks an expression node. If all goes well, returns the
72 node, otherwise returns &gfc_bad_expr and frees the node. */
74 static gfc_expr *
75 range_check (gfc_expr *result, const char *name)
77 if (result == NULL)
78 return &gfc_bad_expr;
80 if (result->expr_type != EXPR_CONSTANT)
81 return result;
83 switch (gfc_range_check (result))
85 case ARITH_OK:
86 return result;
88 case ARITH_OVERFLOW:
89 gfc_error ("Result of %s overflows its kind at %L", name,
90 &result->where);
91 break;
93 case ARITH_UNDERFLOW:
94 gfc_error ("Result of %s underflows its kind at %L", name,
95 &result->where);
96 break;
98 case ARITH_NAN:
99 gfc_error ("Result of %s is NaN at %L", name, &result->where);
100 break;
102 default:
103 gfc_error ("Result of %s gives range error for its kind at %L", name,
104 &result->where);
105 break;
108 gfc_free_expr (result);
109 return &gfc_bad_expr;
113 /* A helper function that gets an optional and possibly missing
114 kind parameter. Returns the kind, -1 if something went wrong. */
116 static int
117 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
119 int kind;
121 if (k == NULL)
122 return default_kind;
124 if (k->expr_type != EXPR_CONSTANT)
126 gfc_error ("KIND parameter of %s at %L must be an initialization "
127 "expression", name, &k->where);
128 return -1;
131 if (gfc_extract_int (k, &kind) != NULL
132 || gfc_validate_kind (type, kind, true) < 0)
134 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
135 return -1;
138 return kind;
142 /* Converts an mpz_t signed variable into an unsigned one, assuming
143 two's complement representations and a binary width of bitsize.
144 The conversion is a no-op unless x is negative; otherwise, it can
145 be accomplished by masking out the high bits. */
147 static void
148 convert_mpz_to_unsigned (mpz_t x, int bitsize)
150 mpz_t mask;
152 if (mpz_sgn (x) < 0)
154 /* Confirm that no bits above the signed range are unset if we
155 are doing range checking. */
156 if (gfc_option.flag_range_check != 0)
157 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
159 mpz_init_set_ui (mask, 1);
160 mpz_mul_2exp (mask, mask, bitsize);
161 mpz_sub_ui (mask, mask, 1);
163 mpz_and (x, x, mask);
165 mpz_clear (mask);
167 else
169 /* Confirm that no bits above the signed range are set. */
170 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
175 /* Converts an mpz_t unsigned variable into a signed one, assuming
176 two's complement representations and a binary width of bitsize.
177 If the bitsize-1 bit is set, this is taken as a sign bit and
178 the number is converted to the corresponding negative number. */
180 void
181 gfc_convert_mpz_to_signed (mpz_t x, int bitsize)
183 mpz_t mask;
185 /* Confirm that no bits above the unsigned range are set if we are
186 doing range checking. */
187 if (gfc_option.flag_range_check != 0)
188 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
190 if (mpz_tstbit (x, bitsize - 1) == 1)
192 mpz_init_set_ui (mask, 1);
193 mpz_mul_2exp (mask, mask, bitsize);
194 mpz_sub_ui (mask, mask, 1);
196 /* We negate the number by hand, zeroing the high bits, that is
197 make it the corresponding positive number, and then have it
198 negated by GMP, giving the correct representation of the
199 negative number. */
200 mpz_com (x, x);
201 mpz_add_ui (x, x, 1);
202 mpz_and (x, x, mask);
204 mpz_neg (x, x);
206 mpz_clear (mask);
211 /* In-place convert BOZ to REAL of the specified kind. */
213 static gfc_expr *
214 convert_boz (gfc_expr *x, int kind)
216 if (x && x->ts.type == BT_INTEGER && x->is_boz)
218 gfc_typespec ts;
219 gfc_clear_ts (&ts);
220 ts.type = BT_REAL;
221 ts.kind = kind;
223 if (!gfc_convert_boz (x, &ts))
224 return &gfc_bad_expr;
227 return x;
231 /* Test that the expression is an constant array. */
233 static bool
234 is_constant_array_expr (gfc_expr *e)
236 gfc_constructor *c;
238 if (e == NULL)
239 return true;
241 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
242 return false;
244 for (c = gfc_constructor_first (e->value.constructor);
245 c; c = gfc_constructor_next (c))
246 if (c->expr->expr_type != EXPR_CONSTANT
247 && c->expr->expr_type != EXPR_STRUCTURE)
248 return false;
250 return true;
254 /* Initialize a transformational result expression with a given value. */
256 static void
257 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
259 if (e && e->expr_type == EXPR_ARRAY)
261 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
262 while (ctor)
264 init_result_expr (ctor->expr, init, array);
265 ctor = gfc_constructor_next (ctor);
268 else if (e && e->expr_type == EXPR_CONSTANT)
270 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
271 int length;
272 gfc_char_t *string;
274 switch (e->ts.type)
276 case BT_LOGICAL:
277 e->value.logical = (init ? 1 : 0);
278 break;
280 case BT_INTEGER:
281 if (init == INT_MIN)
282 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
283 else if (init == INT_MAX)
284 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
285 else
286 mpz_set_si (e->value.integer, init);
287 break;
289 case BT_REAL:
290 if (init == INT_MIN)
292 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
293 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
295 else if (init == INT_MAX)
296 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
297 else
298 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
299 break;
301 case BT_COMPLEX:
302 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
303 break;
305 case BT_CHARACTER:
306 if (init == INT_MIN)
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, 0, length);
313 else if (init == INT_MAX)
315 gfc_expr *len = gfc_simplify_len (array, NULL);
316 gfc_extract_int (len, &length);
317 string = gfc_get_wide_string (length + 1);
318 gfc_wide_memset (string, 255, length);
320 else
322 length = 0;
323 string = gfc_get_wide_string (1);
326 string[length] = '\0';
327 e->value.character.length = length;
328 e->value.character.string = string;
329 break;
331 default:
332 gcc_unreachable();
335 else
336 gcc_unreachable();
340 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
341 if conj_a is true, the matrix_a is complex conjugated. */
343 static gfc_expr *
344 compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
345 gfc_expr *matrix_b, int stride_b, int offset_b,
346 bool conj_a)
348 gfc_expr *result, *a, *b, *c;
350 result = gfc_get_constant_expr (matrix_a->ts.type, matrix_a->ts.kind,
351 &matrix_a->where);
352 init_result_expr (result, 0, NULL);
354 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
355 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
356 while (a && b)
358 /* Copying of expressions is required as operands are free'd
359 by the gfc_arith routines. */
360 switch (result->ts.type)
362 case BT_LOGICAL:
363 result = gfc_or (result,
364 gfc_and (gfc_copy_expr (a),
365 gfc_copy_expr (b)));
366 break;
368 case BT_INTEGER:
369 case BT_REAL:
370 case BT_COMPLEX:
371 if (conj_a && a->ts.type == BT_COMPLEX)
372 c = gfc_simplify_conjg (a);
373 else
374 c = gfc_copy_expr (a);
375 result = gfc_add (result, gfc_multiply (c, gfc_copy_expr (b)));
376 break;
378 default:
379 gcc_unreachable();
382 offset_a += stride_a;
383 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
385 offset_b += stride_b;
386 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
389 return result;
393 /* Build a result expression for transformational intrinsics,
394 depending on DIM. */
396 static gfc_expr *
397 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
398 int kind, locus* where)
400 gfc_expr *result;
401 int i, nelem;
403 if (!dim || array->rank == 1)
404 return gfc_get_constant_expr (type, kind, where);
406 result = gfc_get_array_expr (type, kind, where);
407 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
408 result->rank = array->rank - 1;
410 /* gfc_array_size() would count the number of elements in the constructor,
411 we have not built those yet. */
412 nelem = 1;
413 for (i = 0; i < result->rank; ++i)
414 nelem *= mpz_get_ui (result->shape[i]);
416 for (i = 0; i < nelem; ++i)
418 gfc_constructor_append_expr (&result->value.constructor,
419 gfc_get_constant_expr (type, kind, where),
420 NULL);
423 return result;
427 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
429 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
430 of COUNT intrinsic is .TRUE..
432 Interface and implementation mimics arith functions as
433 gfc_add, gfc_multiply, etc. */
435 static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
437 gfc_expr *result;
439 gcc_assert (op1->ts.type == BT_INTEGER);
440 gcc_assert (op2->ts.type == BT_LOGICAL);
441 gcc_assert (op2->value.logical);
443 result = gfc_copy_expr (op1);
444 mpz_add_ui (result->value.integer, result->value.integer, 1);
446 gfc_free_expr (op1);
447 gfc_free_expr (op2);
448 return result;
452 /* Transforms an ARRAY with operation OP, according to MASK, to a
453 scalar RESULT. E.g. called if
455 REAL, PARAMETER :: array(n, m) = ...
456 REAL, PARAMETER :: s = SUM(array)
458 where OP == gfc_add(). */
460 static gfc_expr *
461 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
462 transformational_op op)
464 gfc_expr *a, *m;
465 gfc_constructor *array_ctor, *mask_ctor;
467 /* Shortcut for constant .FALSE. MASK. */
468 if (mask
469 && mask->expr_type == EXPR_CONSTANT
470 && !mask->value.logical)
471 return result;
473 array_ctor = gfc_constructor_first (array->value.constructor);
474 mask_ctor = NULL;
475 if (mask && mask->expr_type == EXPR_ARRAY)
476 mask_ctor = gfc_constructor_first (mask->value.constructor);
478 while (array_ctor)
480 a = array_ctor->expr;
481 array_ctor = gfc_constructor_next (array_ctor);
483 /* A constant MASK equals .TRUE. here and can be ignored. */
484 if (mask_ctor)
486 m = mask_ctor->expr;
487 mask_ctor = gfc_constructor_next (mask_ctor);
488 if (!m->value.logical)
489 continue;
492 result = op (result, gfc_copy_expr (a));
495 return result;
498 /* Transforms an ARRAY with operation OP, according to MASK, to an
499 array RESULT. E.g. called if
501 REAL, PARAMETER :: array(n, m) = ...
502 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
504 where OP == gfc_multiply(). The result might be post processed using post_op. */
506 static gfc_expr *
507 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
508 gfc_expr *mask, transformational_op op,
509 transformational_op post_op)
511 mpz_t size;
512 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
513 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
514 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
516 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
517 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
518 tmpstride[GFC_MAX_DIMENSIONS];
520 /* Shortcut for constant .FALSE. MASK. */
521 if (mask
522 && mask->expr_type == EXPR_CONSTANT
523 && !mask->value.logical)
524 return result;
526 /* Build an indexed table for array element expressions to minimize
527 linked-list traversal. Masked elements are set to NULL. */
528 gfc_array_size (array, &size);
529 arraysize = mpz_get_ui (size);
530 mpz_clear (size);
532 arrayvec = XCNEWVEC (gfc_expr*, arraysize);
534 array_ctor = gfc_constructor_first (array->value.constructor);
535 mask_ctor = NULL;
536 if (mask && mask->expr_type == EXPR_ARRAY)
537 mask_ctor = gfc_constructor_first (mask->value.constructor);
539 for (i = 0; i < arraysize; ++i)
541 arrayvec[i] = array_ctor->expr;
542 array_ctor = gfc_constructor_next (array_ctor);
544 if (mask_ctor)
546 if (!mask_ctor->expr->value.logical)
547 arrayvec[i] = NULL;
549 mask_ctor = gfc_constructor_next (mask_ctor);
553 /* Same for the result expression. */
554 gfc_array_size (result, &size);
555 resultsize = mpz_get_ui (size);
556 mpz_clear (size);
558 resultvec = XCNEWVEC (gfc_expr*, resultsize);
559 result_ctor = gfc_constructor_first (result->value.constructor);
560 for (i = 0; i < resultsize; ++i)
562 resultvec[i] = result_ctor->expr;
563 result_ctor = gfc_constructor_next (result_ctor);
566 gfc_extract_int (dim, &dim_index);
567 dim_index -= 1; /* zero-base index */
568 dim_extent = 0;
569 dim_stride = 0;
571 for (i = 0, n = 0; i < array->rank; ++i)
573 count[i] = 0;
574 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
575 if (i == dim_index)
577 dim_extent = mpz_get_si (array->shape[i]);
578 dim_stride = tmpstride[i];
579 continue;
582 extent[n] = mpz_get_si (array->shape[i]);
583 sstride[n] = tmpstride[i];
584 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
585 n += 1;
588 done = false;
589 base = arrayvec;
590 dest = resultvec;
591 while (!done)
593 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
594 if (*src)
595 *dest = op (*dest, gfc_copy_expr (*src));
597 count[0]++;
598 base += sstride[0];
599 dest += dstride[0];
601 n = 0;
602 while (!done && count[n] == extent[n])
604 count[n] = 0;
605 base -= sstride[n] * extent[n];
606 dest -= dstride[n] * extent[n];
608 n++;
609 if (n < result->rank)
611 count [n]++;
612 base += sstride[n];
613 dest += dstride[n];
615 else
616 done = true;
620 /* Place updated expression in result constructor. */
621 result_ctor = gfc_constructor_first (result->value.constructor);
622 for (i = 0; i < resultsize; ++i)
624 if (post_op)
625 result_ctor->expr = post_op (result_ctor->expr, resultvec[i]);
626 else
627 result_ctor->expr = resultvec[i];
628 result_ctor = gfc_constructor_next (result_ctor);
631 free (arrayvec);
632 free (resultvec);
633 return result;
637 static gfc_expr *
638 simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
639 int init_val, transformational_op op)
641 gfc_expr *result;
643 if (!is_constant_array_expr (array)
644 || !gfc_is_constant_expr (dim))
645 return NULL;
647 if (mask
648 && !is_constant_array_expr (mask)
649 && mask->expr_type != EXPR_CONSTANT)
650 return NULL;
652 result = transformational_result (array, dim, array->ts.type,
653 array->ts.kind, &array->where);
654 init_result_expr (result, init_val, NULL);
656 return !dim || array->rank == 1 ?
657 simplify_transformation_to_scalar (result, array, mask, op) :
658 simplify_transformation_to_array (result, array, dim, mask, op, NULL);
662 /********************** Simplification functions *****************************/
664 gfc_expr *
665 gfc_simplify_abs (gfc_expr *e)
667 gfc_expr *result;
669 if (e->expr_type != EXPR_CONSTANT)
670 return NULL;
672 switch (e->ts.type)
674 case BT_INTEGER:
675 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
676 mpz_abs (result->value.integer, e->value.integer);
677 return range_check (result, "IABS");
679 case BT_REAL:
680 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
681 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
682 return range_check (result, "ABS");
684 case BT_COMPLEX:
685 gfc_set_model_kind (e->ts.kind);
686 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
687 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
688 return range_check (result, "CABS");
690 default:
691 gfc_internal_error ("gfc_simplify_abs(): Bad type");
696 static gfc_expr *
697 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
699 gfc_expr *result;
700 int kind;
701 bool too_large = false;
703 if (e->expr_type != EXPR_CONSTANT)
704 return NULL;
706 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
707 if (kind == -1)
708 return &gfc_bad_expr;
710 if (mpz_cmp_si (e->value.integer, 0) < 0)
712 gfc_error ("Argument of %s function at %L is negative", name,
713 &e->where);
714 return &gfc_bad_expr;
717 if (ascii && gfc_option.warn_surprising
718 && mpz_cmp_si (e->value.integer, 127) > 0)
719 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
720 name, &e->where);
722 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
723 too_large = true;
724 else if (kind == 4)
726 mpz_t t;
727 mpz_init_set_ui (t, 2);
728 mpz_pow_ui (t, t, 32);
729 mpz_sub_ui (t, t, 1);
730 if (mpz_cmp (e->value.integer, t) > 0)
731 too_large = true;
732 mpz_clear (t);
735 if (too_large)
737 gfc_error ("Argument of %s function at %L is too large for the "
738 "collating sequence of kind %d", name, &e->where, kind);
739 return &gfc_bad_expr;
742 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
743 result->value.character.string[0] = mpz_get_ui (e->value.integer);
745 return result;
750 /* We use the processor's collating sequence, because all
751 systems that gfortran currently works on are ASCII. */
753 gfc_expr *
754 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
756 return simplify_achar_char (e, k, "ACHAR", true);
760 gfc_expr *
761 gfc_simplify_acos (gfc_expr *x)
763 gfc_expr *result;
765 if (x->expr_type != EXPR_CONSTANT)
766 return NULL;
768 switch (x->ts.type)
770 case BT_REAL:
771 if (mpfr_cmp_si (x->value.real, 1) > 0
772 || mpfr_cmp_si (x->value.real, -1) < 0)
774 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
775 &x->where);
776 return &gfc_bad_expr;
778 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
779 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
780 break;
782 case BT_COMPLEX:
783 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
784 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
785 break;
787 default:
788 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
791 return range_check (result, "ACOS");
794 gfc_expr *
795 gfc_simplify_acosh (gfc_expr *x)
797 gfc_expr *result;
799 if (x->expr_type != EXPR_CONSTANT)
800 return NULL;
802 switch (x->ts.type)
804 case BT_REAL:
805 if (mpfr_cmp_si (x->value.real, 1) < 0)
807 gfc_error ("Argument of ACOSH at %L must not be less than 1",
808 &x->where);
809 return &gfc_bad_expr;
812 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
813 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
814 break;
816 case BT_COMPLEX:
817 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
818 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
819 break;
821 default:
822 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
825 return range_check (result, "ACOSH");
828 gfc_expr *
829 gfc_simplify_adjustl (gfc_expr *e)
831 gfc_expr *result;
832 int count, i, len;
833 gfc_char_t ch;
835 if (e->expr_type != EXPR_CONSTANT)
836 return NULL;
838 len = e->value.character.length;
840 for (count = 0, i = 0; i < len; ++i)
842 ch = e->value.character.string[i];
843 if (ch != ' ')
844 break;
845 ++count;
848 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
849 for (i = 0; i < len - count; ++i)
850 result->value.character.string[i] = e->value.character.string[count + i];
852 return result;
856 gfc_expr *
857 gfc_simplify_adjustr (gfc_expr *e)
859 gfc_expr *result;
860 int count, i, len;
861 gfc_char_t ch;
863 if (e->expr_type != EXPR_CONSTANT)
864 return NULL;
866 len = e->value.character.length;
868 for (count = 0, i = len - 1; i >= 0; --i)
870 ch = e->value.character.string[i];
871 if (ch != ' ')
872 break;
873 ++count;
876 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
877 for (i = 0; i < count; ++i)
878 result->value.character.string[i] = ' ';
880 for (i = count; i < len; ++i)
881 result->value.character.string[i] = e->value.character.string[i - count];
883 return result;
887 gfc_expr *
888 gfc_simplify_aimag (gfc_expr *e)
890 gfc_expr *result;
892 if (e->expr_type != EXPR_CONSTANT)
893 return NULL;
895 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
896 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
898 return range_check (result, "AIMAG");
902 gfc_expr *
903 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
905 gfc_expr *rtrunc, *result;
906 int kind;
908 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
909 if (kind == -1)
910 return &gfc_bad_expr;
912 if (e->expr_type != EXPR_CONSTANT)
913 return NULL;
915 rtrunc = gfc_copy_expr (e);
916 mpfr_trunc (rtrunc->value.real, e->value.real);
918 result = gfc_real2real (rtrunc, kind);
920 gfc_free_expr (rtrunc);
922 return range_check (result, "AINT");
926 gfc_expr *
927 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
929 return simplify_transformation (mask, dim, NULL, true, gfc_and);
933 gfc_expr *
934 gfc_simplify_dint (gfc_expr *e)
936 gfc_expr *rtrunc, *result;
938 if (e->expr_type != EXPR_CONSTANT)
939 return NULL;
941 rtrunc = gfc_copy_expr (e);
942 mpfr_trunc (rtrunc->value.real, e->value.real);
944 result = gfc_real2real (rtrunc, gfc_default_double_kind);
946 gfc_free_expr (rtrunc);
948 return range_check (result, "DINT");
952 gfc_expr *
953 gfc_simplify_dreal (gfc_expr *e)
955 gfc_expr *result = NULL;
957 if (e->expr_type != EXPR_CONSTANT)
958 return NULL;
960 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
961 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
963 return range_check (result, "DREAL");
967 gfc_expr *
968 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
970 gfc_expr *result;
971 int kind;
973 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
974 if (kind == -1)
975 return &gfc_bad_expr;
977 if (e->expr_type != EXPR_CONSTANT)
978 return NULL;
980 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
981 mpfr_round (result->value.real, e->value.real);
983 return range_check (result, "ANINT");
987 gfc_expr *
988 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
990 gfc_expr *result;
991 int kind;
993 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
994 return NULL;
996 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
998 switch (x->ts.type)
1000 case BT_INTEGER:
1001 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
1002 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1003 return range_check (result, "AND");
1005 case BT_LOGICAL:
1006 return gfc_get_logical_expr (kind, &x->where,
1007 x->value.logical && y->value.logical);
1009 default:
1010 gcc_unreachable ();
1015 gfc_expr *
1016 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
1018 return simplify_transformation (mask, dim, NULL, false, gfc_or);
1022 gfc_expr *
1023 gfc_simplify_dnint (gfc_expr *e)
1025 gfc_expr *result;
1027 if (e->expr_type != EXPR_CONSTANT)
1028 return NULL;
1030 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
1031 mpfr_round (result->value.real, e->value.real);
1033 return range_check (result, "DNINT");
1037 gfc_expr *
1038 gfc_simplify_asin (gfc_expr *x)
1040 gfc_expr *result;
1042 if (x->expr_type != EXPR_CONSTANT)
1043 return NULL;
1045 switch (x->ts.type)
1047 case BT_REAL:
1048 if (mpfr_cmp_si (x->value.real, 1) > 0
1049 || mpfr_cmp_si (x->value.real, -1) < 0)
1051 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1052 &x->where);
1053 return &gfc_bad_expr;
1055 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1056 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1057 break;
1059 case BT_COMPLEX:
1060 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1061 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1062 break;
1064 default:
1065 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1068 return range_check (result, "ASIN");
1072 gfc_expr *
1073 gfc_simplify_asinh (gfc_expr *x)
1075 gfc_expr *result;
1077 if (x->expr_type != EXPR_CONSTANT)
1078 return NULL;
1080 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1082 switch (x->ts.type)
1084 case BT_REAL:
1085 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1086 break;
1088 case BT_COMPLEX:
1089 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1090 break;
1092 default:
1093 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1096 return range_check (result, "ASINH");
1100 gfc_expr *
1101 gfc_simplify_atan (gfc_expr *x)
1103 gfc_expr *result;
1105 if (x->expr_type != EXPR_CONSTANT)
1106 return NULL;
1108 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1110 switch (x->ts.type)
1112 case BT_REAL:
1113 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1114 break;
1116 case BT_COMPLEX:
1117 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1118 break;
1120 default:
1121 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1124 return range_check (result, "ATAN");
1128 gfc_expr *
1129 gfc_simplify_atanh (gfc_expr *x)
1131 gfc_expr *result;
1133 if (x->expr_type != EXPR_CONSTANT)
1134 return NULL;
1136 switch (x->ts.type)
1138 case BT_REAL:
1139 if (mpfr_cmp_si (x->value.real, 1) >= 0
1140 || mpfr_cmp_si (x->value.real, -1) <= 0)
1142 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1143 "to 1", &x->where);
1144 return &gfc_bad_expr;
1146 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1147 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1148 break;
1150 case BT_COMPLEX:
1151 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1152 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1153 break;
1155 default:
1156 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1159 return range_check (result, "ATANH");
1163 gfc_expr *
1164 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1166 gfc_expr *result;
1168 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1169 return NULL;
1171 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
1173 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1174 "second argument must not be zero", &x->where);
1175 return &gfc_bad_expr;
1178 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1179 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1181 return range_check (result, "ATAN2");
1185 gfc_expr *
1186 gfc_simplify_bessel_j0 (gfc_expr *x)
1188 gfc_expr *result;
1190 if (x->expr_type != EXPR_CONSTANT)
1191 return NULL;
1193 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1194 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1196 return range_check (result, "BESSEL_J0");
1200 gfc_expr *
1201 gfc_simplify_bessel_j1 (gfc_expr *x)
1203 gfc_expr *result;
1205 if (x->expr_type != EXPR_CONSTANT)
1206 return NULL;
1208 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1209 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1211 return range_check (result, "BESSEL_J1");
1215 gfc_expr *
1216 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1218 gfc_expr *result;
1219 long n;
1221 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1222 return NULL;
1224 n = mpz_get_si (order->value.integer);
1225 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1226 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1228 return range_check (result, "BESSEL_JN");
1232 /* Simplify transformational form of JN and YN. */
1234 static gfc_expr *
1235 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1236 bool jn)
1238 gfc_expr *result;
1239 gfc_expr *e;
1240 long n1, n2;
1241 int i;
1242 mpfr_t x2rev, last1, last2;
1244 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1245 || order2->expr_type != EXPR_CONSTANT)
1246 return NULL;
1248 n1 = mpz_get_si (order1->value.integer);
1249 n2 = mpz_get_si (order2->value.integer);
1250 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1251 result->rank = 1;
1252 result->shape = gfc_get_shape (1);
1253 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1255 if (n2 < n1)
1256 return result;
1258 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1259 YN(N, 0.0) = -Inf. */
1261 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1263 if (!jn && gfc_option.flag_range_check)
1265 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1266 gfc_free_expr (result);
1267 return &gfc_bad_expr;
1270 if (jn && n1 == 0)
1272 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1273 mpfr_set_ui (e->value.real, 1, GFC_RND_MODE);
1274 gfc_constructor_append_expr (&result->value.constructor, e,
1275 &x->where);
1276 n1++;
1279 for (i = n1; i <= n2; i++)
1281 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1282 if (jn)
1283 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
1284 else
1285 mpfr_set_inf (e->value.real, -1);
1286 gfc_constructor_append_expr (&result->value.constructor, e,
1287 &x->where);
1290 return result;
1293 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1294 are stable for downward recursion and Neumann functions are stable
1295 for upward recursion. It is
1296 x2rev = 2.0/x,
1297 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1298 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1299 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1301 gfc_set_model_kind (x->ts.kind);
1303 /* Get first recursion anchor. */
1305 mpfr_init (last1);
1306 if (jn)
1307 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1308 else
1309 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1311 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1312 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1313 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1315 mpfr_clear (last1);
1316 gfc_free_expr (e);
1317 gfc_free_expr (result);
1318 return &gfc_bad_expr;
1320 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1322 if (n1 == n2)
1324 mpfr_clear (last1);
1325 return result;
1328 /* Get second recursion anchor. */
1330 mpfr_init (last2);
1331 if (jn)
1332 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1333 else
1334 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1336 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1337 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1338 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1340 mpfr_clear (last1);
1341 mpfr_clear (last2);
1342 gfc_free_expr (e);
1343 gfc_free_expr (result);
1344 return &gfc_bad_expr;
1346 if (jn)
1347 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1348 else
1349 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1351 if (n1 + 1 == n2)
1353 mpfr_clear (last1);
1354 mpfr_clear (last2);
1355 return result;
1358 /* Start actual recursion. */
1360 mpfr_init (x2rev);
1361 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1363 for (i = 2; i <= n2-n1; i++)
1365 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1367 /* Special case: For YN, if the previous N gave -INF, set
1368 also N+1 to -INF. */
1369 if (!jn && !gfc_option.flag_range_check && mpfr_inf_p (last2))
1371 mpfr_set_inf (e->value.real, -1);
1372 gfc_constructor_append_expr (&result->value.constructor, e,
1373 &x->where);
1374 continue;
1377 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1378 GFC_RND_MODE);
1379 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1380 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1382 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1384 /* Range_check frees "e" in that case. */
1385 e = NULL;
1386 goto error;
1389 if (jn)
1390 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1391 -i-1);
1392 else
1393 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1395 mpfr_set (last1, last2, GFC_RND_MODE);
1396 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1399 mpfr_clear (last1);
1400 mpfr_clear (last2);
1401 mpfr_clear (x2rev);
1402 return result;
1404 error:
1405 mpfr_clear (last1);
1406 mpfr_clear (last2);
1407 mpfr_clear (x2rev);
1408 gfc_free_expr (e);
1409 gfc_free_expr (result);
1410 return &gfc_bad_expr;
1414 gfc_expr *
1415 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1417 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1421 gfc_expr *
1422 gfc_simplify_bessel_y0 (gfc_expr *x)
1424 gfc_expr *result;
1426 if (x->expr_type != EXPR_CONSTANT)
1427 return NULL;
1429 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1430 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1432 return range_check (result, "BESSEL_Y0");
1436 gfc_expr *
1437 gfc_simplify_bessel_y1 (gfc_expr *x)
1439 gfc_expr *result;
1441 if (x->expr_type != EXPR_CONSTANT)
1442 return NULL;
1444 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1445 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1447 return range_check (result, "BESSEL_Y1");
1451 gfc_expr *
1452 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1454 gfc_expr *result;
1455 long n;
1457 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1458 return NULL;
1460 n = mpz_get_si (order->value.integer);
1461 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1462 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1464 return range_check (result, "BESSEL_YN");
1468 gfc_expr *
1469 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1471 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1475 gfc_expr *
1476 gfc_simplify_bit_size (gfc_expr *e)
1478 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1479 return gfc_get_int_expr (e->ts.kind, &e->where,
1480 gfc_integer_kinds[i].bit_size);
1484 gfc_expr *
1485 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1487 int b;
1489 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1490 return NULL;
1492 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1493 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1495 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1496 mpz_tstbit (e->value.integer, b));
1500 static int
1501 compare_bitwise (gfc_expr *i, gfc_expr *j)
1503 mpz_t x, y;
1504 int k, res;
1506 gcc_assert (i->ts.type == BT_INTEGER);
1507 gcc_assert (j->ts.type == BT_INTEGER);
1509 mpz_init_set (x, i->value.integer);
1510 k = gfc_validate_kind (i->ts.type, i->ts.kind, false);
1511 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
1513 mpz_init_set (y, j->value.integer);
1514 k = gfc_validate_kind (j->ts.type, j->ts.kind, false);
1515 convert_mpz_to_unsigned (y, gfc_integer_kinds[k].bit_size);
1517 res = mpz_cmp (x, y);
1518 mpz_clear (x);
1519 mpz_clear (y);
1520 return res;
1524 gfc_expr *
1525 gfc_simplify_bge (gfc_expr *i, gfc_expr *j)
1527 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1528 return NULL;
1530 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1531 compare_bitwise (i, j) >= 0);
1535 gfc_expr *
1536 gfc_simplify_bgt (gfc_expr *i, gfc_expr *j)
1538 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1539 return NULL;
1541 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1542 compare_bitwise (i, j) > 0);
1546 gfc_expr *
1547 gfc_simplify_ble (gfc_expr *i, gfc_expr *j)
1549 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1550 return NULL;
1552 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1553 compare_bitwise (i, j) <= 0);
1557 gfc_expr *
1558 gfc_simplify_blt (gfc_expr *i, gfc_expr *j)
1560 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1561 return NULL;
1563 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1564 compare_bitwise (i, j) < 0);
1568 gfc_expr *
1569 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1571 gfc_expr *ceil, *result;
1572 int kind;
1574 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1575 if (kind == -1)
1576 return &gfc_bad_expr;
1578 if (e->expr_type != EXPR_CONSTANT)
1579 return NULL;
1581 ceil = gfc_copy_expr (e);
1582 mpfr_ceil (ceil->value.real, e->value.real);
1584 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1585 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1587 gfc_free_expr (ceil);
1589 return range_check (result, "CEILING");
1593 gfc_expr *
1594 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1596 return simplify_achar_char (e, k, "CHAR", false);
1600 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1602 static gfc_expr *
1603 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1605 gfc_expr *result;
1607 if (convert_boz (x, kind) == &gfc_bad_expr)
1608 return &gfc_bad_expr;
1610 if (convert_boz (y, kind) == &gfc_bad_expr)
1611 return &gfc_bad_expr;
1613 if (x->expr_type != EXPR_CONSTANT
1614 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1615 return NULL;
1617 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1619 switch (x->ts.type)
1621 case BT_INTEGER:
1622 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1623 break;
1625 case BT_REAL:
1626 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1627 break;
1629 case BT_COMPLEX:
1630 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1631 break;
1633 default:
1634 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1637 if (!y)
1638 return range_check (result, name);
1640 switch (y->ts.type)
1642 case BT_INTEGER:
1643 mpfr_set_z (mpc_imagref (result->value.complex),
1644 y->value.integer, GFC_RND_MODE);
1645 break;
1647 case BT_REAL:
1648 mpfr_set (mpc_imagref (result->value.complex),
1649 y->value.real, GFC_RND_MODE);
1650 break;
1652 default:
1653 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1656 return range_check (result, name);
1660 gfc_expr *
1661 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1663 int kind;
1665 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1666 if (kind == -1)
1667 return &gfc_bad_expr;
1669 return simplify_cmplx ("CMPLX", x, y, kind);
1673 gfc_expr *
1674 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1676 int kind;
1678 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1679 kind = gfc_default_complex_kind;
1680 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1681 kind = x->ts.kind;
1682 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1683 kind = y->ts.kind;
1684 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1685 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1686 else
1687 gcc_unreachable ();
1689 return simplify_cmplx ("COMPLEX", x, y, kind);
1693 gfc_expr *
1694 gfc_simplify_conjg (gfc_expr *e)
1696 gfc_expr *result;
1698 if (e->expr_type != EXPR_CONSTANT)
1699 return NULL;
1701 result = gfc_copy_expr (e);
1702 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1704 return range_check (result, "CONJG");
1708 gfc_expr *
1709 gfc_simplify_cos (gfc_expr *x)
1711 gfc_expr *result;
1713 if (x->expr_type != EXPR_CONSTANT)
1714 return NULL;
1716 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1718 switch (x->ts.type)
1720 case BT_REAL:
1721 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1722 break;
1724 case BT_COMPLEX:
1725 gfc_set_model_kind (x->ts.kind);
1726 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1727 break;
1729 default:
1730 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1733 return range_check (result, "COS");
1737 gfc_expr *
1738 gfc_simplify_cosh (gfc_expr *x)
1740 gfc_expr *result;
1742 if (x->expr_type != EXPR_CONSTANT)
1743 return NULL;
1745 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1747 switch (x->ts.type)
1749 case BT_REAL:
1750 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1751 break;
1753 case BT_COMPLEX:
1754 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1755 break;
1757 default:
1758 gcc_unreachable ();
1761 return range_check (result, "COSH");
1765 gfc_expr *
1766 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1768 gfc_expr *result;
1770 if (!is_constant_array_expr (mask)
1771 || !gfc_is_constant_expr (dim)
1772 || !gfc_is_constant_expr (kind))
1773 return NULL;
1775 result = transformational_result (mask, dim,
1776 BT_INTEGER,
1777 get_kind (BT_INTEGER, kind, "COUNT",
1778 gfc_default_integer_kind),
1779 &mask->where);
1781 init_result_expr (result, 0, NULL);
1783 /* Passing MASK twice, once as data array, once as mask.
1784 Whenever gfc_count is called, '1' is added to the result. */
1785 return !dim || mask->rank == 1 ?
1786 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1787 simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL);
1791 gfc_expr *
1792 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
1794 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
1798 gfc_expr *
1799 gfc_simplify_dble (gfc_expr *e)
1801 gfc_expr *result = NULL;
1803 if (e->expr_type != EXPR_CONSTANT)
1804 return NULL;
1806 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
1807 return &gfc_bad_expr;
1809 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
1810 if (result == &gfc_bad_expr)
1811 return &gfc_bad_expr;
1813 return range_check (result, "DBLE");
1817 gfc_expr *
1818 gfc_simplify_digits (gfc_expr *x)
1820 int i, digits;
1822 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1824 switch (x->ts.type)
1826 case BT_INTEGER:
1827 digits = gfc_integer_kinds[i].digits;
1828 break;
1830 case BT_REAL:
1831 case BT_COMPLEX:
1832 digits = gfc_real_kinds[i].digits;
1833 break;
1835 default:
1836 gcc_unreachable ();
1839 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
1843 gfc_expr *
1844 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1846 gfc_expr *result;
1847 int kind;
1849 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1850 return NULL;
1852 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1853 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
1855 switch (x->ts.type)
1857 case BT_INTEGER:
1858 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1859 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1860 else
1861 mpz_set_ui (result->value.integer, 0);
1863 break;
1865 case BT_REAL:
1866 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1867 mpfr_sub (result->value.real, x->value.real, y->value.real,
1868 GFC_RND_MODE);
1869 else
1870 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1872 break;
1874 default:
1875 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1878 return range_check (result, "DIM");
1882 gfc_expr*
1883 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
1885 if (!is_constant_array_expr (vector_a)
1886 || !is_constant_array_expr (vector_b))
1887 return NULL;
1889 gcc_assert (vector_a->rank == 1);
1890 gcc_assert (vector_b->rank == 1);
1891 gcc_assert (gfc_compare_types (&vector_a->ts, &vector_b->ts));
1893 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0, true);
1897 gfc_expr *
1898 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1900 gfc_expr *a1, *a2, *result;
1902 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1903 return NULL;
1905 a1 = gfc_real2real (x, gfc_default_double_kind);
1906 a2 = gfc_real2real (y, gfc_default_double_kind);
1908 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
1909 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1911 gfc_free_expr (a2);
1912 gfc_free_expr (a1);
1914 return range_check (result, "DPROD");
1918 static gfc_expr *
1919 simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg,
1920 bool right)
1922 gfc_expr *result;
1923 int i, k, size, shift;
1925 if (arg1->expr_type != EXPR_CONSTANT || arg2->expr_type != EXPR_CONSTANT
1926 || shiftarg->expr_type != EXPR_CONSTANT)
1927 return NULL;
1929 k = gfc_validate_kind (BT_INTEGER, arg1->ts.kind, false);
1930 size = gfc_integer_kinds[k].bit_size;
1932 gfc_extract_int (shiftarg, &shift);
1934 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
1935 if (right)
1936 shift = size - shift;
1938 result = gfc_get_constant_expr (BT_INTEGER, arg1->ts.kind, &arg1->where);
1939 mpz_set_ui (result->value.integer, 0);
1941 for (i = 0; i < shift; i++)
1942 if (mpz_tstbit (arg2->value.integer, size - shift + i))
1943 mpz_setbit (result->value.integer, i);
1945 for (i = 0; i < size - shift; i++)
1946 if (mpz_tstbit (arg1->value.integer, i))
1947 mpz_setbit (result->value.integer, shift + i);
1949 /* Convert to a signed value. */
1950 gfc_convert_mpz_to_signed (result->value.integer, size);
1952 return result;
1956 gfc_expr *
1957 gfc_simplify_dshiftr (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
1959 return simplify_dshift (arg1, arg2, shiftarg, true);
1963 gfc_expr *
1964 gfc_simplify_dshiftl (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
1966 return simplify_dshift (arg1, arg2, shiftarg, false);
1970 gfc_expr *
1971 gfc_simplify_erf (gfc_expr *x)
1973 gfc_expr *result;
1975 if (x->expr_type != EXPR_CONSTANT)
1976 return NULL;
1978 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1979 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1981 return range_check (result, "ERF");
1985 gfc_expr *
1986 gfc_simplify_erfc (gfc_expr *x)
1988 gfc_expr *result;
1990 if (x->expr_type != EXPR_CONSTANT)
1991 return NULL;
1993 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1994 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1996 return range_check (result, "ERFC");
2000 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2002 #define MAX_ITER 200
2003 #define ARG_LIMIT 12
2005 /* Calculate ERFC_SCALED directly by its definition:
2007 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2009 using a large precision for intermediate results. This is used for all
2010 but large values of the argument. */
2011 static void
2012 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
2014 mp_prec_t prec;
2015 mpfr_t a, b;
2017 prec = mpfr_get_default_prec ();
2018 mpfr_set_default_prec (10 * prec);
2020 mpfr_init (a);
2021 mpfr_init (b);
2023 mpfr_set (a, arg, GFC_RND_MODE);
2024 mpfr_sqr (b, a, GFC_RND_MODE);
2025 mpfr_exp (b, b, GFC_RND_MODE);
2026 mpfr_erfc (a, a, GFC_RND_MODE);
2027 mpfr_mul (a, a, b, GFC_RND_MODE);
2029 mpfr_set (res, a, GFC_RND_MODE);
2030 mpfr_set_default_prec (prec);
2032 mpfr_clear (a);
2033 mpfr_clear (b);
2036 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2038 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2039 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2040 / (2 * x**2)**n)
2042 This is used for large values of the argument. Intermediate calculations
2043 are performed with twice the precision. We don't do a fixed number of
2044 iterations of the sum, but stop when it has converged to the required
2045 precision. */
2046 static void
2047 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
2049 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
2050 mpz_t num;
2051 mp_prec_t prec;
2052 unsigned i;
2054 prec = mpfr_get_default_prec ();
2055 mpfr_set_default_prec (2 * prec);
2057 mpfr_init (sum);
2058 mpfr_init (x);
2059 mpfr_init (u);
2060 mpfr_init (v);
2061 mpfr_init (w);
2062 mpz_init (num);
2064 mpfr_init (oldsum);
2065 mpfr_init (sumtrunc);
2066 mpfr_set_prec (oldsum, prec);
2067 mpfr_set_prec (sumtrunc, prec);
2069 mpfr_set (x, arg, GFC_RND_MODE);
2070 mpfr_set_ui (sum, 1, GFC_RND_MODE);
2071 mpz_set_ui (num, 1);
2073 mpfr_set (u, x, GFC_RND_MODE);
2074 mpfr_sqr (u, u, GFC_RND_MODE);
2075 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
2076 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
2078 for (i = 1; i < MAX_ITER; i++)
2080 mpfr_set (oldsum, sum, GFC_RND_MODE);
2082 mpz_mul_ui (num, num, 2 * i - 1);
2083 mpz_neg (num, num);
2085 mpfr_set (w, u, GFC_RND_MODE);
2086 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
2088 mpfr_set_z (v, num, GFC_RND_MODE);
2089 mpfr_mul (v, v, w, GFC_RND_MODE);
2091 mpfr_add (sum, sum, v, GFC_RND_MODE);
2093 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
2094 if (mpfr_cmp (sumtrunc, oldsum) == 0)
2095 break;
2098 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2099 set too low. */
2100 gcc_assert (i < MAX_ITER);
2102 /* Divide by x * sqrt(Pi). */
2103 mpfr_const_pi (u, GFC_RND_MODE);
2104 mpfr_sqrt (u, u, GFC_RND_MODE);
2105 mpfr_mul (u, u, x, GFC_RND_MODE);
2106 mpfr_div (sum, sum, u, GFC_RND_MODE);
2108 mpfr_set (res, sum, GFC_RND_MODE);
2109 mpfr_set_default_prec (prec);
2111 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
2112 mpz_clear (num);
2116 gfc_expr *
2117 gfc_simplify_erfc_scaled (gfc_expr *x)
2119 gfc_expr *result;
2121 if (x->expr_type != EXPR_CONSTANT)
2122 return NULL;
2124 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2125 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
2126 asympt_erfc_scaled (result->value.real, x->value.real);
2127 else
2128 fullprec_erfc_scaled (result->value.real, x->value.real);
2130 return range_check (result, "ERFC_SCALED");
2133 #undef MAX_ITER
2134 #undef ARG_LIMIT
2137 gfc_expr *
2138 gfc_simplify_epsilon (gfc_expr *e)
2140 gfc_expr *result;
2141 int i;
2143 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2145 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
2146 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
2148 return range_check (result, "EPSILON");
2152 gfc_expr *
2153 gfc_simplify_exp (gfc_expr *x)
2155 gfc_expr *result;
2157 if (x->expr_type != EXPR_CONSTANT)
2158 return NULL;
2160 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2162 switch (x->ts.type)
2164 case BT_REAL:
2165 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2166 break;
2168 case BT_COMPLEX:
2169 gfc_set_model_kind (x->ts.kind);
2170 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2171 break;
2173 default:
2174 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2177 return range_check (result, "EXP");
2181 gfc_expr *
2182 gfc_simplify_exponent (gfc_expr *x)
2184 int i;
2185 gfc_expr *result;
2187 if (x->expr_type != EXPR_CONSTANT)
2188 return NULL;
2190 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2191 &x->where);
2193 gfc_set_model (x->value.real);
2195 if (mpfr_sgn (x->value.real) == 0)
2197 mpz_set_ui (result->value.integer, 0);
2198 return result;
2201 i = (int) mpfr_get_exp (x->value.real);
2202 mpz_set_si (result->value.integer, i);
2204 return range_check (result, "EXPONENT");
2208 gfc_expr *
2209 gfc_simplify_float (gfc_expr *a)
2211 gfc_expr *result;
2213 if (a->expr_type != EXPR_CONSTANT)
2214 return NULL;
2216 if (a->is_boz)
2218 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2219 return &gfc_bad_expr;
2221 result = gfc_copy_expr (a);
2223 else
2224 result = gfc_int2real (a, gfc_default_real_kind);
2226 return range_check (result, "FLOAT");
2230 static bool
2231 is_last_ref_vtab (gfc_expr *e)
2233 gfc_ref *ref;
2234 gfc_component *comp = NULL;
2236 if (e->expr_type != EXPR_VARIABLE)
2237 return false;
2239 for (ref = e->ref; ref; ref = ref->next)
2240 if (ref->type == REF_COMPONENT)
2241 comp = ref->u.c.component;
2243 if (!e->ref || !comp)
2244 return e->symtree->n.sym->attr.vtab;
2246 if (comp->name[0] == '_' && strcmp (comp->name, "_vptr") == 0)
2247 return true;
2249 return false;
2253 gfc_expr *
2254 gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold)
2256 /* Avoid simplification of resolved symbols. */
2257 if (is_last_ref_vtab (a) || is_last_ref_vtab (mold))
2258 return NULL;
2260 if (a->ts.type == BT_DERIVED && mold->ts.type == BT_DERIVED)
2261 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2262 gfc_type_is_extension_of (mold->ts.u.derived,
2263 a->ts.u.derived));
2265 if (UNLIMITED_POLY (a) || UNLIMITED_POLY (mold))
2266 return NULL;
2268 /* Return .false. if the dynamic type can never be the same. */
2269 if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS
2270 && !gfc_type_is_extension_of
2271 (mold->ts.u.derived->components->ts.u.derived,
2272 a->ts.u.derived->components->ts.u.derived)
2273 && !gfc_type_is_extension_of
2274 (a->ts.u.derived->components->ts.u.derived,
2275 mold->ts.u.derived->components->ts.u.derived))
2276 || (a->ts.type == BT_DERIVED && mold->ts.type == BT_CLASS
2277 && !gfc_type_is_extension_of
2278 (a->ts.u.derived,
2279 mold->ts.u.derived->components->ts.u.derived)
2280 && !gfc_type_is_extension_of
2281 (mold->ts.u.derived->components->ts.u.derived,
2282 a->ts.u.derived))
2283 || (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
2284 && !gfc_type_is_extension_of
2285 (mold->ts.u.derived,
2286 a->ts.u.derived->components->ts.u.derived)))
2287 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2289 if (mold->ts.type == BT_DERIVED
2290 && gfc_type_is_extension_of (mold->ts.u.derived,
2291 a->ts.u.derived->components->ts.u.derived))
2292 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, true);
2294 return NULL;
2298 gfc_expr *
2299 gfc_simplify_same_type_as (gfc_expr *a, gfc_expr *b)
2301 /* Avoid simplification of resolved symbols. */
2302 if (is_last_ref_vtab (a) || is_last_ref_vtab (b))
2303 return NULL;
2305 /* Return .false. if the dynamic type can never be the
2306 same. */
2307 if (((a->ts.type == BT_CLASS && gfc_expr_attr (a).class_ok)
2308 || (b->ts.type == BT_CLASS && gfc_expr_attr (b).class_ok))
2309 && !gfc_type_compatible (&a->ts, &b->ts)
2310 && !gfc_type_compatible (&b->ts, &a->ts))
2311 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2313 if (a->ts.type != BT_DERIVED || b->ts.type != BT_DERIVED)
2314 return NULL;
2316 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2317 gfc_compare_derived_types (a->ts.u.derived,
2318 b->ts.u.derived));
2322 gfc_expr *
2323 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
2325 gfc_expr *result;
2326 mpfr_t floor;
2327 int kind;
2329 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
2330 if (kind == -1)
2331 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2333 if (e->expr_type != EXPR_CONSTANT)
2334 return NULL;
2336 gfc_set_model_kind (kind);
2338 mpfr_init (floor);
2339 mpfr_floor (floor, e->value.real);
2341 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
2342 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2344 mpfr_clear (floor);
2346 return range_check (result, "FLOOR");
2350 gfc_expr *
2351 gfc_simplify_fraction (gfc_expr *x)
2353 gfc_expr *result;
2355 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2356 mpfr_t absv, exp, pow2;
2357 #else
2358 mpfr_exp_t e;
2359 #endif
2361 if (x->expr_type != EXPR_CONSTANT)
2362 return NULL;
2364 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
2366 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2368 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
2369 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
2371 if (mpfr_sgn (x->value.real) == 0)
2373 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
2374 return result;
2377 gfc_set_model_kind (x->ts.kind);
2378 mpfr_init (exp);
2379 mpfr_init (absv);
2380 mpfr_init (pow2);
2382 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2383 mpfr_log2 (exp, absv, GFC_RND_MODE);
2385 mpfr_trunc (exp, exp);
2386 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2388 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2390 mpfr_div (result->value.real, x->value.real, pow2, GFC_RND_MODE);
2392 mpfr_clears (exp, absv, pow2, NULL);
2394 #else
2396 mpfr_frexp (&e, result->value.real, x->value.real, GFC_RND_MODE);
2398 #endif
2400 return range_check (result, "FRACTION");
2404 gfc_expr *
2405 gfc_simplify_gamma (gfc_expr *x)
2407 gfc_expr *result;
2409 if (x->expr_type != EXPR_CONSTANT)
2410 return NULL;
2412 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2413 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2415 return range_check (result, "GAMMA");
2419 gfc_expr *
2420 gfc_simplify_huge (gfc_expr *e)
2422 gfc_expr *result;
2423 int i;
2425 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2426 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2428 switch (e->ts.type)
2430 case BT_INTEGER:
2431 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2432 break;
2434 case BT_REAL:
2435 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2436 break;
2438 default:
2439 gcc_unreachable ();
2442 return result;
2446 gfc_expr *
2447 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2449 gfc_expr *result;
2451 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2452 return NULL;
2454 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2455 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2456 return range_check (result, "HYPOT");
2460 /* We use the processor's collating sequence, because all
2461 systems that gfortran currently works on are ASCII. */
2463 gfc_expr *
2464 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2466 gfc_expr *result;
2467 gfc_char_t index;
2468 int k;
2470 if (e->expr_type != EXPR_CONSTANT)
2471 return NULL;
2473 if (e->value.character.length != 1)
2475 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2476 return &gfc_bad_expr;
2479 index = e->value.character.string[0];
2481 if (gfc_option.warn_surprising && index > 127)
2482 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2483 &e->where);
2485 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
2486 if (k == -1)
2487 return &gfc_bad_expr;
2489 result = gfc_get_int_expr (k, &e->where, index);
2491 return range_check (result, "IACHAR");
2495 static gfc_expr *
2496 do_bit_and (gfc_expr *result, gfc_expr *e)
2498 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2499 gcc_assert (result->ts.type == BT_INTEGER
2500 && result->expr_type == EXPR_CONSTANT);
2502 mpz_and (result->value.integer, result->value.integer, e->value.integer);
2503 return result;
2507 gfc_expr *
2508 gfc_simplify_iall (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2510 return simplify_transformation (array, dim, mask, -1, do_bit_and);
2514 static gfc_expr *
2515 do_bit_ior (gfc_expr *result, gfc_expr *e)
2517 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2518 gcc_assert (result->ts.type == BT_INTEGER
2519 && result->expr_type == EXPR_CONSTANT);
2521 mpz_ior (result->value.integer, result->value.integer, e->value.integer);
2522 return result;
2526 gfc_expr *
2527 gfc_simplify_iany (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2529 return simplify_transformation (array, dim, mask, 0, do_bit_ior);
2533 gfc_expr *
2534 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2536 gfc_expr *result;
2538 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2539 return NULL;
2541 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2542 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2544 return range_check (result, "IAND");
2548 gfc_expr *
2549 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2551 gfc_expr *result;
2552 int k, pos;
2554 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2555 return NULL;
2557 gfc_extract_int (y, &pos);
2559 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2561 result = gfc_copy_expr (x);
2563 convert_mpz_to_unsigned (result->value.integer,
2564 gfc_integer_kinds[k].bit_size);
2566 mpz_clrbit (result->value.integer, pos);
2568 gfc_convert_mpz_to_signed (result->value.integer,
2569 gfc_integer_kinds[k].bit_size);
2571 return result;
2575 gfc_expr *
2576 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2578 gfc_expr *result;
2579 int pos, len;
2580 int i, k, bitsize;
2581 int *bits;
2583 if (x->expr_type != EXPR_CONSTANT
2584 || y->expr_type != EXPR_CONSTANT
2585 || z->expr_type != EXPR_CONSTANT)
2586 return NULL;
2588 gfc_extract_int (y, &pos);
2589 gfc_extract_int (z, &len);
2591 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2593 bitsize = gfc_integer_kinds[k].bit_size;
2595 if (pos + len > bitsize)
2597 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2598 "bit size at %L", &y->where);
2599 return &gfc_bad_expr;
2602 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2603 convert_mpz_to_unsigned (result->value.integer,
2604 gfc_integer_kinds[k].bit_size);
2606 bits = XCNEWVEC (int, bitsize);
2608 for (i = 0; i < bitsize; i++)
2609 bits[i] = 0;
2611 for (i = 0; i < len; i++)
2612 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2614 for (i = 0; i < bitsize; i++)
2616 if (bits[i] == 0)
2617 mpz_clrbit (result->value.integer, i);
2618 else if (bits[i] == 1)
2619 mpz_setbit (result->value.integer, i);
2620 else
2621 gfc_internal_error ("IBITS: Bad bit");
2624 free (bits);
2626 gfc_convert_mpz_to_signed (result->value.integer,
2627 gfc_integer_kinds[k].bit_size);
2629 return result;
2633 gfc_expr *
2634 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2636 gfc_expr *result;
2637 int k, pos;
2639 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2640 return NULL;
2642 gfc_extract_int (y, &pos);
2644 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2646 result = gfc_copy_expr (x);
2648 convert_mpz_to_unsigned (result->value.integer,
2649 gfc_integer_kinds[k].bit_size);
2651 mpz_setbit (result->value.integer, pos);
2653 gfc_convert_mpz_to_signed (result->value.integer,
2654 gfc_integer_kinds[k].bit_size);
2656 return result;
2660 gfc_expr *
2661 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2663 gfc_expr *result;
2664 gfc_char_t index;
2665 int k;
2667 if (e->expr_type != EXPR_CONSTANT)
2668 return NULL;
2670 if (e->value.character.length != 1)
2672 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2673 return &gfc_bad_expr;
2676 index = e->value.character.string[0];
2678 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
2679 if (k == -1)
2680 return &gfc_bad_expr;
2682 result = gfc_get_int_expr (k, &e->where, index);
2684 return range_check (result, "ICHAR");
2688 gfc_expr *
2689 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2691 gfc_expr *result;
2693 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2694 return NULL;
2696 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2697 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2699 return range_check (result, "IEOR");
2703 gfc_expr *
2704 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2706 gfc_expr *result;
2707 int back, len, lensub;
2708 int i, j, k, count, index = 0, start;
2710 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2711 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2712 return NULL;
2714 if (b != NULL && b->value.logical != 0)
2715 back = 1;
2716 else
2717 back = 0;
2719 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2720 if (k == -1)
2721 return &gfc_bad_expr;
2723 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
2725 len = x->value.character.length;
2726 lensub = y->value.character.length;
2728 if (len < lensub)
2730 mpz_set_si (result->value.integer, 0);
2731 return result;
2734 if (back == 0)
2736 if (lensub == 0)
2738 mpz_set_si (result->value.integer, 1);
2739 return result;
2741 else if (lensub == 1)
2743 for (i = 0; i < len; i++)
2745 for (j = 0; j < lensub; j++)
2747 if (y->value.character.string[j]
2748 == x->value.character.string[i])
2750 index = i + 1;
2751 goto done;
2756 else
2758 for (i = 0; i < len; i++)
2760 for (j = 0; j < lensub; j++)
2762 if (y->value.character.string[j]
2763 == x->value.character.string[i])
2765 start = i;
2766 count = 0;
2768 for (k = 0; k < lensub; k++)
2770 if (y->value.character.string[k]
2771 == x->value.character.string[k + start])
2772 count++;
2775 if (count == lensub)
2777 index = start + 1;
2778 goto done;
2786 else
2788 if (lensub == 0)
2790 mpz_set_si (result->value.integer, len + 1);
2791 return result;
2793 else if (lensub == 1)
2795 for (i = 0; i < len; i++)
2797 for (j = 0; j < lensub; j++)
2799 if (y->value.character.string[j]
2800 == x->value.character.string[len - i])
2802 index = len - i + 1;
2803 goto done;
2808 else
2810 for (i = 0; i < len; i++)
2812 for (j = 0; j < lensub; j++)
2814 if (y->value.character.string[j]
2815 == x->value.character.string[len - i])
2817 start = len - i;
2818 if (start <= len - lensub)
2820 count = 0;
2821 for (k = 0; k < lensub; k++)
2822 if (y->value.character.string[k]
2823 == x->value.character.string[k + start])
2824 count++;
2826 if (count == lensub)
2828 index = start + 1;
2829 goto done;
2832 else
2834 continue;
2842 done:
2843 mpz_set_si (result->value.integer, index);
2844 return range_check (result, "INDEX");
2848 static gfc_expr *
2849 simplify_intconv (gfc_expr *e, int kind, const char *name)
2851 gfc_expr *result = NULL;
2853 if (e->expr_type != EXPR_CONSTANT)
2854 return NULL;
2856 result = gfc_convert_constant (e, BT_INTEGER, kind);
2857 if (result == &gfc_bad_expr)
2858 return &gfc_bad_expr;
2860 return range_check (result, name);
2864 gfc_expr *
2865 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
2867 int kind;
2869 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
2870 if (kind == -1)
2871 return &gfc_bad_expr;
2873 return simplify_intconv (e, kind, "INT");
2876 gfc_expr *
2877 gfc_simplify_int2 (gfc_expr *e)
2879 return simplify_intconv (e, 2, "INT2");
2883 gfc_expr *
2884 gfc_simplify_int8 (gfc_expr *e)
2886 return simplify_intconv (e, 8, "INT8");
2890 gfc_expr *
2891 gfc_simplify_long (gfc_expr *e)
2893 return simplify_intconv (e, 4, "LONG");
2897 gfc_expr *
2898 gfc_simplify_ifix (gfc_expr *e)
2900 gfc_expr *rtrunc, *result;
2902 if (e->expr_type != EXPR_CONSTANT)
2903 return NULL;
2905 rtrunc = gfc_copy_expr (e);
2906 mpfr_trunc (rtrunc->value.real, e->value.real);
2908 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2909 &e->where);
2910 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2912 gfc_free_expr (rtrunc);
2914 return range_check (result, "IFIX");
2918 gfc_expr *
2919 gfc_simplify_idint (gfc_expr *e)
2921 gfc_expr *rtrunc, *result;
2923 if (e->expr_type != EXPR_CONSTANT)
2924 return NULL;
2926 rtrunc = gfc_copy_expr (e);
2927 mpfr_trunc (rtrunc->value.real, e->value.real);
2929 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2930 &e->where);
2931 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2933 gfc_free_expr (rtrunc);
2935 return range_check (result, "IDINT");
2939 gfc_expr *
2940 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
2942 gfc_expr *result;
2944 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2945 return NULL;
2947 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2948 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2950 return range_check (result, "IOR");
2954 static gfc_expr *
2955 do_bit_xor (gfc_expr *result, gfc_expr *e)
2957 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2958 gcc_assert (result->ts.type == BT_INTEGER
2959 && result->expr_type == EXPR_CONSTANT);
2961 mpz_xor (result->value.integer, result->value.integer, e->value.integer);
2962 return result;
2966 gfc_expr *
2967 gfc_simplify_iparity (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2969 return simplify_transformation (array, dim, mask, 0, do_bit_xor);
2973 gfc_expr *
2974 gfc_simplify_is_iostat_end (gfc_expr *x)
2976 if (x->expr_type != EXPR_CONSTANT)
2977 return NULL;
2979 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2980 mpz_cmp_si (x->value.integer,
2981 LIBERROR_END) == 0);
2985 gfc_expr *
2986 gfc_simplify_is_iostat_eor (gfc_expr *x)
2988 if (x->expr_type != EXPR_CONSTANT)
2989 return NULL;
2991 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2992 mpz_cmp_si (x->value.integer,
2993 LIBERROR_EOR) == 0);
2997 gfc_expr *
2998 gfc_simplify_isnan (gfc_expr *x)
3000 if (x->expr_type != EXPR_CONSTANT)
3001 return NULL;
3003 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3004 mpfr_nan_p (x->value.real));
3008 /* Performs a shift on its first argument. Depending on the last
3009 argument, the shift can be arithmetic, i.e. with filling from the
3010 left like in the SHIFTA intrinsic. */
3011 static gfc_expr *
3012 simplify_shift (gfc_expr *e, gfc_expr *s, const char *name,
3013 bool arithmetic, int direction)
3015 gfc_expr *result;
3016 int ashift, *bits, i, k, bitsize, shift;
3018 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3019 return NULL;
3021 gfc_extract_int (s, &shift);
3023 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
3024 bitsize = gfc_integer_kinds[k].bit_size;
3026 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3028 if (shift == 0)
3030 mpz_set (result->value.integer, e->value.integer);
3031 return result;
3034 if (direction > 0 && shift < 0)
3036 /* Left shift, as in SHIFTL. */
3037 gfc_error ("Second argument of %s is negative at %L", name, &e->where);
3038 return &gfc_bad_expr;
3040 else if (direction < 0)
3042 /* Right shift, as in SHIFTR or SHIFTA. */
3043 if (shift < 0)
3045 gfc_error ("Second argument of %s is negative at %L",
3046 name, &e->where);
3047 return &gfc_bad_expr;
3050 shift = -shift;
3053 ashift = (shift >= 0 ? shift : -shift);
3055 if (ashift > bitsize)
3057 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3058 "at %L", name, &e->where);
3059 return &gfc_bad_expr;
3062 bits = XCNEWVEC (int, bitsize);
3064 for (i = 0; i < bitsize; i++)
3065 bits[i] = mpz_tstbit (e->value.integer, i);
3067 if (shift > 0)
3069 /* Left shift. */
3070 for (i = 0; i < shift; i++)
3071 mpz_clrbit (result->value.integer, i);
3073 for (i = 0; i < bitsize - shift; i++)
3075 if (bits[i] == 0)
3076 mpz_clrbit (result->value.integer, i + shift);
3077 else
3078 mpz_setbit (result->value.integer, i + shift);
3081 else
3083 /* Right shift. */
3084 if (arithmetic && bits[bitsize - 1])
3085 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3086 mpz_setbit (result->value.integer, i);
3087 else
3088 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3089 mpz_clrbit (result->value.integer, i);
3091 for (i = bitsize - 1; i >= ashift; i--)
3093 if (bits[i] == 0)
3094 mpz_clrbit (result->value.integer, i - ashift);
3095 else
3096 mpz_setbit (result->value.integer, i - ashift);
3100 gfc_convert_mpz_to_signed (result->value.integer, bitsize);
3101 free (bits);
3103 return result;
3107 gfc_expr *
3108 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
3110 return simplify_shift (e, s, "ISHFT", false, 0);
3114 gfc_expr *
3115 gfc_simplify_lshift (gfc_expr *e, gfc_expr *s)
3117 return simplify_shift (e, s, "LSHIFT", false, 1);
3121 gfc_expr *
3122 gfc_simplify_rshift (gfc_expr *e, gfc_expr *s)
3124 return simplify_shift (e, s, "RSHIFT", true, -1);
3128 gfc_expr *
3129 gfc_simplify_shifta (gfc_expr *e, gfc_expr *s)
3131 return simplify_shift (e, s, "SHIFTA", true, -1);
3135 gfc_expr *
3136 gfc_simplify_shiftl (gfc_expr *e, gfc_expr *s)
3138 return simplify_shift (e, s, "SHIFTL", false, 1);
3142 gfc_expr *
3143 gfc_simplify_shiftr (gfc_expr *e, gfc_expr *s)
3145 return simplify_shift (e, s, "SHIFTR", false, -1);
3149 gfc_expr *
3150 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
3152 gfc_expr *result;
3153 int shift, ashift, isize, ssize, delta, k;
3154 int i, *bits;
3156 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3157 return NULL;
3159 gfc_extract_int (s, &shift);
3161 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3162 isize = gfc_integer_kinds[k].bit_size;
3164 if (sz != NULL)
3166 if (sz->expr_type != EXPR_CONSTANT)
3167 return NULL;
3169 gfc_extract_int (sz, &ssize);
3172 else
3173 ssize = isize;
3175 if (shift >= 0)
3176 ashift = shift;
3177 else
3178 ashift = -shift;
3180 if (ashift > ssize)
3182 if (sz == NULL)
3183 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3184 "BIT_SIZE of first argument at %L", &s->where);
3185 return &gfc_bad_expr;
3188 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3190 mpz_set (result->value.integer, e->value.integer);
3192 if (shift == 0)
3193 return result;
3195 convert_mpz_to_unsigned (result->value.integer, isize);
3197 bits = XCNEWVEC (int, ssize);
3199 for (i = 0; i < ssize; i++)
3200 bits[i] = mpz_tstbit (e->value.integer, i);
3202 delta = ssize - ashift;
3204 if (shift > 0)
3206 for (i = 0; i < delta; i++)
3208 if (bits[i] == 0)
3209 mpz_clrbit (result->value.integer, i + shift);
3210 else
3211 mpz_setbit (result->value.integer, i + shift);
3214 for (i = delta; i < ssize; i++)
3216 if (bits[i] == 0)
3217 mpz_clrbit (result->value.integer, i - delta);
3218 else
3219 mpz_setbit (result->value.integer, i - delta);
3222 else
3224 for (i = 0; i < ashift; i++)
3226 if (bits[i] == 0)
3227 mpz_clrbit (result->value.integer, i + delta);
3228 else
3229 mpz_setbit (result->value.integer, i + delta);
3232 for (i = ashift; i < ssize; i++)
3234 if (bits[i] == 0)
3235 mpz_clrbit (result->value.integer, i + shift);
3236 else
3237 mpz_setbit (result->value.integer, i + shift);
3241 gfc_convert_mpz_to_signed (result->value.integer, isize);
3243 free (bits);
3244 return result;
3248 gfc_expr *
3249 gfc_simplify_kind (gfc_expr *e)
3251 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
3255 static gfc_expr *
3256 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
3257 gfc_array_spec *as, gfc_ref *ref, bool coarray)
3259 gfc_expr *l, *u, *result;
3260 int k;
3262 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3263 gfc_default_integer_kind);
3264 if (k == -1)
3265 return &gfc_bad_expr;
3267 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3269 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3270 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3271 if (!coarray && array->expr_type != EXPR_VARIABLE)
3273 if (upper)
3275 gfc_expr* dim = result;
3276 mpz_set_si (dim->value.integer, d);
3278 result = simplify_size (array, dim, k);
3279 gfc_free_expr (dim);
3280 if (!result)
3281 goto returnNull;
3283 else
3284 mpz_set_si (result->value.integer, 1);
3286 goto done;
3289 /* Otherwise, we have a variable expression. */
3290 gcc_assert (array->expr_type == EXPR_VARIABLE);
3291 gcc_assert (as);
3293 if (!gfc_resolve_array_spec (as, 0))
3294 return NULL;
3296 /* The last dimension of an assumed-size array is special. */
3297 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
3298 || (coarray && d == as->rank + as->corank
3299 && (!upper || gfc_option.coarray == GFC_FCOARRAY_SINGLE)))
3301 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
3303 gfc_free_expr (result);
3304 return gfc_copy_expr (as->lower[d-1]);
3307 goto returnNull;
3310 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3312 /* Then, we need to know the extent of the given dimension. */
3313 if (coarray || ref->u.ar.type == AR_FULL)
3315 l = as->lower[d-1];
3316 u = as->upper[d-1];
3318 if (l->expr_type != EXPR_CONSTANT || u == NULL
3319 || u->expr_type != EXPR_CONSTANT)
3320 goto returnNull;
3322 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
3324 /* Zero extent. */
3325 if (upper)
3326 mpz_set_si (result->value.integer, 0);
3327 else
3328 mpz_set_si (result->value.integer, 1);
3330 else
3332 /* Nonzero extent. */
3333 if (upper)
3334 mpz_set (result->value.integer, u->value.integer);
3335 else
3336 mpz_set (result->value.integer, l->value.integer);
3339 else
3341 if (upper)
3343 if (!gfc_ref_dimen_size (&ref->u.ar, d - 1, &result->value.integer, NULL))
3344 goto returnNull;
3346 else
3347 mpz_set_si (result->value.integer, (long int) 1);
3350 done:
3351 return range_check (result, upper ? "UBOUND" : "LBOUND");
3353 returnNull:
3354 gfc_free_expr (result);
3355 return NULL;
3359 static gfc_expr *
3360 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3362 gfc_ref *ref;
3363 gfc_array_spec *as;
3364 int d;
3366 if (array->ts.type == BT_CLASS)
3367 return NULL;
3369 if (array->expr_type != EXPR_VARIABLE)
3371 as = NULL;
3372 ref = NULL;
3373 goto done;
3376 /* Follow any component references. */
3377 as = array->symtree->n.sym->as;
3378 for (ref = array->ref; ref; ref = ref->next)
3380 switch (ref->type)
3382 case REF_ARRAY:
3383 switch (ref->u.ar.type)
3385 case AR_ELEMENT:
3386 as = NULL;
3387 continue;
3389 case AR_FULL:
3390 /* We're done because 'as' has already been set in the
3391 previous iteration. */
3392 if (!ref->next)
3393 goto done;
3395 /* Fall through. */
3397 case AR_UNKNOWN:
3398 return NULL;
3400 case AR_SECTION:
3401 as = ref->u.ar.as;
3402 goto done;
3405 gcc_unreachable ();
3407 case REF_COMPONENT:
3408 as = ref->u.c.component->as;
3409 continue;
3411 case REF_SUBSTRING:
3412 continue;
3416 gcc_unreachable ();
3418 done:
3420 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE
3421 || as->type == AS_ASSUMED_RANK))
3422 return NULL;
3424 if (dim == NULL)
3426 /* Multi-dimensional bounds. */
3427 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3428 gfc_expr *e;
3429 int k;
3431 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3432 if (upper && as && as->type == AS_ASSUMED_SIZE)
3434 /* An error message will be emitted in
3435 check_assumed_size_reference (resolve.c). */
3436 return &gfc_bad_expr;
3439 /* Simplify the bounds for each dimension. */
3440 for (d = 0; d < array->rank; d++)
3442 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
3443 false);
3444 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3446 int j;
3448 for (j = 0; j < d; j++)
3449 gfc_free_expr (bounds[j]);
3450 return bounds[d];
3454 /* Allocate the result expression. */
3455 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3456 gfc_default_integer_kind);
3457 if (k == -1)
3458 return &gfc_bad_expr;
3460 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
3462 /* The result is a rank 1 array; its size is the rank of the first
3463 argument to {L,U}BOUND. */
3464 e->rank = 1;
3465 e->shape = gfc_get_shape (1);
3466 mpz_init_set_ui (e->shape[0], array->rank);
3468 /* Create the constructor for this array. */
3469 for (d = 0; d < array->rank; d++)
3470 gfc_constructor_append_expr (&e->value.constructor,
3471 bounds[d], &e->where);
3473 return e;
3475 else
3477 /* A DIM argument is specified. */
3478 if (dim->expr_type != EXPR_CONSTANT)
3479 return NULL;
3481 d = mpz_get_si (dim->value.integer);
3483 if ((d < 1 || d > array->rank)
3484 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
3486 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3487 return &gfc_bad_expr;
3490 if (as && as->type == AS_ASSUMED_RANK)
3491 return NULL;
3493 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3498 static gfc_expr *
3499 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3501 gfc_ref *ref;
3502 gfc_array_spec *as;
3503 int d;
3505 if (array->expr_type != EXPR_VARIABLE)
3506 return NULL;
3508 /* Follow any component references. */
3509 as = (array->ts.type == BT_CLASS && array->ts.u.derived->components)
3510 ? array->ts.u.derived->components->as
3511 : array->symtree->n.sym->as;
3512 for (ref = array->ref; ref; ref = ref->next)
3514 switch (ref->type)
3516 case REF_ARRAY:
3517 switch (ref->u.ar.type)
3519 case AR_ELEMENT:
3520 if (ref->u.ar.as->corank > 0)
3522 gcc_assert (as == ref->u.ar.as);
3523 goto done;
3525 as = NULL;
3526 continue;
3528 case AR_FULL:
3529 /* We're done because 'as' has already been set in the
3530 previous iteration. */
3531 if (!ref->next)
3532 goto done;
3534 /* Fall through. */
3536 case AR_UNKNOWN:
3537 return NULL;
3539 case AR_SECTION:
3540 as = ref->u.ar.as;
3541 goto done;
3544 gcc_unreachable ();
3546 case REF_COMPONENT:
3547 as = ref->u.c.component->as;
3548 continue;
3550 case REF_SUBSTRING:
3551 continue;
3555 if (!as)
3556 gcc_unreachable ();
3558 done:
3560 if (as->cotype == AS_DEFERRED || as->cotype == AS_ASSUMED_SHAPE)
3561 return NULL;
3563 if (dim == NULL)
3565 /* Multi-dimensional cobounds. */
3566 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3567 gfc_expr *e;
3568 int k;
3570 /* Simplify the cobounds for each dimension. */
3571 for (d = 0; d < as->corank; d++)
3573 bounds[d] = simplify_bound_dim (array, kind, d + 1 + as->rank,
3574 upper, as, ref, true);
3575 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3577 int j;
3579 for (j = 0; j < d; j++)
3580 gfc_free_expr (bounds[j]);
3581 return bounds[d];
3585 /* Allocate the result expression. */
3586 e = gfc_get_expr ();
3587 e->where = array->where;
3588 e->expr_type = EXPR_ARRAY;
3589 e->ts.type = BT_INTEGER;
3590 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3591 gfc_default_integer_kind);
3592 if (k == -1)
3594 gfc_free_expr (e);
3595 return &gfc_bad_expr;
3597 e->ts.kind = k;
3599 /* The result is a rank 1 array; its size is the rank of the first
3600 argument to {L,U}COBOUND. */
3601 e->rank = 1;
3602 e->shape = gfc_get_shape (1);
3603 mpz_init_set_ui (e->shape[0], as->corank);
3605 /* Create the constructor for this array. */
3606 for (d = 0; d < as->corank; d++)
3607 gfc_constructor_append_expr (&e->value.constructor,
3608 bounds[d], &e->where);
3609 return e;
3611 else
3613 /* A DIM argument is specified. */
3614 if (dim->expr_type != EXPR_CONSTANT)
3615 return NULL;
3617 d = mpz_get_si (dim->value.integer);
3619 if (d < 1 || d > as->corank)
3621 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3622 return &gfc_bad_expr;
3625 return simplify_bound_dim (array, kind, d+as->rank, upper, as, ref, true);
3630 gfc_expr *
3631 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3633 return simplify_bound (array, dim, kind, 0);
3637 gfc_expr *
3638 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3640 return simplify_cobound (array, dim, kind, 0);
3643 gfc_expr *
3644 gfc_simplify_leadz (gfc_expr *e)
3646 unsigned long lz, bs;
3647 int i;
3649 if (e->expr_type != EXPR_CONSTANT)
3650 return NULL;
3652 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3653 bs = gfc_integer_kinds[i].bit_size;
3654 if (mpz_cmp_si (e->value.integer, 0) == 0)
3655 lz = bs;
3656 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3657 lz = 0;
3658 else
3659 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3661 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3665 gfc_expr *
3666 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3668 gfc_expr *result;
3669 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3671 if (k == -1)
3672 return &gfc_bad_expr;
3674 if (e->expr_type == EXPR_CONSTANT)
3676 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3677 mpz_set_si (result->value.integer, e->value.character.length);
3678 return range_check (result, "LEN");
3680 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3681 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3682 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3684 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3685 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3686 return range_check (result, "LEN");
3688 else
3689 return NULL;
3693 gfc_expr *
3694 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3696 gfc_expr *result;
3697 int count, len, i;
3698 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3700 if (k == -1)
3701 return &gfc_bad_expr;
3703 if (e->expr_type != EXPR_CONSTANT)
3704 return NULL;
3706 len = e->value.character.length;
3707 for (count = 0, i = 1; i <= len; i++)
3708 if (e->value.character.string[len - i] == ' ')
3709 count++;
3710 else
3711 break;
3713 result = gfc_get_int_expr (k, &e->where, len - count);
3714 return range_check (result, "LEN_TRIM");
3717 gfc_expr *
3718 gfc_simplify_lgamma (gfc_expr *x)
3720 gfc_expr *result;
3721 int sg;
3723 if (x->expr_type != EXPR_CONSTANT)
3724 return NULL;
3726 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3727 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
3729 return range_check (result, "LGAMMA");
3733 gfc_expr *
3734 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
3736 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3737 return NULL;
3739 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3740 gfc_compare_string (a, b) >= 0);
3744 gfc_expr *
3745 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
3747 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3748 return NULL;
3750 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3751 gfc_compare_string (a, b) > 0);
3755 gfc_expr *
3756 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
3758 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3759 return NULL;
3761 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3762 gfc_compare_string (a, b) <= 0);
3766 gfc_expr *
3767 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
3769 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3770 return NULL;
3772 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3773 gfc_compare_string (a, b) < 0);
3777 gfc_expr *
3778 gfc_simplify_log (gfc_expr *x)
3780 gfc_expr *result;
3782 if (x->expr_type != EXPR_CONSTANT)
3783 return NULL;
3785 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3787 switch (x->ts.type)
3789 case BT_REAL:
3790 if (mpfr_sgn (x->value.real) <= 0)
3792 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3793 "to zero", &x->where);
3794 gfc_free_expr (result);
3795 return &gfc_bad_expr;
3798 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
3799 break;
3801 case BT_COMPLEX:
3802 if ((mpfr_sgn (mpc_realref (x->value.complex)) == 0)
3803 && (mpfr_sgn (mpc_imagref (x->value.complex)) == 0))
3805 gfc_error ("Complex argument of LOG at %L cannot be zero",
3806 &x->where);
3807 gfc_free_expr (result);
3808 return &gfc_bad_expr;
3811 gfc_set_model_kind (x->ts.kind);
3812 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
3813 break;
3815 default:
3816 gfc_internal_error ("gfc_simplify_log: bad type");
3819 return range_check (result, "LOG");
3823 gfc_expr *
3824 gfc_simplify_log10 (gfc_expr *x)
3826 gfc_expr *result;
3828 if (x->expr_type != EXPR_CONSTANT)
3829 return NULL;
3831 if (mpfr_sgn (x->value.real) <= 0)
3833 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3834 "to zero", &x->where);
3835 return &gfc_bad_expr;
3838 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3839 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
3841 return range_check (result, "LOG10");
3845 gfc_expr *
3846 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
3848 int kind;
3850 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
3851 if (kind < 0)
3852 return &gfc_bad_expr;
3854 if (e->expr_type != EXPR_CONSTANT)
3855 return NULL;
3857 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
3861 gfc_expr*
3862 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
3864 gfc_expr *result;
3865 int row, result_rows, col, result_columns;
3866 int stride_a, offset_a, stride_b, offset_b;
3868 if (!is_constant_array_expr (matrix_a)
3869 || !is_constant_array_expr (matrix_b))
3870 return NULL;
3872 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
3873 result = gfc_get_array_expr (matrix_a->ts.type,
3874 matrix_a->ts.kind,
3875 &matrix_a->where);
3877 if (matrix_a->rank == 1 && matrix_b->rank == 2)
3879 result_rows = 1;
3880 result_columns = mpz_get_si (matrix_b->shape[1]);
3881 stride_a = 1;
3882 stride_b = mpz_get_si (matrix_b->shape[0]);
3884 result->rank = 1;
3885 result->shape = gfc_get_shape (result->rank);
3886 mpz_init_set_si (result->shape[0], result_columns);
3888 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
3890 result_rows = mpz_get_si (matrix_a->shape[0]);
3891 result_columns = 1;
3892 stride_a = mpz_get_si (matrix_a->shape[0]);
3893 stride_b = 1;
3895 result->rank = 1;
3896 result->shape = gfc_get_shape (result->rank);
3897 mpz_init_set_si (result->shape[0], result_rows);
3899 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
3901 result_rows = mpz_get_si (matrix_a->shape[0]);
3902 result_columns = mpz_get_si (matrix_b->shape[1]);
3903 stride_a = mpz_get_si (matrix_a->shape[0]);
3904 stride_b = mpz_get_si (matrix_b->shape[0]);
3906 result->rank = 2;
3907 result->shape = gfc_get_shape (result->rank);
3908 mpz_init_set_si (result->shape[0], result_rows);
3909 mpz_init_set_si (result->shape[1], result_columns);
3911 else
3912 gcc_unreachable();
3914 offset_a = offset_b = 0;
3915 for (col = 0; col < result_columns; ++col)
3917 offset_a = 0;
3919 for (row = 0; row < result_rows; ++row)
3921 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
3922 matrix_b, 1, offset_b, false);
3923 gfc_constructor_append_expr (&result->value.constructor,
3924 e, NULL);
3926 offset_a += 1;
3929 offset_b += stride_b;
3932 return result;
3936 gfc_expr *
3937 gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
3939 gfc_expr *result;
3940 int kind, arg, k;
3941 const char *s;
3943 if (i->expr_type != EXPR_CONSTANT)
3944 return NULL;
3946 kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind);
3947 if (kind == -1)
3948 return &gfc_bad_expr;
3949 k = gfc_validate_kind (BT_INTEGER, kind, false);
3951 s = gfc_extract_int (i, &arg);
3952 gcc_assert (!s);
3954 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
3956 /* MASKR(n) = 2^n - 1 */
3957 mpz_set_ui (result->value.integer, 1);
3958 mpz_mul_2exp (result->value.integer, result->value.integer, arg);
3959 mpz_sub_ui (result->value.integer, result->value.integer, 1);
3961 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
3963 return result;
3967 gfc_expr *
3968 gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
3970 gfc_expr *result;
3971 int kind, arg, k;
3972 const char *s;
3973 mpz_t z;
3975 if (i->expr_type != EXPR_CONSTANT)
3976 return NULL;
3978 kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind);
3979 if (kind == -1)
3980 return &gfc_bad_expr;
3981 k = gfc_validate_kind (BT_INTEGER, kind, false);
3983 s = gfc_extract_int (i, &arg);
3984 gcc_assert (!s);
3986 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
3988 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
3989 mpz_init_set_ui (z, 1);
3990 mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size);
3991 mpz_set_ui (result->value.integer, 1);
3992 mpz_mul_2exp (result->value.integer, result->value.integer,
3993 gfc_integer_kinds[k].bit_size - arg);
3994 mpz_sub (result->value.integer, z, result->value.integer);
3995 mpz_clear (z);
3997 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
3999 return result;
4003 gfc_expr *
4004 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
4006 gfc_expr * result;
4007 gfc_constructor *tsource_ctor, *fsource_ctor, *mask_ctor;
4009 if (mask->expr_type == EXPR_CONSTANT)
4010 return gfc_get_parentheses (gfc_copy_expr (mask->value.logical
4011 ? tsource : fsource));
4013 if (!mask->rank || !is_constant_array_expr (mask)
4014 || !is_constant_array_expr (tsource) || !is_constant_array_expr (fsource))
4015 return NULL;
4017 result = gfc_get_array_expr (tsource->ts.type, tsource->ts.kind,
4018 &tsource->where);
4019 if (tsource->ts.type == BT_DERIVED)
4020 result->ts.u.derived = tsource->ts.u.derived;
4021 else if (tsource->ts.type == BT_CHARACTER)
4022 result->ts.u.cl = tsource->ts.u.cl;
4024 tsource_ctor = gfc_constructor_first (tsource->value.constructor);
4025 fsource_ctor = gfc_constructor_first (fsource->value.constructor);
4026 mask_ctor = gfc_constructor_first (mask->value.constructor);
4028 while (mask_ctor)
4030 if (mask_ctor->expr->value.logical)
4031 gfc_constructor_append_expr (&result->value.constructor,
4032 gfc_copy_expr (tsource_ctor->expr),
4033 NULL);
4034 else
4035 gfc_constructor_append_expr (&result->value.constructor,
4036 gfc_copy_expr (fsource_ctor->expr),
4037 NULL);
4038 tsource_ctor = gfc_constructor_next (tsource_ctor);
4039 fsource_ctor = gfc_constructor_next (fsource_ctor);
4040 mask_ctor = gfc_constructor_next (mask_ctor);
4043 result->shape = gfc_get_shape (1);
4044 gfc_array_size (result, &result->shape[0]);
4046 return result;
4050 gfc_expr *
4051 gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr)
4053 mpz_t arg1, arg2, mask;
4054 gfc_expr *result;
4056 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT
4057 || mask_expr->expr_type != EXPR_CONSTANT)
4058 return NULL;
4060 result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where);
4062 /* Convert all argument to unsigned. */
4063 mpz_init_set (arg1, i->value.integer);
4064 mpz_init_set (arg2, j->value.integer);
4065 mpz_init_set (mask, mask_expr->value.integer);
4067 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4068 mpz_and (arg1, arg1, mask);
4069 mpz_com (mask, mask);
4070 mpz_and (arg2, arg2, mask);
4071 mpz_ior (result->value.integer, arg1, arg2);
4073 mpz_clear (arg1);
4074 mpz_clear (arg2);
4075 mpz_clear (mask);
4077 return result;
4081 /* Selects between current value and extremum for simplify_min_max
4082 and simplify_minval_maxval. */
4083 static void
4084 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
4086 switch (arg->ts.type)
4088 case BT_INTEGER:
4089 if (mpz_cmp (arg->value.integer,
4090 extremum->value.integer) * sign > 0)
4091 mpz_set (extremum->value.integer, arg->value.integer);
4092 break;
4094 case BT_REAL:
4095 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4096 if (sign > 0)
4097 mpfr_max (extremum->value.real, extremum->value.real,
4098 arg->value.real, GFC_RND_MODE);
4099 else
4100 mpfr_min (extremum->value.real, extremum->value.real,
4101 arg->value.real, GFC_RND_MODE);
4102 break;
4104 case BT_CHARACTER:
4105 #define LENGTH(x) ((x)->value.character.length)
4106 #define STRING(x) ((x)->value.character.string)
4107 if (LENGTH (extremum) < LENGTH(arg))
4109 gfc_char_t *tmp = STRING(extremum);
4111 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
4112 memcpy (STRING(extremum), tmp,
4113 LENGTH(extremum) * sizeof (gfc_char_t));
4114 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
4115 LENGTH(arg) - LENGTH(extremum));
4116 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
4117 LENGTH(extremum) = LENGTH(arg);
4118 free (tmp);
4121 if (gfc_compare_string (arg, extremum) * sign > 0)
4123 free (STRING(extremum));
4124 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
4125 memcpy (STRING(extremum), STRING(arg),
4126 LENGTH(arg) * sizeof (gfc_char_t));
4127 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
4128 LENGTH(extremum) - LENGTH(arg));
4129 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
4131 #undef LENGTH
4132 #undef STRING
4133 break;
4135 default:
4136 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4141 /* This function is special since MAX() can take any number of
4142 arguments. The simplified expression is a rewritten version of the
4143 argument list containing at most one constant element. Other
4144 constant elements are deleted. Because the argument list has
4145 already been checked, this function always succeeds. sign is 1 for
4146 MAX(), -1 for MIN(). */
4148 static gfc_expr *
4149 simplify_min_max (gfc_expr *expr, int sign)
4151 gfc_actual_arglist *arg, *last, *extremum;
4152 gfc_intrinsic_sym * specific;
4154 last = NULL;
4155 extremum = NULL;
4156 specific = expr->value.function.isym;
4158 arg = expr->value.function.actual;
4160 for (; arg; last = arg, arg = arg->next)
4162 if (arg->expr->expr_type != EXPR_CONSTANT)
4163 continue;
4165 if (extremum == NULL)
4167 extremum = arg;
4168 continue;
4171 min_max_choose (arg->expr, extremum->expr, sign);
4173 /* Delete the extra constant argument. */
4174 last->next = arg->next;
4176 arg->next = NULL;
4177 gfc_free_actual_arglist (arg);
4178 arg = last;
4181 /* If there is one value left, replace the function call with the
4182 expression. */
4183 if (expr->value.function.actual->next != NULL)
4184 return NULL;
4186 /* Convert to the correct type and kind. */
4187 if (expr->ts.type != BT_UNKNOWN)
4188 return gfc_convert_constant (expr->value.function.actual->expr,
4189 expr->ts.type, expr->ts.kind);
4191 if (specific->ts.type != BT_UNKNOWN)
4192 return gfc_convert_constant (expr->value.function.actual->expr,
4193 specific->ts.type, specific->ts.kind);
4195 return gfc_copy_expr (expr->value.function.actual->expr);
4199 gfc_expr *
4200 gfc_simplify_min (gfc_expr *e)
4202 return simplify_min_max (e, -1);
4206 gfc_expr *
4207 gfc_simplify_max (gfc_expr *e)
4209 return simplify_min_max (e, 1);
4213 /* This is a simplified version of simplify_min_max to provide
4214 simplification of minval and maxval for a vector. */
4216 static gfc_expr *
4217 simplify_minval_maxval (gfc_expr *expr, int sign)
4219 gfc_constructor *c, *extremum;
4220 gfc_intrinsic_sym * specific;
4222 extremum = NULL;
4223 specific = expr->value.function.isym;
4225 for (c = gfc_constructor_first (expr->value.constructor);
4226 c; c = gfc_constructor_next (c))
4228 if (c->expr->expr_type != EXPR_CONSTANT)
4229 return NULL;
4231 if (extremum == NULL)
4233 extremum = c;
4234 continue;
4237 min_max_choose (c->expr, extremum->expr, sign);
4240 if (extremum == NULL)
4241 return NULL;
4243 /* Convert to the correct type and kind. */
4244 if (expr->ts.type != BT_UNKNOWN)
4245 return gfc_convert_constant (extremum->expr,
4246 expr->ts.type, expr->ts.kind);
4248 if (specific->ts.type != BT_UNKNOWN)
4249 return gfc_convert_constant (extremum->expr,
4250 specific->ts.type, specific->ts.kind);
4252 return gfc_copy_expr (extremum->expr);
4256 gfc_expr *
4257 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4259 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4260 return NULL;
4262 return simplify_minval_maxval (array, -1);
4266 gfc_expr *
4267 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4269 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4270 return NULL;
4272 return simplify_minval_maxval (array, 1);
4276 gfc_expr *
4277 gfc_simplify_maxexponent (gfc_expr *x)
4279 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4280 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4281 gfc_real_kinds[i].max_exponent);
4285 gfc_expr *
4286 gfc_simplify_minexponent (gfc_expr *x)
4288 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4289 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4290 gfc_real_kinds[i].min_exponent);
4294 gfc_expr *
4295 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
4297 gfc_expr *result;
4298 int kind;
4300 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4301 return NULL;
4303 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4304 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4306 switch (a->ts.type)
4308 case BT_INTEGER:
4309 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4311 /* Result is processor-dependent. */
4312 gfc_error ("Second argument MOD at %L is zero", &a->where);
4313 gfc_free_expr (result);
4314 return &gfc_bad_expr;
4316 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
4317 break;
4319 case BT_REAL:
4320 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4322 /* Result is processor-dependent. */
4323 gfc_error ("Second argument of MOD at %L is zero", &p->where);
4324 gfc_free_expr (result);
4325 return &gfc_bad_expr;
4328 gfc_set_model_kind (kind);
4329 mpfr_fmod (result->value.real, a->value.real, p->value.real,
4330 GFC_RND_MODE);
4331 break;
4333 default:
4334 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4337 return range_check (result, "MOD");
4341 gfc_expr *
4342 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
4344 gfc_expr *result;
4345 int kind;
4347 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4348 return NULL;
4350 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4351 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4353 switch (a->ts.type)
4355 case BT_INTEGER:
4356 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4358 /* Result is processor-dependent. This processor just opts
4359 to not handle it at all. */
4360 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
4361 gfc_free_expr (result);
4362 return &gfc_bad_expr;
4364 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
4366 break;
4368 case BT_REAL:
4369 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4371 /* Result is processor-dependent. */
4372 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
4373 gfc_free_expr (result);
4374 return &gfc_bad_expr;
4377 gfc_set_model_kind (kind);
4378 mpfr_fmod (result->value.real, a->value.real, p->value.real,
4379 GFC_RND_MODE);
4380 if (mpfr_cmp_ui (result->value.real, 0) != 0)
4382 if (mpfr_signbit (a->value.real) != mpfr_signbit (p->value.real))
4383 mpfr_add (result->value.real, result->value.real, p->value.real,
4384 GFC_RND_MODE);
4386 else
4387 mpfr_copysign (result->value.real, result->value.real,
4388 p->value.real, GFC_RND_MODE);
4389 break;
4391 default:
4392 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4395 return range_check (result, "MODULO");
4399 /* Exists for the sole purpose of consistency with other intrinsics. */
4400 gfc_expr *
4401 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
4402 gfc_expr *fp ATTRIBUTE_UNUSED,
4403 gfc_expr *l ATTRIBUTE_UNUSED,
4404 gfc_expr *to ATTRIBUTE_UNUSED,
4405 gfc_expr *tp ATTRIBUTE_UNUSED)
4407 return NULL;
4411 gfc_expr *
4412 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
4414 gfc_expr *result;
4415 mp_exp_t emin, emax;
4416 int kind;
4418 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
4419 return NULL;
4421 result = gfc_copy_expr (x);
4423 /* Save current values of emin and emax. */
4424 emin = mpfr_get_emin ();
4425 emax = mpfr_get_emax ();
4427 /* Set emin and emax for the current model number. */
4428 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
4429 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
4430 mpfr_get_prec(result->value.real) + 1);
4431 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
4432 mpfr_check_range (result->value.real, 0, GMP_RNDU);
4434 if (mpfr_sgn (s->value.real) > 0)
4436 mpfr_nextabove (result->value.real);
4437 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
4439 else
4441 mpfr_nextbelow (result->value.real);
4442 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
4445 mpfr_set_emin (emin);
4446 mpfr_set_emax (emax);
4448 /* Only NaN can occur. Do not use range check as it gives an
4449 error for denormal numbers. */
4450 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
4452 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
4453 gfc_free_expr (result);
4454 return &gfc_bad_expr;
4457 return result;
4461 static gfc_expr *
4462 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
4464 gfc_expr *itrunc, *result;
4465 int kind;
4467 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4468 if (kind == -1)
4469 return &gfc_bad_expr;
4471 if (e->expr_type != EXPR_CONSTANT)
4472 return NULL;
4474 itrunc = gfc_copy_expr (e);
4475 mpfr_round (itrunc->value.real, e->value.real);
4477 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4478 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4480 gfc_free_expr (itrunc);
4482 return range_check (result, name);
4486 gfc_expr *
4487 gfc_simplify_new_line (gfc_expr *e)
4489 gfc_expr *result;
4491 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4492 result->value.character.string[0] = '\n';
4494 return result;
4498 gfc_expr *
4499 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4501 return simplify_nint ("NINT", e, k);
4505 gfc_expr *
4506 gfc_simplify_idnint (gfc_expr *e)
4508 return simplify_nint ("IDNINT", e, NULL);
4512 static gfc_expr *
4513 add_squared (gfc_expr *result, gfc_expr *e)
4515 mpfr_t tmp;
4517 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4518 gcc_assert (result->ts.type == BT_REAL
4519 && result->expr_type == EXPR_CONSTANT);
4521 gfc_set_model_kind (result->ts.kind);
4522 mpfr_init (tmp);
4523 mpfr_pow_ui (tmp, e->value.real, 2, GFC_RND_MODE);
4524 mpfr_add (result->value.real, result->value.real, tmp,
4525 GFC_RND_MODE);
4526 mpfr_clear (tmp);
4528 return result;
4532 static gfc_expr *
4533 do_sqrt (gfc_expr *result, gfc_expr *e)
4535 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4536 gcc_assert (result->ts.type == BT_REAL
4537 && result->expr_type == EXPR_CONSTANT);
4539 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
4540 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4541 return result;
4545 gfc_expr *
4546 gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
4548 gfc_expr *result;
4550 if (!is_constant_array_expr (e)
4551 || (dim != NULL && !gfc_is_constant_expr (dim)))
4552 return NULL;
4554 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
4555 init_result_expr (result, 0, NULL);
4557 if (!dim || e->rank == 1)
4559 result = simplify_transformation_to_scalar (result, e, NULL,
4560 add_squared);
4561 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4563 else
4564 result = simplify_transformation_to_array (result, e, dim, NULL,
4565 add_squared, &do_sqrt);
4567 return result;
4571 gfc_expr *
4572 gfc_simplify_not (gfc_expr *e)
4574 gfc_expr *result;
4576 if (e->expr_type != EXPR_CONSTANT)
4577 return NULL;
4579 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4580 mpz_com (result->value.integer, e->value.integer);
4582 return range_check (result, "NOT");
4586 gfc_expr *
4587 gfc_simplify_null (gfc_expr *mold)
4589 gfc_expr *result;
4591 if (mold)
4593 result = gfc_copy_expr (mold);
4594 result->expr_type = EXPR_NULL;
4596 else
4597 result = gfc_get_null_expr (NULL);
4599 return result;
4603 gfc_expr *
4604 gfc_simplify_num_images (gfc_expr *distance ATTRIBUTE_UNUSED, gfc_expr *failed)
4606 gfc_expr *result;
4608 if (gfc_option.coarray == GFC_FCOARRAY_NONE)
4610 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
4611 return &gfc_bad_expr;
4614 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE)
4615 return NULL;
4617 if (failed && failed->expr_type != EXPR_CONSTANT)
4618 return NULL;
4620 /* FIXME: gfc_current_locus is wrong. */
4621 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4622 &gfc_current_locus);
4624 if (failed && failed->value.logical != 0)
4625 mpz_set_si (result->value.integer, 0);
4626 else
4627 mpz_set_si (result->value.integer, 1);
4629 return result;
4633 gfc_expr *
4634 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4636 gfc_expr *result;
4637 int kind;
4639 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4640 return NULL;
4642 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4644 switch (x->ts.type)
4646 case BT_INTEGER:
4647 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4648 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4649 return range_check (result, "OR");
4651 case BT_LOGICAL:
4652 return gfc_get_logical_expr (kind, &x->where,
4653 x->value.logical || y->value.logical);
4654 default:
4655 gcc_unreachable();
4660 gfc_expr *
4661 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4663 gfc_expr *result;
4664 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4666 if (!is_constant_array_expr (array)
4667 || !is_constant_array_expr (vector)
4668 || (!gfc_is_constant_expr (mask)
4669 && !is_constant_array_expr (mask)))
4670 return NULL;
4672 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4673 if (array->ts.type == BT_DERIVED)
4674 result->ts.u.derived = array->ts.u.derived;
4676 array_ctor = gfc_constructor_first (array->value.constructor);
4677 vector_ctor = vector
4678 ? gfc_constructor_first (vector->value.constructor)
4679 : NULL;
4681 if (mask->expr_type == EXPR_CONSTANT
4682 && mask->value.logical)
4684 /* Copy all elements of ARRAY to RESULT. */
4685 while (array_ctor)
4687 gfc_constructor_append_expr (&result->value.constructor,
4688 gfc_copy_expr (array_ctor->expr),
4689 NULL);
4691 array_ctor = gfc_constructor_next (array_ctor);
4692 vector_ctor = gfc_constructor_next (vector_ctor);
4695 else if (mask->expr_type == EXPR_ARRAY)
4697 /* Copy only those elements of ARRAY to RESULT whose
4698 MASK equals .TRUE.. */
4699 mask_ctor = gfc_constructor_first (mask->value.constructor);
4700 while (mask_ctor)
4702 if (mask_ctor->expr->value.logical)
4704 gfc_constructor_append_expr (&result->value.constructor,
4705 gfc_copy_expr (array_ctor->expr),
4706 NULL);
4707 vector_ctor = gfc_constructor_next (vector_ctor);
4710 array_ctor = gfc_constructor_next (array_ctor);
4711 mask_ctor = gfc_constructor_next (mask_ctor);
4715 /* Append any left-over elements from VECTOR to RESULT. */
4716 while (vector_ctor)
4718 gfc_constructor_append_expr (&result->value.constructor,
4719 gfc_copy_expr (vector_ctor->expr),
4720 NULL);
4721 vector_ctor = gfc_constructor_next (vector_ctor);
4724 result->shape = gfc_get_shape (1);
4725 gfc_array_size (result, &result->shape[0]);
4727 if (array->ts.type == BT_CHARACTER)
4728 result->ts.u.cl = array->ts.u.cl;
4730 return result;
4734 static gfc_expr *
4735 do_xor (gfc_expr *result, gfc_expr *e)
4737 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
4738 gcc_assert (result->ts.type == BT_LOGICAL
4739 && result->expr_type == EXPR_CONSTANT);
4741 result->value.logical = result->value.logical != e->value.logical;
4742 return result;
4747 gfc_expr *
4748 gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
4750 return simplify_transformation (e, dim, NULL, 0, do_xor);
4754 gfc_expr *
4755 gfc_simplify_popcnt (gfc_expr *e)
4757 int res, k;
4758 mpz_t x;
4760 if (e->expr_type != EXPR_CONSTANT)
4761 return NULL;
4763 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4765 /* Convert argument to unsigned, then count the '1' bits. */
4766 mpz_init_set (x, e->value.integer);
4767 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
4768 res = mpz_popcount (x);
4769 mpz_clear (x);
4771 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res);
4775 gfc_expr *
4776 gfc_simplify_poppar (gfc_expr *e)
4778 gfc_expr *popcnt;
4779 const char *s;
4780 int i;
4782 if (e->expr_type != EXPR_CONSTANT)
4783 return NULL;
4785 popcnt = gfc_simplify_popcnt (e);
4786 gcc_assert (popcnt);
4788 s = gfc_extract_int (popcnt, &i);
4789 gcc_assert (!s);
4791 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2);
4795 gfc_expr *
4796 gfc_simplify_precision (gfc_expr *e)
4798 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4799 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
4800 gfc_real_kinds[i].precision);
4804 gfc_expr *
4805 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
4807 return simplify_transformation (array, dim, mask, 1, gfc_multiply);
4811 gfc_expr *
4812 gfc_simplify_radix (gfc_expr *e)
4814 int i;
4815 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4817 switch (e->ts.type)
4819 case BT_INTEGER:
4820 i = gfc_integer_kinds[i].radix;
4821 break;
4823 case BT_REAL:
4824 i = gfc_real_kinds[i].radix;
4825 break;
4827 default:
4828 gcc_unreachable ();
4831 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4835 gfc_expr *
4836 gfc_simplify_range (gfc_expr *e)
4838 int i;
4839 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4841 switch (e->ts.type)
4843 case BT_INTEGER:
4844 i = gfc_integer_kinds[i].range;
4845 break;
4847 case BT_REAL:
4848 case BT_COMPLEX:
4849 i = gfc_real_kinds[i].range;
4850 break;
4852 default:
4853 gcc_unreachable ();
4856 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4860 gfc_expr *
4861 gfc_simplify_rank (gfc_expr *e)
4863 /* Assumed rank. */
4864 if (e->rank == -1)
4865 return NULL;
4867 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, e->rank);
4871 gfc_expr *
4872 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
4874 gfc_expr *result = NULL;
4875 int kind;
4877 if (e->ts.type == BT_COMPLEX)
4878 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
4879 else
4880 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
4882 if (kind == -1)
4883 return &gfc_bad_expr;
4885 if (e->expr_type != EXPR_CONSTANT)
4886 return NULL;
4888 if (convert_boz (e, kind) == &gfc_bad_expr)
4889 return &gfc_bad_expr;
4891 result = gfc_convert_constant (e, BT_REAL, kind);
4892 if (result == &gfc_bad_expr)
4893 return &gfc_bad_expr;
4895 return range_check (result, "REAL");
4899 gfc_expr *
4900 gfc_simplify_realpart (gfc_expr *e)
4902 gfc_expr *result;
4904 if (e->expr_type != EXPR_CONSTANT)
4905 return NULL;
4907 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
4908 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
4910 return range_check (result, "REALPART");
4913 gfc_expr *
4914 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
4916 gfc_expr *result;
4917 int i, j, len, ncop, nlen;
4918 mpz_t ncopies;
4919 bool have_length = false;
4921 /* If NCOPIES isn't a constant, there's nothing we can do. */
4922 if (n->expr_type != EXPR_CONSTANT)
4923 return NULL;
4925 /* If NCOPIES is negative, it's an error. */
4926 if (mpz_sgn (n->value.integer) < 0)
4928 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4929 &n->where);
4930 return &gfc_bad_expr;
4933 /* If we don't know the character length, we can do no more. */
4934 if (e->ts.u.cl && e->ts.u.cl->length
4935 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
4937 len = mpz_get_si (e->ts.u.cl->length->value.integer);
4938 have_length = true;
4940 else if (e->expr_type == EXPR_CONSTANT
4941 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
4943 len = e->value.character.length;
4945 else
4946 return NULL;
4948 /* If the source length is 0, any value of NCOPIES is valid
4949 and everything behaves as if NCOPIES == 0. */
4950 mpz_init (ncopies);
4951 if (len == 0)
4952 mpz_set_ui (ncopies, 0);
4953 else
4954 mpz_set (ncopies, n->value.integer);
4956 /* Check that NCOPIES isn't too large. */
4957 if (len)
4959 mpz_t max, mlen;
4960 int i;
4962 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4963 mpz_init (max);
4964 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4966 if (have_length)
4968 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
4969 e->ts.u.cl->length->value.integer);
4971 else
4973 mpz_init_set_si (mlen, len);
4974 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
4975 mpz_clear (mlen);
4978 /* The check itself. */
4979 if (mpz_cmp (ncopies, max) > 0)
4981 mpz_clear (max);
4982 mpz_clear (ncopies);
4983 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4984 &n->where);
4985 return &gfc_bad_expr;
4988 mpz_clear (max);
4990 mpz_clear (ncopies);
4992 /* For further simplification, we need the character string to be
4993 constant. */
4994 if (e->expr_type != EXPR_CONSTANT)
4995 return NULL;
4997 if (len ||
4998 (e->ts.u.cl->length &&
4999 mpz_sgn (e->ts.u.cl->length->value.integer)) != 0)
5001 const char *res = gfc_extract_int (n, &ncop);
5002 gcc_assert (res == NULL);
5004 else
5005 ncop = 0;
5007 if (ncop == 0)
5008 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
5010 len = e->value.character.length;
5011 nlen = ncop * len;
5013 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
5014 for (i = 0; i < ncop; i++)
5015 for (j = 0; j < len; j++)
5016 result->value.character.string[j+i*len]= e->value.character.string[j];
5018 result->value.character.string[nlen] = '\0'; /* For debugger */
5019 return result;
5023 /* This one is a bear, but mainly has to do with shuffling elements. */
5025 gfc_expr *
5026 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
5027 gfc_expr *pad, gfc_expr *order_exp)
5029 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
5030 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
5031 mpz_t index, size;
5032 unsigned long j;
5033 size_t nsource;
5034 gfc_expr *e, *result;
5036 /* Check that argument expression types are OK. */
5037 if (!is_constant_array_expr (source)
5038 || !is_constant_array_expr (shape_exp)
5039 || !is_constant_array_expr (pad)
5040 || !is_constant_array_expr (order_exp))
5041 return NULL;
5043 /* Proceed with simplification, unpacking the array. */
5045 mpz_init (index);
5046 rank = 0;
5048 for (;;)
5050 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
5051 if (e == NULL)
5052 break;
5054 gfc_extract_int (e, &shape[rank]);
5056 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
5057 gcc_assert (shape[rank] >= 0);
5059 rank++;
5062 gcc_assert (rank > 0);
5064 /* Now unpack the order array if present. */
5065 if (order_exp == NULL)
5067 for (i = 0; i < rank; i++)
5068 order[i] = i;
5070 else
5072 for (i = 0; i < rank; i++)
5073 x[i] = 0;
5075 for (i = 0; i < rank; i++)
5077 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
5078 gcc_assert (e);
5080 gfc_extract_int (e, &order[i]);
5082 gcc_assert (order[i] >= 1 && order[i] <= rank);
5083 order[i]--;
5084 gcc_assert (x[order[i]] == 0);
5085 x[order[i]] = 1;
5089 /* Count the elements in the source and padding arrays. */
5091 npad = 0;
5092 if (pad != NULL)
5094 gfc_array_size (pad, &size);
5095 npad = mpz_get_ui (size);
5096 mpz_clear (size);
5099 gfc_array_size (source, &size);
5100 nsource = mpz_get_ui (size);
5101 mpz_clear (size);
5103 /* If it weren't for that pesky permutation we could just loop
5104 through the source and round out any shortage with pad elements.
5105 But no, someone just had to have the compiler do something the
5106 user should be doing. */
5108 for (i = 0; i < rank; i++)
5109 x[i] = 0;
5111 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5112 &source->where);
5113 if (source->ts.type == BT_DERIVED)
5114 result->ts.u.derived = source->ts.u.derived;
5115 result->rank = rank;
5116 result->shape = gfc_get_shape (rank);
5117 for (i = 0; i < rank; i++)
5118 mpz_init_set_ui (result->shape[i], shape[i]);
5120 while (nsource > 0 || npad > 0)
5122 /* Figure out which element to extract. */
5123 mpz_set_ui (index, 0);
5125 for (i = rank - 1; i >= 0; i--)
5127 mpz_add_ui (index, index, x[order[i]]);
5128 if (i != 0)
5129 mpz_mul_ui (index, index, shape[order[i - 1]]);
5132 if (mpz_cmp_ui (index, INT_MAX) > 0)
5133 gfc_internal_error ("Reshaped array too large at %C");
5135 j = mpz_get_ui (index);
5137 if (j < nsource)
5138 e = gfc_constructor_lookup_expr (source->value.constructor, j);
5139 else
5141 gcc_assert (npad > 0);
5143 j = j - nsource;
5144 j = j % npad;
5145 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
5147 gcc_assert (e);
5149 gfc_constructor_append_expr (&result->value.constructor,
5150 gfc_copy_expr (e), &e->where);
5152 /* Calculate the next element. */
5153 i = 0;
5155 inc:
5156 if (++x[i] < shape[i])
5157 continue;
5158 x[i++] = 0;
5159 if (i < rank)
5160 goto inc;
5162 break;
5165 mpz_clear (index);
5167 return result;
5171 gfc_expr *
5172 gfc_simplify_rrspacing (gfc_expr *x)
5174 gfc_expr *result;
5175 int i;
5176 long int e, p;
5178 if (x->expr_type != EXPR_CONSTANT)
5179 return NULL;
5181 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5183 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5184 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5186 /* Special case x = -0 and 0. */
5187 if (mpfr_sgn (result->value.real) == 0)
5189 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5190 return result;
5193 /* | x * 2**(-e) | * 2**p. */
5194 e = - (long int) mpfr_get_exp (x->value.real);
5195 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
5197 p = (long int) gfc_real_kinds[i].digits;
5198 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
5200 return range_check (result, "RRSPACING");
5204 gfc_expr *
5205 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
5207 int k, neg_flag, power, exp_range;
5208 mpfr_t scale, radix;
5209 gfc_expr *result;
5211 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5212 return NULL;
5214 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5216 if (mpfr_sgn (x->value.real) == 0)
5218 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5219 return result;
5222 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
5224 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
5226 /* This check filters out values of i that would overflow an int. */
5227 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
5228 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
5230 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
5231 gfc_free_expr (result);
5232 return &gfc_bad_expr;
5235 /* Compute scale = radix ** power. */
5236 power = mpz_get_si (i->value.integer);
5238 if (power >= 0)
5239 neg_flag = 0;
5240 else
5242 neg_flag = 1;
5243 power = -power;
5246 gfc_set_model_kind (x->ts.kind);
5247 mpfr_init (scale);
5248 mpfr_init (radix);
5249 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
5250 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
5252 if (neg_flag)
5253 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
5254 else
5255 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
5257 mpfr_clears (scale, radix, NULL);
5259 return range_check (result, "SCALE");
5263 /* Variants of strspn and strcspn that operate on wide characters. */
5265 static size_t
5266 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
5268 size_t i = 0;
5269 const gfc_char_t *c;
5271 while (s1[i])
5273 for (c = s2; *c; c++)
5275 if (s1[i] == *c)
5276 break;
5278 if (*c == '\0')
5279 break;
5280 i++;
5283 return i;
5286 static size_t
5287 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
5289 size_t i = 0;
5290 const gfc_char_t *c;
5292 while (s1[i])
5294 for (c = s2; *c; c++)
5296 if (s1[i] == *c)
5297 break;
5299 if (*c)
5300 break;
5301 i++;
5304 return i;
5308 gfc_expr *
5309 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
5311 gfc_expr *result;
5312 int back;
5313 size_t i;
5314 size_t indx, len, lenc;
5315 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
5317 if (k == -1)
5318 return &gfc_bad_expr;
5320 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT
5321 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
5322 return NULL;
5324 if (b != NULL && b->value.logical != 0)
5325 back = 1;
5326 else
5327 back = 0;
5329 len = e->value.character.length;
5330 lenc = c->value.character.length;
5332 if (len == 0 || lenc == 0)
5334 indx = 0;
5336 else
5338 if (back == 0)
5340 indx = wide_strcspn (e->value.character.string,
5341 c->value.character.string) + 1;
5342 if (indx > len)
5343 indx = 0;
5345 else
5347 i = 0;
5348 for (indx = len; indx > 0; indx--)
5350 for (i = 0; i < lenc; i++)
5352 if (c->value.character.string[i]
5353 == e->value.character.string[indx - 1])
5354 break;
5356 if (i < lenc)
5357 break;
5362 result = gfc_get_int_expr (k, &e->where, indx);
5363 return range_check (result, "SCAN");
5367 gfc_expr *
5368 gfc_simplify_selected_char_kind (gfc_expr *e)
5370 int kind;
5372 if (e->expr_type != EXPR_CONSTANT)
5373 return NULL;
5375 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
5376 || gfc_compare_with_Cstring (e, "default", false) == 0)
5377 kind = 1;
5378 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
5379 kind = 4;
5380 else
5381 kind = -1;
5383 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5387 gfc_expr *
5388 gfc_simplify_selected_int_kind (gfc_expr *e)
5390 int i, kind, range;
5392 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
5393 return NULL;
5395 kind = INT_MAX;
5397 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
5398 if (gfc_integer_kinds[i].range >= range
5399 && gfc_integer_kinds[i].kind < kind)
5400 kind = gfc_integer_kinds[i].kind;
5402 if (kind == INT_MAX)
5403 kind = -1;
5405 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5409 gfc_expr *
5410 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
5412 int range, precision, radix, i, kind, found_precision, found_range,
5413 found_radix;
5414 locus *loc = &gfc_current_locus;
5416 if (p == NULL)
5417 precision = 0;
5418 else
5420 if (p->expr_type != EXPR_CONSTANT
5421 || gfc_extract_int (p, &precision) != NULL)
5422 return NULL;
5423 loc = &p->where;
5426 if (q == NULL)
5427 range = 0;
5428 else
5430 if (q->expr_type != EXPR_CONSTANT
5431 || gfc_extract_int (q, &range) != NULL)
5432 return NULL;
5434 if (!loc)
5435 loc = &q->where;
5438 if (rdx == NULL)
5439 radix = 0;
5440 else
5442 if (rdx->expr_type != EXPR_CONSTANT
5443 || gfc_extract_int (rdx, &radix) != NULL)
5444 return NULL;
5446 if (!loc)
5447 loc = &rdx->where;
5450 kind = INT_MAX;
5451 found_precision = 0;
5452 found_range = 0;
5453 found_radix = 0;
5455 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
5457 if (gfc_real_kinds[i].precision >= precision)
5458 found_precision = 1;
5460 if (gfc_real_kinds[i].range >= range)
5461 found_range = 1;
5463 if (radix == 0 || gfc_real_kinds[i].radix == radix)
5464 found_radix = 1;
5466 if (gfc_real_kinds[i].precision >= precision
5467 && gfc_real_kinds[i].range >= range
5468 && (radix == 0 || gfc_real_kinds[i].radix == radix)
5469 && gfc_real_kinds[i].kind < kind)
5470 kind = gfc_real_kinds[i].kind;
5473 if (kind == INT_MAX)
5475 if (found_radix && found_range && !found_precision)
5476 kind = -1;
5477 else if (found_radix && found_precision && !found_range)
5478 kind = -2;
5479 else if (found_radix && !found_precision && !found_range)
5480 kind = -3;
5481 else if (found_radix)
5482 kind = -4;
5483 else
5484 kind = -5;
5487 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
5491 gfc_expr *
5492 gfc_simplify_ieee_selected_real_kind (gfc_expr *expr)
5494 gfc_actual_arglist *arg = expr->value.function.actual;
5495 gfc_expr *p = arg->expr, *r = arg->next->expr,
5496 *rad = arg->next->next->expr;
5497 int precision, range, radix, res;
5498 int found_precision, found_range, found_radix, i;
5500 if (p)
5502 if (p->expr_type != EXPR_CONSTANT
5503 || gfc_extract_int (p, &precision) != NULL)
5504 return NULL;
5506 else
5507 precision = 0;
5509 if (r)
5511 if (r->expr_type != EXPR_CONSTANT
5512 || gfc_extract_int (r, &range) != NULL)
5513 return NULL;
5515 else
5516 range = 0;
5518 if (rad)
5520 if (rad->expr_type != EXPR_CONSTANT
5521 || gfc_extract_int (rad, &radix) != NULL)
5522 return NULL;
5524 else
5525 radix = 0;
5527 res = INT_MAX;
5528 found_precision = 0;
5529 found_range = 0;
5530 found_radix = 0;
5532 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
5534 /* We only support the target's float and double types. */
5535 if (!gfc_real_kinds[i].c_float && !gfc_real_kinds[i].c_double)
5536 continue;
5538 if (gfc_real_kinds[i].precision >= precision)
5539 found_precision = 1;
5541 if (gfc_real_kinds[i].range >= range)
5542 found_range = 1;
5544 if (radix == 0 || gfc_real_kinds[i].radix == radix)
5545 found_radix = 1;
5547 if (gfc_real_kinds[i].precision >= precision
5548 && gfc_real_kinds[i].range >= range
5549 && (radix == 0 || gfc_real_kinds[i].radix == radix)
5550 && gfc_real_kinds[i].kind < res)
5551 res = gfc_real_kinds[i].kind;
5554 if (res == INT_MAX)
5556 if (found_radix && found_range && !found_precision)
5557 res = -1;
5558 else if (found_radix && found_precision && !found_range)
5559 res = -2;
5560 else if (found_radix && !found_precision && !found_range)
5561 res = -3;
5562 else if (found_radix)
5563 res = -4;
5564 else
5565 res = -5;
5568 return gfc_get_int_expr (gfc_default_integer_kind, &expr->where, res);
5572 gfc_expr *
5573 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
5575 gfc_expr *result;
5576 mpfr_t exp, absv, log2, pow2, frac;
5577 unsigned long exp2;
5579 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5580 return NULL;
5582 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5584 if (mpfr_sgn (x->value.real) == 0)
5586 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5587 return result;
5590 gfc_set_model_kind (x->ts.kind);
5591 mpfr_init (absv);
5592 mpfr_init (log2);
5593 mpfr_init (exp);
5594 mpfr_init (pow2);
5595 mpfr_init (frac);
5597 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
5598 mpfr_log2 (log2, absv, GFC_RND_MODE);
5600 mpfr_trunc (log2, log2);
5601 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
5603 /* Old exponent value, and fraction. */
5604 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
5606 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
5608 /* New exponent. */
5609 exp2 = (unsigned long) mpz_get_d (i->value.integer);
5610 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
5612 mpfr_clears (absv, log2, pow2, frac, NULL);
5614 return range_check (result, "SET_EXPONENT");
5618 gfc_expr *
5619 gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
5621 mpz_t shape[GFC_MAX_DIMENSIONS];
5622 gfc_expr *result, *e, *f;
5623 gfc_array_ref *ar;
5624 int n;
5625 bool t;
5626 int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind);
5628 if (source->rank == -1)
5629 return NULL;
5631 result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
5633 if (source->rank == 0)
5634 return result;
5636 if (source->expr_type == EXPR_VARIABLE)
5638 ar = gfc_find_array_ref (source);
5639 t = gfc_array_ref_shape (ar, shape);
5641 else if (source->shape)
5643 t = true;
5644 for (n = 0; n < source->rank; n++)
5646 mpz_init (shape[n]);
5647 mpz_set (shape[n], source->shape[n]);
5650 else
5651 t = false;
5653 for (n = 0; n < source->rank; n++)
5655 e = gfc_get_constant_expr (BT_INTEGER, k, &source->where);
5657 if (t)
5658 mpz_set (e->value.integer, shape[n]);
5659 else
5661 mpz_set_ui (e->value.integer, n + 1);
5663 f = simplify_size (source, e, k);
5664 gfc_free_expr (e);
5665 if (f == NULL)
5667 gfc_free_expr (result);
5668 return NULL;
5670 else
5671 e = f;
5674 if (e == &gfc_bad_expr || range_check (e, "SHAPE") == &gfc_bad_expr)
5676 gfc_free_expr (result);
5677 if (t)
5678 gfc_clear_shape (shape, source->rank);
5679 return &gfc_bad_expr;
5682 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5685 if (t)
5686 gfc_clear_shape (shape, source->rank);
5688 return result;
5692 static gfc_expr *
5693 simplify_size (gfc_expr *array, gfc_expr *dim, int k)
5695 mpz_t size;
5696 gfc_expr *return_value;
5697 int d;
5699 /* For unary operations, the size of the result is given by the size
5700 of the operand. For binary ones, it's the size of the first operand
5701 unless it is scalar, then it is the size of the second. */
5702 if (array->expr_type == EXPR_OP && !array->value.op.uop)
5704 gfc_expr* replacement;
5705 gfc_expr* simplified;
5707 switch (array->value.op.op)
5709 /* Unary operations. */
5710 case INTRINSIC_NOT:
5711 case INTRINSIC_UPLUS:
5712 case INTRINSIC_UMINUS:
5713 case INTRINSIC_PARENTHESES:
5714 replacement = array->value.op.op1;
5715 break;
5717 /* Binary operations. If any one of the operands is scalar, take
5718 the other one's size. If both of them are arrays, it does not
5719 matter -- try to find one with known shape, if possible. */
5720 default:
5721 if (array->value.op.op1->rank == 0)
5722 replacement = array->value.op.op2;
5723 else if (array->value.op.op2->rank == 0)
5724 replacement = array->value.op.op1;
5725 else
5727 simplified = simplify_size (array->value.op.op1, dim, k);
5728 if (simplified)
5729 return simplified;
5731 replacement = array->value.op.op2;
5733 break;
5736 /* Try to reduce it directly if possible. */
5737 simplified = simplify_size (replacement, dim, k);
5739 /* Otherwise, we build a new SIZE call. This is hopefully at least
5740 simpler than the original one. */
5741 if (!simplified)
5743 gfc_expr *kind = gfc_get_int_expr (gfc_default_integer_kind, NULL, k);
5744 simplified = gfc_build_intrinsic_call (gfc_current_ns,
5745 GFC_ISYM_SIZE, "size",
5746 array->where, 3,
5747 gfc_copy_expr (replacement),
5748 gfc_copy_expr (dim),
5749 kind);
5751 return simplified;
5754 if (dim == NULL)
5756 if (!gfc_array_size (array, &size))
5757 return NULL;
5759 else
5761 if (dim->expr_type != EXPR_CONSTANT)
5762 return NULL;
5764 d = mpz_get_ui (dim->value.integer) - 1;
5765 if (!gfc_array_dimen_size (array, d, &size))
5766 return NULL;
5769 return_value = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
5770 mpz_set (return_value->value.integer, size);
5771 mpz_clear (size);
5773 return return_value;
5777 gfc_expr *
5778 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5780 gfc_expr *result;
5781 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
5783 if (k == -1)
5784 return &gfc_bad_expr;
5786 result = simplify_size (array, dim, k);
5787 if (result == NULL || result == &gfc_bad_expr)
5788 return result;
5790 return range_check (result, "SIZE");
5794 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
5795 multiplied by the array size. */
5797 gfc_expr *
5798 gfc_simplify_sizeof (gfc_expr *x)
5800 gfc_expr *result = NULL;
5801 mpz_t array_size;
5803 if (x->ts.type == BT_CLASS || x->ts.deferred)
5804 return NULL;
5806 if (x->ts.type == BT_CHARACTER
5807 && (!x->ts.u.cl || !x->ts.u.cl->length
5808 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
5809 return NULL;
5811 if (x->rank && x->expr_type != EXPR_ARRAY
5812 && !gfc_array_size (x, &array_size))
5813 return NULL;
5815 result = gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
5816 &x->where);
5817 mpz_set_si (result->value.integer, gfc_target_expr_size (x));
5819 return result;
5823 /* STORAGE_SIZE returns the size in bits of a single array element. */
5825 gfc_expr *
5826 gfc_simplify_storage_size (gfc_expr *x,
5827 gfc_expr *kind)
5829 gfc_expr *result = NULL;
5830 int k;
5832 if (x->ts.type == BT_CLASS || x->ts.deferred)
5833 return NULL;
5835 if (x->ts.type == BT_CHARACTER && x->expr_type != EXPR_CONSTANT
5836 && (!x->ts.u.cl || !x->ts.u.cl->length
5837 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
5838 return NULL;
5840 k = get_kind (BT_INTEGER, kind, "STORAGE_SIZE", gfc_default_integer_kind);
5841 if (k == -1)
5842 return &gfc_bad_expr;
5844 result = gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
5845 &x->where);
5847 mpz_set_si (result->value.integer, gfc_element_size (x));
5849 mpz_mul_ui (result->value.integer, result->value.integer, BITS_PER_UNIT);
5851 return range_check (result, "STORAGE_SIZE");
5855 gfc_expr *
5856 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
5858 gfc_expr *result;
5860 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
5861 return NULL;
5863 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5865 switch (x->ts.type)
5867 case BT_INTEGER:
5868 mpz_abs (result->value.integer, x->value.integer);
5869 if (mpz_sgn (y->value.integer) < 0)
5870 mpz_neg (result->value.integer, result->value.integer);
5871 break;
5873 case BT_REAL:
5874 if (gfc_option.flag_sign_zero)
5875 mpfr_copysign (result->value.real, x->value.real, y->value.real,
5876 GFC_RND_MODE);
5877 else
5878 mpfr_setsign (result->value.real, x->value.real,
5879 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
5880 break;
5882 default:
5883 gfc_internal_error ("Bad type in gfc_simplify_sign");
5886 return result;
5890 gfc_expr *
5891 gfc_simplify_sin (gfc_expr *x)
5893 gfc_expr *result;
5895 if (x->expr_type != EXPR_CONSTANT)
5896 return NULL;
5898 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5900 switch (x->ts.type)
5902 case BT_REAL:
5903 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
5904 break;
5906 case BT_COMPLEX:
5907 gfc_set_model (x->value.real);
5908 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5909 break;
5911 default:
5912 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
5915 return range_check (result, "SIN");
5919 gfc_expr *
5920 gfc_simplify_sinh (gfc_expr *x)
5922 gfc_expr *result;
5924 if (x->expr_type != EXPR_CONSTANT)
5925 return NULL;
5927 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5929 switch (x->ts.type)
5931 case BT_REAL:
5932 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
5933 break;
5935 case BT_COMPLEX:
5936 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5937 break;
5939 default:
5940 gcc_unreachable ();
5943 return range_check (result, "SINH");
5947 /* The argument is always a double precision real that is converted to
5948 single precision. TODO: Rounding! */
5950 gfc_expr *
5951 gfc_simplify_sngl (gfc_expr *a)
5953 gfc_expr *result;
5955 if (a->expr_type != EXPR_CONSTANT)
5956 return NULL;
5958 result = gfc_real2real (a, gfc_default_real_kind);
5959 return range_check (result, "SNGL");
5963 gfc_expr *
5964 gfc_simplify_spacing (gfc_expr *x)
5966 gfc_expr *result;
5967 int i;
5968 long int en, ep;
5970 if (x->expr_type != EXPR_CONSTANT)
5971 return NULL;
5973 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5975 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5977 /* Special case x = 0 and -0. */
5978 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5979 if (mpfr_sgn (result->value.real) == 0)
5981 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5982 return result;
5985 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5986 are the radix, exponent of x, and precision. This excludes the
5987 possibility of subnormal numbers. Fortran 2003 states the result is
5988 b**max(e - p, emin - 1). */
5990 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
5991 en = (long int) gfc_real_kinds[i].min_exponent - 1;
5992 en = en > ep ? en : ep;
5994 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
5995 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
5997 return range_check (result, "SPACING");
6001 gfc_expr *
6002 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
6004 gfc_expr *result = 0L;
6005 int i, j, dim, ncopies;
6006 mpz_t size;
6008 if ((!gfc_is_constant_expr (source)
6009 && !is_constant_array_expr (source))
6010 || !gfc_is_constant_expr (dim_expr)
6011 || !gfc_is_constant_expr (ncopies_expr))
6012 return NULL;
6014 gcc_assert (dim_expr->ts.type == BT_INTEGER);
6015 gfc_extract_int (dim_expr, &dim);
6016 dim -= 1; /* zero-base DIM */
6018 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
6019 gfc_extract_int (ncopies_expr, &ncopies);
6020 ncopies = MAX (ncopies, 0);
6022 /* Do not allow the array size to exceed the limit for an array
6023 constructor. */
6024 if (source->expr_type == EXPR_ARRAY)
6026 if (!gfc_array_size (source, &size))
6027 gfc_internal_error ("Failure getting length of a constant array.");
6029 else
6030 mpz_init_set_ui (size, 1);
6032 if (mpz_get_si (size)*ncopies > gfc_option.flag_max_array_constructor)
6033 return NULL;
6035 if (source->expr_type == EXPR_CONSTANT)
6037 gcc_assert (dim == 0);
6039 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
6040 &source->where);
6041 if (source->ts.type == BT_DERIVED)
6042 result->ts.u.derived = source->ts.u.derived;
6043 result->rank = 1;
6044 result->shape = gfc_get_shape (result->rank);
6045 mpz_init_set_si (result->shape[0], ncopies);
6047 for (i = 0; i < ncopies; ++i)
6048 gfc_constructor_append_expr (&result->value.constructor,
6049 gfc_copy_expr (source), NULL);
6051 else if (source->expr_type == EXPR_ARRAY)
6053 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
6054 gfc_constructor *source_ctor;
6056 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
6057 gcc_assert (dim >= 0 && dim <= source->rank);
6059 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
6060 &source->where);
6061 if (source->ts.type == BT_DERIVED)
6062 result->ts.u.derived = source->ts.u.derived;
6063 result->rank = source->rank + 1;
6064 result->shape = gfc_get_shape (result->rank);
6066 for (i = 0, j = 0; i < result->rank; ++i)
6068 if (i != dim)
6069 mpz_init_set (result->shape[i], source->shape[j++]);
6070 else
6071 mpz_init_set_si (result->shape[i], ncopies);
6073 extent[i] = mpz_get_si (result->shape[i]);
6074 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
6077 offset = 0;
6078 for (source_ctor = gfc_constructor_first (source->value.constructor);
6079 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
6081 for (i = 0; i < ncopies; ++i)
6082 gfc_constructor_insert_expr (&result->value.constructor,
6083 gfc_copy_expr (source_ctor->expr),
6084 NULL, offset + i * rstride[dim]);
6086 offset += (dim == 0 ? ncopies : 1);
6089 else
6090 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
6091 Replace NULL with gcc_unreachable() after implementing
6092 gfc_simplify_cshift(). */
6093 return NULL;
6095 if (source->ts.type == BT_CHARACTER)
6096 result->ts.u.cl = source->ts.u.cl;
6098 return result;
6102 gfc_expr *
6103 gfc_simplify_sqrt (gfc_expr *e)
6105 gfc_expr *result = NULL;
6107 if (e->expr_type != EXPR_CONSTANT)
6108 return NULL;
6110 switch (e->ts.type)
6112 case BT_REAL:
6113 if (mpfr_cmp_si (e->value.real, 0) < 0)
6115 gfc_error ("Argument of SQRT at %L has a negative value",
6116 &e->where);
6117 return &gfc_bad_expr;
6119 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
6120 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
6121 break;
6123 case BT_COMPLEX:
6124 gfc_set_model (e->value.real);
6126 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
6127 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
6128 break;
6130 default:
6131 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
6134 return range_check (result, "SQRT");
6138 gfc_expr *
6139 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
6141 return simplify_transformation (array, dim, mask, 0, gfc_add);
6145 gfc_expr *
6146 gfc_simplify_tan (gfc_expr *x)
6148 gfc_expr *result;
6150 if (x->expr_type != EXPR_CONSTANT)
6151 return NULL;
6153 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6155 switch (x->ts.type)
6157 case BT_REAL:
6158 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
6159 break;
6161 case BT_COMPLEX:
6162 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6163 break;
6165 default:
6166 gcc_unreachable ();
6169 return range_check (result, "TAN");
6173 gfc_expr *
6174 gfc_simplify_tanh (gfc_expr *x)
6176 gfc_expr *result;
6178 if (x->expr_type != EXPR_CONSTANT)
6179 return NULL;
6181 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6183 switch (x->ts.type)
6185 case BT_REAL:
6186 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
6187 break;
6189 case BT_COMPLEX:
6190 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6191 break;
6193 default:
6194 gcc_unreachable ();
6197 return range_check (result, "TANH");
6201 gfc_expr *
6202 gfc_simplify_tiny (gfc_expr *e)
6204 gfc_expr *result;
6205 int i;
6207 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
6209 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
6210 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
6212 return result;
6216 gfc_expr *
6217 gfc_simplify_trailz (gfc_expr *e)
6219 unsigned long tz, bs;
6220 int i;
6222 if (e->expr_type != EXPR_CONSTANT)
6223 return NULL;
6225 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
6226 bs = gfc_integer_kinds[i].bit_size;
6227 tz = mpz_scan1 (e->value.integer, 0);
6229 return gfc_get_int_expr (gfc_default_integer_kind,
6230 &e->where, MIN (tz, bs));
6234 gfc_expr *
6235 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
6237 gfc_expr *result;
6238 gfc_expr *mold_element;
6239 size_t source_size;
6240 size_t result_size;
6241 size_t buffer_size;
6242 mpz_t tmp;
6243 unsigned char *buffer;
6244 size_t result_length;
6247 if (!gfc_is_constant_expr (source)
6248 || (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
6249 || !gfc_is_constant_expr (size))
6250 return NULL;
6252 if (!gfc_calculate_transfer_sizes (source, mold, size, &source_size,
6253 &result_size, &result_length))
6254 return NULL;
6256 /* Calculate the size of the source. */
6257 if (source->expr_type == EXPR_ARRAY
6258 && !gfc_array_size (source, &tmp))
6259 gfc_internal_error ("Failure getting length of a constant array.");
6261 /* Create an empty new expression with the appropriate characteristics. */
6262 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
6263 &source->where);
6264 result->ts = mold->ts;
6266 mold_element = mold->expr_type == EXPR_ARRAY
6267 ? gfc_constructor_first (mold->value.constructor)->expr
6268 : mold;
6270 /* Set result character length, if needed. Note that this needs to be
6271 set even for array expressions, in order to pass this information into
6272 gfc_target_interpret_expr. */
6273 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
6274 result->value.character.length = mold_element->value.character.length;
6276 /* Set the number of elements in the result, and determine its size. */
6278 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
6280 result->expr_type = EXPR_ARRAY;
6281 result->rank = 1;
6282 result->shape = gfc_get_shape (1);
6283 mpz_init_set_ui (result->shape[0], result_length);
6285 else
6286 result->rank = 0;
6288 /* Allocate the buffer to store the binary version of the source. */
6289 buffer_size = MAX (source_size, result_size);
6290 buffer = (unsigned char*)alloca (buffer_size);
6291 memset (buffer, 0, buffer_size);
6293 /* Now write source to the buffer. */
6294 gfc_target_encode_expr (source, buffer, buffer_size);
6296 /* And read the buffer back into the new expression. */
6297 gfc_target_interpret_expr (buffer, buffer_size, result, false);
6299 return result;
6303 gfc_expr *
6304 gfc_simplify_transpose (gfc_expr *matrix)
6306 int row, matrix_rows, col, matrix_cols;
6307 gfc_expr *result;
6309 if (!is_constant_array_expr (matrix))
6310 return NULL;
6312 gcc_assert (matrix->rank == 2);
6314 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
6315 &matrix->where);
6316 result->rank = 2;
6317 result->shape = gfc_get_shape (result->rank);
6318 mpz_set (result->shape[0], matrix->shape[1]);
6319 mpz_set (result->shape[1], matrix->shape[0]);
6321 if (matrix->ts.type == BT_CHARACTER)
6322 result->ts.u.cl = matrix->ts.u.cl;
6323 else if (matrix->ts.type == BT_DERIVED)
6324 result->ts.u.derived = matrix->ts.u.derived;
6326 matrix_rows = mpz_get_si (matrix->shape[0]);
6327 matrix_cols = mpz_get_si (matrix->shape[1]);
6328 for (row = 0; row < matrix_rows; ++row)
6329 for (col = 0; col < matrix_cols; ++col)
6331 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
6332 col * matrix_rows + row);
6333 gfc_constructor_insert_expr (&result->value.constructor,
6334 gfc_copy_expr (e), &matrix->where,
6335 row * matrix_cols + col);
6338 return result;
6342 gfc_expr *
6343 gfc_simplify_trim (gfc_expr *e)
6345 gfc_expr *result;
6346 int count, i, len, lentrim;
6348 if (e->expr_type != EXPR_CONSTANT)
6349 return NULL;
6351 len = e->value.character.length;
6352 for (count = 0, i = 1; i <= len; ++i)
6354 if (e->value.character.string[len - i] == ' ')
6355 count++;
6356 else
6357 break;
6360 lentrim = len - count;
6362 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
6363 for (i = 0; i < lentrim; i++)
6364 result->value.character.string[i] = e->value.character.string[i];
6366 return result;
6370 gfc_expr *
6371 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
6373 gfc_expr *result;
6374 gfc_ref *ref;
6375 gfc_array_spec *as;
6376 gfc_constructor *sub_cons;
6377 bool first_image;
6378 int d;
6380 if (!is_constant_array_expr (sub))
6381 return NULL;
6383 /* Follow any component references. */
6384 as = coarray->symtree->n.sym->as;
6385 for (ref = coarray->ref; ref; ref = ref->next)
6386 if (ref->type == REF_COMPONENT)
6387 as = ref->u.ar.as;
6389 if (as->type == AS_DEFERRED)
6390 return NULL;
6392 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6393 the cosubscript addresses the first image. */
6395 sub_cons = gfc_constructor_first (sub->value.constructor);
6396 first_image = true;
6398 for (d = 1; d <= as->corank; d++)
6400 gfc_expr *ca_bound;
6401 int cmp;
6403 gcc_assert (sub_cons != NULL);
6405 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
6406 NULL, true);
6407 if (ca_bound == NULL)
6408 return NULL;
6410 if (ca_bound == &gfc_bad_expr)
6411 return ca_bound;
6413 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
6415 if (cmp == 0)
6417 gfc_free_expr (ca_bound);
6418 sub_cons = gfc_constructor_next (sub_cons);
6419 continue;
6422 first_image = false;
6424 if (cmp > 0)
6426 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6427 "SUB has %ld and COARRAY lower bound is %ld)",
6428 &coarray->where, d,
6429 mpz_get_si (sub_cons->expr->value.integer),
6430 mpz_get_si (ca_bound->value.integer));
6431 gfc_free_expr (ca_bound);
6432 return &gfc_bad_expr;
6435 gfc_free_expr (ca_bound);
6437 /* Check whether upperbound is valid for the multi-images case. */
6438 if (d < as->corank)
6440 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
6441 NULL, true);
6442 if (ca_bound == &gfc_bad_expr)
6443 return ca_bound;
6445 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
6446 && mpz_cmp (ca_bound->value.integer,
6447 sub_cons->expr->value.integer) < 0)
6449 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6450 "SUB has %ld and COARRAY upper bound is %ld)",
6451 &coarray->where, d,
6452 mpz_get_si (sub_cons->expr->value.integer),
6453 mpz_get_si (ca_bound->value.integer));
6454 gfc_free_expr (ca_bound);
6455 return &gfc_bad_expr;
6458 if (ca_bound)
6459 gfc_free_expr (ca_bound);
6462 sub_cons = gfc_constructor_next (sub_cons);
6465 gcc_assert (sub_cons == NULL);
6467 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE && !first_image)
6468 return NULL;
6470 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6471 &gfc_current_locus);
6472 if (first_image)
6473 mpz_set_si (result->value.integer, 1);
6474 else
6475 mpz_set_si (result->value.integer, 0);
6477 return result;
6481 gfc_expr *
6482 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim,
6483 gfc_expr *distance ATTRIBUTE_UNUSED)
6485 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE)
6486 return NULL;
6488 /* If no coarray argument has been passed or when the first argument
6489 is actually a distance argment. */
6490 if (coarray == NULL || !gfc_is_coarray (coarray))
6492 gfc_expr *result;
6493 /* FIXME: gfc_current_locus is wrong. */
6494 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6495 &gfc_current_locus);
6496 mpz_set_si (result->value.integer, 1);
6497 return result;
6500 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6501 return simplify_cobound (coarray, dim, NULL, 0);
6505 gfc_expr *
6506 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6508 return simplify_bound (array, dim, kind, 1);
6511 gfc_expr *
6512 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6514 return simplify_cobound (array, dim, kind, 1);
6518 gfc_expr *
6519 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
6521 gfc_expr *result, *e;
6522 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
6524 if (!is_constant_array_expr (vector)
6525 || !is_constant_array_expr (mask)
6526 || (!gfc_is_constant_expr (field)
6527 && !is_constant_array_expr (field)))
6528 return NULL;
6530 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
6531 &vector->where);
6532 if (vector->ts.type == BT_DERIVED)
6533 result->ts.u.derived = vector->ts.u.derived;
6534 result->rank = mask->rank;
6535 result->shape = gfc_copy_shape (mask->shape, mask->rank);
6537 if (vector->ts.type == BT_CHARACTER)
6538 result->ts.u.cl = vector->ts.u.cl;
6540 vector_ctor = gfc_constructor_first (vector->value.constructor);
6541 mask_ctor = gfc_constructor_first (mask->value.constructor);
6542 field_ctor
6543 = field->expr_type == EXPR_ARRAY
6544 ? gfc_constructor_first (field->value.constructor)
6545 : NULL;
6547 while (mask_ctor)
6549 if (mask_ctor->expr->value.logical)
6551 gcc_assert (vector_ctor);
6552 e = gfc_copy_expr (vector_ctor->expr);
6553 vector_ctor = gfc_constructor_next (vector_ctor);
6555 else if (field->expr_type == EXPR_ARRAY)
6556 e = gfc_copy_expr (field_ctor->expr);
6557 else
6558 e = gfc_copy_expr (field);
6560 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
6562 mask_ctor = gfc_constructor_next (mask_ctor);
6563 field_ctor = gfc_constructor_next (field_ctor);
6566 return result;
6570 gfc_expr *
6571 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
6573 gfc_expr *result;
6574 int back;
6575 size_t index, len, lenset;
6576 size_t i;
6577 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
6579 if (k == -1)
6580 return &gfc_bad_expr;
6582 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT
6583 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
6584 return NULL;
6586 if (b != NULL && b->value.logical != 0)
6587 back = 1;
6588 else
6589 back = 0;
6591 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
6593 len = s->value.character.length;
6594 lenset = set->value.character.length;
6596 if (len == 0)
6598 mpz_set_ui (result->value.integer, 0);
6599 return result;
6602 if (back == 0)
6604 if (lenset == 0)
6606 mpz_set_ui (result->value.integer, 1);
6607 return result;
6610 index = wide_strspn (s->value.character.string,
6611 set->value.character.string) + 1;
6612 if (index > len)
6613 index = 0;
6616 else
6618 if (lenset == 0)
6620 mpz_set_ui (result->value.integer, len);
6621 return result;
6623 for (index = len; index > 0; index --)
6625 for (i = 0; i < lenset; i++)
6627 if (s->value.character.string[index - 1]
6628 == set->value.character.string[i])
6629 break;
6631 if (i == lenset)
6632 break;
6636 mpz_set_ui (result->value.integer, index);
6637 return result;
6641 gfc_expr *
6642 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
6644 gfc_expr *result;
6645 int kind;
6647 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6648 return NULL;
6650 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
6652 switch (x->ts.type)
6654 case BT_INTEGER:
6655 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
6656 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
6657 return range_check (result, "XOR");
6659 case BT_LOGICAL:
6660 return gfc_get_logical_expr (kind, &x->where,
6661 (x->value.logical && !y->value.logical)
6662 || (!x->value.logical && y->value.logical));
6664 default:
6665 gcc_unreachable ();
6670 /****************** Constant simplification *****************/
6672 /* Master function to convert one constant to another. While this is
6673 used as a simplification function, it requires the destination type
6674 and kind information which is supplied by a special case in
6675 do_simplify(). */
6677 gfc_expr *
6678 gfc_convert_constant (gfc_expr *e, bt type, int kind)
6680 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
6681 gfc_constructor *c;
6683 switch (e->ts.type)
6685 case BT_INTEGER:
6686 switch (type)
6688 case BT_INTEGER:
6689 f = gfc_int2int;
6690 break;
6691 case BT_REAL:
6692 f = gfc_int2real;
6693 break;
6694 case BT_COMPLEX:
6695 f = gfc_int2complex;
6696 break;
6697 case BT_LOGICAL:
6698 f = gfc_int2log;
6699 break;
6700 default:
6701 goto oops;
6703 break;
6705 case BT_REAL:
6706 switch (type)
6708 case BT_INTEGER:
6709 f = gfc_real2int;
6710 break;
6711 case BT_REAL:
6712 f = gfc_real2real;
6713 break;
6714 case BT_COMPLEX:
6715 f = gfc_real2complex;
6716 break;
6717 default:
6718 goto oops;
6720 break;
6722 case BT_COMPLEX:
6723 switch (type)
6725 case BT_INTEGER:
6726 f = gfc_complex2int;
6727 break;
6728 case BT_REAL:
6729 f = gfc_complex2real;
6730 break;
6731 case BT_COMPLEX:
6732 f = gfc_complex2complex;
6733 break;
6735 default:
6736 goto oops;
6738 break;
6740 case BT_LOGICAL:
6741 switch (type)
6743 case BT_INTEGER:
6744 f = gfc_log2int;
6745 break;
6746 case BT_LOGICAL:
6747 f = gfc_log2log;
6748 break;
6749 default:
6750 goto oops;
6752 break;
6754 case BT_HOLLERITH:
6755 switch (type)
6757 case BT_INTEGER:
6758 f = gfc_hollerith2int;
6759 break;
6761 case BT_REAL:
6762 f = gfc_hollerith2real;
6763 break;
6765 case BT_COMPLEX:
6766 f = gfc_hollerith2complex;
6767 break;
6769 case BT_CHARACTER:
6770 f = gfc_hollerith2character;
6771 break;
6773 case BT_LOGICAL:
6774 f = gfc_hollerith2logical;
6775 break;
6777 default:
6778 goto oops;
6780 break;
6782 default:
6783 oops:
6784 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
6787 result = NULL;
6789 switch (e->expr_type)
6791 case EXPR_CONSTANT:
6792 result = f (e, kind);
6793 if (result == NULL)
6794 return &gfc_bad_expr;
6795 break;
6797 case EXPR_ARRAY:
6798 if (!gfc_is_constant_expr (e))
6799 break;
6801 result = gfc_get_array_expr (type, kind, &e->where);
6802 result->shape = gfc_copy_shape (e->shape, e->rank);
6803 result->rank = e->rank;
6805 for (c = gfc_constructor_first (e->value.constructor);
6806 c; c = gfc_constructor_next (c))
6808 gfc_expr *tmp;
6809 if (c->iterator == NULL)
6810 tmp = f (c->expr, kind);
6811 else
6813 g = gfc_convert_constant (c->expr, type, kind);
6814 if (g == &gfc_bad_expr)
6816 gfc_free_expr (result);
6817 return g;
6819 tmp = g;
6822 if (tmp == NULL)
6824 gfc_free_expr (result);
6825 return NULL;
6828 gfc_constructor_append_expr (&result->value.constructor,
6829 tmp, &c->where);
6832 break;
6834 default:
6835 break;
6838 return result;
6842 /* Function for converting character constants. */
6843 gfc_expr *
6844 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
6846 gfc_expr *result;
6847 int i;
6849 if (!gfc_is_constant_expr (e))
6850 return NULL;
6852 if (e->expr_type == EXPR_CONSTANT)
6854 /* Simple case of a scalar. */
6855 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
6856 if (result == NULL)
6857 return &gfc_bad_expr;
6859 result->value.character.length = e->value.character.length;
6860 result->value.character.string
6861 = gfc_get_wide_string (e->value.character.length + 1);
6862 memcpy (result->value.character.string, e->value.character.string,
6863 (e->value.character.length + 1) * sizeof (gfc_char_t));
6865 /* Check we only have values representable in the destination kind. */
6866 for (i = 0; i < result->value.character.length; i++)
6867 if (!gfc_check_character_range (result->value.character.string[i],
6868 kind))
6870 gfc_error ("Character '%s' in string at %L cannot be converted "
6871 "into character kind %d",
6872 gfc_print_wide_char (result->value.character.string[i]),
6873 &e->where, kind);
6874 return &gfc_bad_expr;
6877 return result;
6879 else if (e->expr_type == EXPR_ARRAY)
6881 /* For an array constructor, we convert each constructor element. */
6882 gfc_constructor *c;
6884 result = gfc_get_array_expr (type, kind, &e->where);
6885 result->shape = gfc_copy_shape (e->shape, e->rank);
6886 result->rank = e->rank;
6887 result->ts.u.cl = e->ts.u.cl;
6889 for (c = gfc_constructor_first (e->value.constructor);
6890 c; c = gfc_constructor_next (c))
6892 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
6893 if (tmp == &gfc_bad_expr)
6895 gfc_free_expr (result);
6896 return &gfc_bad_expr;
6899 if (tmp == NULL)
6901 gfc_free_expr (result);
6902 return NULL;
6905 gfc_constructor_append_expr (&result->value.constructor,
6906 tmp, &c->where);
6909 return result;
6911 else
6912 return NULL;
6916 gfc_expr *
6917 gfc_simplify_compiler_options (void)
6919 char *str;
6920 gfc_expr *result;
6922 str = gfc_get_option_string ();
6923 result = gfc_get_character_expr (gfc_default_character_kind,
6924 &gfc_current_locus, str, strlen (str));
6925 free (str);
6926 return result;
6930 gfc_expr *
6931 gfc_simplify_compiler_version (void)
6933 char *buffer;
6934 size_t len;
6936 len = strlen ("GCC version ") + strlen (version_string);
6937 buffer = XALLOCAVEC (char, len + 1);
6938 snprintf (buffer, len + 1, "GCC version %s", version_string);
6939 return gfc_get_character_expr (gfc_default_character_kind,
6940 &gfc_current_locus, buffer, len);