2011-04-21 Tobias Burnus <burnus@net-b.de>
[official-gcc.git] / gcc / fortran / simplify.c
blob4c91563389cbb898e0db16671ce70af6046e4952
1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010, 2011 Free Software Foundation, Inc.
4 Contributed by Andy Vaught & Katherine Holcomb
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.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 "version.h" /* For version_string. */
33 gfc_expr gfc_bad_expr;
36 /* Note that 'simplification' is not just transforming expressions.
37 For functions that are not simplified at compile time, range
38 checking is done if possible.
40 The return convention is that each simplification function returns:
42 A new expression node corresponding to the simplified arguments.
43 The original arguments are destroyed by the caller, and must not
44 be a part of the new expression.
46 NULL pointer indicating that no simplification was possible and
47 the original expression should remain intact.
49 An expression pointer to gfc_bad_expr (a static placeholder)
50 indicating that some error has prevented simplification. The
51 error is generated within the function and should be propagated
52 upwards
54 By the time a simplification function gets control, it has been
55 decided that the function call is really supposed to be the
56 intrinsic. No type checking is strictly necessary, since only
57 valid types will be passed on. On the other hand, a simplification
58 subroutine may have to look at the type of an argument as part of
59 its processing.
61 Array arguments are only passed to these subroutines that implement
62 the simplification of transformational intrinsics.
64 The functions in this file don't have much comment with them, but
65 everything is reasonably straight-forward. The Standard, chapter 13
66 is the best comment you'll find for this file anyway. */
68 /* Range checks an expression node. If all goes well, returns the
69 node, otherwise returns &gfc_bad_expr and frees the node. */
71 static gfc_expr *
72 range_check (gfc_expr *result, const char *name)
74 if (result == NULL)
75 return &gfc_bad_expr;
77 if (result->expr_type != EXPR_CONSTANT)
78 return result;
80 switch (gfc_range_check (result))
82 case ARITH_OK:
83 return result;
85 case ARITH_OVERFLOW:
86 gfc_error ("Result of %s overflows its kind at %L", name,
87 &result->where);
88 break;
90 case ARITH_UNDERFLOW:
91 gfc_error ("Result of %s underflows its kind at %L", name,
92 &result->where);
93 break;
95 case ARITH_NAN:
96 gfc_error ("Result of %s is NaN at %L", name, &result->where);
97 break;
99 default:
100 gfc_error ("Result of %s gives range error for its kind at %L", name,
101 &result->where);
102 break;
105 gfc_free_expr (result);
106 return &gfc_bad_expr;
110 /* A helper function that gets an optional and possibly missing
111 kind parameter. Returns the kind, -1 if something went wrong. */
113 static int
114 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
116 int kind;
118 if (k == NULL)
119 return default_kind;
121 if (k->expr_type != EXPR_CONSTANT)
123 gfc_error ("KIND parameter of %s at %L must be an initialization "
124 "expression", name, &k->where);
125 return -1;
128 if (gfc_extract_int (k, &kind) != NULL
129 || gfc_validate_kind (type, kind, true) < 0)
131 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
132 return -1;
135 return kind;
139 /* Converts an mpz_t signed variable into an unsigned one, assuming
140 two's complement representations and a binary width of bitsize.
141 The conversion is a no-op unless x is negative; otherwise, it can
142 be accomplished by masking out the high bits. */
144 static void
145 convert_mpz_to_unsigned (mpz_t x, int bitsize)
147 mpz_t mask;
149 if (mpz_sgn (x) < 0)
151 /* Confirm that no bits above the signed range are unset. */
152 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
154 mpz_init_set_ui (mask, 1);
155 mpz_mul_2exp (mask, mask, bitsize);
156 mpz_sub_ui (mask, mask, 1);
158 mpz_and (x, x, mask);
160 mpz_clear (mask);
162 else
164 /* Confirm that no bits above the signed range are set. */
165 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
170 /* Converts an mpz_t unsigned variable into a signed one, assuming
171 two's complement representations and a binary width of bitsize.
172 If the bitsize-1 bit is set, this is taken as a sign bit and
173 the number is converted to the corresponding negative number. */
175 static void
176 convert_mpz_to_signed (mpz_t x, int bitsize)
178 mpz_t mask;
180 /* Confirm that no bits above the unsigned range are set. */
181 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
183 if (mpz_tstbit (x, bitsize - 1) == 1)
185 mpz_init_set_ui (mask, 1);
186 mpz_mul_2exp (mask, mask, bitsize);
187 mpz_sub_ui (mask, mask, 1);
189 /* We negate the number by hand, zeroing the high bits, that is
190 make it the corresponding positive number, and then have it
191 negated by GMP, giving the correct representation of the
192 negative number. */
193 mpz_com (x, x);
194 mpz_add_ui (x, x, 1);
195 mpz_and (x, x, mask);
197 mpz_neg (x, x);
199 mpz_clear (mask);
204 /* In-place convert BOZ to REAL of the specified kind. */
206 static gfc_expr *
207 convert_boz (gfc_expr *x, int kind)
209 if (x && x->ts.type == BT_INTEGER && x->is_boz)
211 gfc_typespec ts;
212 gfc_clear_ts (&ts);
213 ts.type = BT_REAL;
214 ts.kind = kind;
216 if (!gfc_convert_boz (x, &ts))
217 return &gfc_bad_expr;
220 return x;
224 /* Test that the expression is an constant array. */
226 static bool
227 is_constant_array_expr (gfc_expr *e)
229 gfc_constructor *c;
231 if (e == NULL)
232 return true;
234 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
235 return false;
237 for (c = gfc_constructor_first (e->value.constructor);
238 c; c = gfc_constructor_next (c))
239 if (c->expr->expr_type != EXPR_CONSTANT
240 && c->expr->expr_type != EXPR_STRUCTURE)
241 return false;
243 return true;
247 /* Initialize a transformational result expression with a given value. */
249 static void
250 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
252 if (e && e->expr_type == EXPR_ARRAY)
254 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
255 while (ctor)
257 init_result_expr (ctor->expr, init, array);
258 ctor = gfc_constructor_next (ctor);
261 else if (e && e->expr_type == EXPR_CONSTANT)
263 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
264 int length;
265 gfc_char_t *string;
267 switch (e->ts.type)
269 case BT_LOGICAL:
270 e->value.logical = (init ? 1 : 0);
271 break;
273 case BT_INTEGER:
274 if (init == INT_MIN)
275 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
276 else if (init == INT_MAX)
277 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
278 else
279 mpz_set_si (e->value.integer, init);
280 break;
282 case BT_REAL:
283 if (init == INT_MIN)
285 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
286 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
288 else if (init == INT_MAX)
289 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
290 else
291 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
292 break;
294 case BT_COMPLEX:
295 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
296 break;
298 case BT_CHARACTER:
299 if (init == INT_MIN)
301 gfc_expr *len = gfc_simplify_len (array, NULL);
302 gfc_extract_int (len, &length);
303 string = gfc_get_wide_string (length + 1);
304 gfc_wide_memset (string, 0, length);
306 else if (init == INT_MAX)
308 gfc_expr *len = gfc_simplify_len (array, NULL);
309 gfc_extract_int (len, &length);
310 string = gfc_get_wide_string (length + 1);
311 gfc_wide_memset (string, 255, length);
313 else
315 length = 0;
316 string = gfc_get_wide_string (1);
319 string[length] = '\0';
320 e->value.character.length = length;
321 e->value.character.string = string;
322 break;
324 default:
325 gcc_unreachable();
328 else
329 gcc_unreachable();
333 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul. */
335 static gfc_expr *
336 compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
337 gfc_expr *matrix_b, int stride_b, int offset_b)
339 gfc_expr *result, *a, *b;
341 result = gfc_get_constant_expr (matrix_a->ts.type, matrix_a->ts.kind,
342 &matrix_a->where);
343 init_result_expr (result, 0, NULL);
345 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
346 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
347 while (a && b)
349 /* Copying of expressions is required as operands are free'd
350 by the gfc_arith routines. */
351 switch (result->ts.type)
353 case BT_LOGICAL:
354 result = gfc_or (result,
355 gfc_and (gfc_copy_expr (a),
356 gfc_copy_expr (b)));
357 break;
359 case BT_INTEGER:
360 case BT_REAL:
361 case BT_COMPLEX:
362 result = gfc_add (result,
363 gfc_multiply (gfc_copy_expr (a),
364 gfc_copy_expr (b)));
365 break;
367 default:
368 gcc_unreachable();
371 offset_a += stride_a;
372 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
374 offset_b += stride_b;
375 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
378 return result;
382 /* Build a result expression for transformational intrinsics,
383 depending on DIM. */
385 static gfc_expr *
386 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
387 int kind, locus* where)
389 gfc_expr *result;
390 int i, nelem;
392 if (!dim || array->rank == 1)
393 return gfc_get_constant_expr (type, kind, where);
395 result = gfc_get_array_expr (type, kind, where);
396 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
397 result->rank = array->rank - 1;
399 /* gfc_array_size() would count the number of elements in the constructor,
400 we have not built those yet. */
401 nelem = 1;
402 for (i = 0; i < result->rank; ++i)
403 nelem *= mpz_get_ui (result->shape[i]);
405 for (i = 0; i < nelem; ++i)
407 gfc_constructor_append_expr (&result->value.constructor,
408 gfc_get_constant_expr (type, kind, where),
409 NULL);
412 return result;
416 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
418 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
419 of COUNT intrinsic is .TRUE..
421 Interface and implimentation mimics arith functions as
422 gfc_add, gfc_multiply, etc. */
424 static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
426 gfc_expr *result;
428 gcc_assert (op1->ts.type == BT_INTEGER);
429 gcc_assert (op2->ts.type == BT_LOGICAL);
430 gcc_assert (op2->value.logical);
432 result = gfc_copy_expr (op1);
433 mpz_add_ui (result->value.integer, result->value.integer, 1);
435 gfc_free_expr (op1);
436 gfc_free_expr (op2);
437 return result;
441 /* Transforms an ARRAY with operation OP, according to MASK, to a
442 scalar RESULT. E.g. called if
444 REAL, PARAMETER :: array(n, m) = ...
445 REAL, PARAMETER :: s = SUM(array)
447 where OP == gfc_add(). */
449 static gfc_expr *
450 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
451 transformational_op op)
453 gfc_expr *a, *m;
454 gfc_constructor *array_ctor, *mask_ctor;
456 /* Shortcut for constant .FALSE. MASK. */
457 if (mask
458 && mask->expr_type == EXPR_CONSTANT
459 && !mask->value.logical)
460 return result;
462 array_ctor = gfc_constructor_first (array->value.constructor);
463 mask_ctor = NULL;
464 if (mask && mask->expr_type == EXPR_ARRAY)
465 mask_ctor = gfc_constructor_first (mask->value.constructor);
467 while (array_ctor)
469 a = array_ctor->expr;
470 array_ctor = gfc_constructor_next (array_ctor);
472 /* A constant MASK equals .TRUE. here and can be ignored. */
473 if (mask_ctor)
475 m = mask_ctor->expr;
476 mask_ctor = gfc_constructor_next (mask_ctor);
477 if (!m->value.logical)
478 continue;
481 result = op (result, gfc_copy_expr (a));
484 return result;
487 /* Transforms an ARRAY with operation OP, according to MASK, to an
488 array RESULT. E.g. called if
490 REAL, PARAMETER :: array(n, m) = ...
491 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
493 where OP == gfc_multiply(). The result might be post processed using post_op. */
495 static gfc_expr *
496 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
497 gfc_expr *mask, transformational_op op,
498 transformational_op post_op)
500 mpz_t size;
501 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
502 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
503 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
505 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
506 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
507 tmpstride[GFC_MAX_DIMENSIONS];
509 /* Shortcut for constant .FALSE. MASK. */
510 if (mask
511 && mask->expr_type == EXPR_CONSTANT
512 && !mask->value.logical)
513 return result;
515 /* Build an indexed table for array element expressions to minimize
516 linked-list traversal. Masked elements are set to NULL. */
517 gfc_array_size (array, &size);
518 arraysize = mpz_get_ui (size);
520 arrayvec = XCNEWVEC (gfc_expr*, arraysize);
522 array_ctor = gfc_constructor_first (array->value.constructor);
523 mask_ctor = NULL;
524 if (mask && mask->expr_type == EXPR_ARRAY)
525 mask_ctor = gfc_constructor_first (mask->value.constructor);
527 for (i = 0; i < arraysize; ++i)
529 arrayvec[i] = array_ctor->expr;
530 array_ctor = gfc_constructor_next (array_ctor);
532 if (mask_ctor)
534 if (!mask_ctor->expr->value.logical)
535 arrayvec[i] = NULL;
537 mask_ctor = gfc_constructor_next (mask_ctor);
541 /* Same for the result expression. */
542 gfc_array_size (result, &size);
543 resultsize = mpz_get_ui (size);
544 mpz_clear (size);
546 resultvec = XCNEWVEC (gfc_expr*, resultsize);
547 result_ctor = gfc_constructor_first (result->value.constructor);
548 for (i = 0; i < resultsize; ++i)
550 resultvec[i] = result_ctor->expr;
551 result_ctor = gfc_constructor_next (result_ctor);
554 gfc_extract_int (dim, &dim_index);
555 dim_index -= 1; /* zero-base index */
556 dim_extent = 0;
557 dim_stride = 0;
559 for (i = 0, n = 0; i < array->rank; ++i)
561 count[i] = 0;
562 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
563 if (i == dim_index)
565 dim_extent = mpz_get_si (array->shape[i]);
566 dim_stride = tmpstride[i];
567 continue;
570 extent[n] = mpz_get_si (array->shape[i]);
571 sstride[n] = tmpstride[i];
572 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
573 n += 1;
576 done = false;
577 base = arrayvec;
578 dest = resultvec;
579 while (!done)
581 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
582 if (*src)
583 *dest = op (*dest, gfc_copy_expr (*src));
585 count[0]++;
586 base += sstride[0];
587 dest += dstride[0];
589 n = 0;
590 while (!done && count[n] == extent[n])
592 count[n] = 0;
593 base -= sstride[n] * extent[n];
594 dest -= dstride[n] * extent[n];
596 n++;
597 if (n < result->rank)
599 count [n]++;
600 base += sstride[n];
601 dest += dstride[n];
603 else
604 done = true;
608 /* Place updated expression in result constructor. */
609 result_ctor = gfc_constructor_first (result->value.constructor);
610 for (i = 0; i < resultsize; ++i)
612 if (post_op)
613 result_ctor->expr = post_op (result_ctor->expr, resultvec[i]);
614 else
615 result_ctor->expr = resultvec[i];
616 result_ctor = gfc_constructor_next (result_ctor);
619 free (arrayvec);
620 free (resultvec);
621 return result;
625 static gfc_expr *
626 simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
627 int init_val, transformational_op op)
629 gfc_expr *result;
631 if (!is_constant_array_expr (array)
632 || !gfc_is_constant_expr (dim))
633 return NULL;
635 if (mask
636 && !is_constant_array_expr (mask)
637 && mask->expr_type != EXPR_CONSTANT)
638 return NULL;
640 result = transformational_result (array, dim, array->ts.type,
641 array->ts.kind, &array->where);
642 init_result_expr (result, init_val, NULL);
644 return !dim || array->rank == 1 ?
645 simplify_transformation_to_scalar (result, array, mask, op) :
646 simplify_transformation_to_array (result, array, dim, mask, op, NULL);
650 /********************** Simplification functions *****************************/
652 gfc_expr *
653 gfc_simplify_abs (gfc_expr *e)
655 gfc_expr *result;
657 if (e->expr_type != EXPR_CONSTANT)
658 return NULL;
660 switch (e->ts.type)
662 case BT_INTEGER:
663 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
664 mpz_abs (result->value.integer, e->value.integer);
665 return range_check (result, "IABS");
667 case BT_REAL:
668 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
669 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
670 return range_check (result, "ABS");
672 case BT_COMPLEX:
673 gfc_set_model_kind (e->ts.kind);
674 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
675 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
676 return range_check (result, "CABS");
678 default:
679 gfc_internal_error ("gfc_simplify_abs(): Bad type");
684 static gfc_expr *
685 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
687 gfc_expr *result;
688 int kind;
689 bool too_large = false;
691 if (e->expr_type != EXPR_CONSTANT)
692 return NULL;
694 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
695 if (kind == -1)
696 return &gfc_bad_expr;
698 if (mpz_cmp_si (e->value.integer, 0) < 0)
700 gfc_error ("Argument of %s function at %L is negative", name,
701 &e->where);
702 return &gfc_bad_expr;
705 if (ascii && gfc_option.warn_surprising
706 && mpz_cmp_si (e->value.integer, 127) > 0)
707 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
708 name, &e->where);
710 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
711 too_large = true;
712 else if (kind == 4)
714 mpz_t t;
715 mpz_init_set_ui (t, 2);
716 mpz_pow_ui (t, t, 32);
717 mpz_sub_ui (t, t, 1);
718 if (mpz_cmp (e->value.integer, t) > 0)
719 too_large = true;
720 mpz_clear (t);
723 if (too_large)
725 gfc_error ("Argument of %s function at %L is too large for the "
726 "collating sequence of kind %d", name, &e->where, kind);
727 return &gfc_bad_expr;
730 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
731 result->value.character.string[0] = mpz_get_ui (e->value.integer);
733 return result;
738 /* We use the processor's collating sequence, because all
739 systems that gfortran currently works on are ASCII. */
741 gfc_expr *
742 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
744 return simplify_achar_char (e, k, "ACHAR", true);
748 gfc_expr *
749 gfc_simplify_acos (gfc_expr *x)
751 gfc_expr *result;
753 if (x->expr_type != EXPR_CONSTANT)
754 return NULL;
756 switch (x->ts.type)
758 case BT_REAL:
759 if (mpfr_cmp_si (x->value.real, 1) > 0
760 || mpfr_cmp_si (x->value.real, -1) < 0)
762 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
763 &x->where);
764 return &gfc_bad_expr;
766 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
767 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
768 break;
770 case BT_COMPLEX:
771 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
772 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
773 break;
775 default:
776 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
779 return range_check (result, "ACOS");
782 gfc_expr *
783 gfc_simplify_acosh (gfc_expr *x)
785 gfc_expr *result;
787 if (x->expr_type != EXPR_CONSTANT)
788 return NULL;
790 switch (x->ts.type)
792 case BT_REAL:
793 if (mpfr_cmp_si (x->value.real, 1) < 0)
795 gfc_error ("Argument of ACOSH at %L must not be less than 1",
796 &x->where);
797 return &gfc_bad_expr;
800 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
801 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
802 break;
804 case BT_COMPLEX:
805 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
806 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
807 break;
809 default:
810 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
813 return range_check (result, "ACOSH");
816 gfc_expr *
817 gfc_simplify_adjustl (gfc_expr *e)
819 gfc_expr *result;
820 int count, i, len;
821 gfc_char_t ch;
823 if (e->expr_type != EXPR_CONSTANT)
824 return NULL;
826 len = e->value.character.length;
828 for (count = 0, i = 0; i < len; ++i)
830 ch = e->value.character.string[i];
831 if (ch != ' ')
832 break;
833 ++count;
836 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
837 for (i = 0; i < len - count; ++i)
838 result->value.character.string[i] = e->value.character.string[count + i];
840 return result;
844 gfc_expr *
845 gfc_simplify_adjustr (gfc_expr *e)
847 gfc_expr *result;
848 int count, i, len;
849 gfc_char_t ch;
851 if (e->expr_type != EXPR_CONSTANT)
852 return NULL;
854 len = e->value.character.length;
856 for (count = 0, i = len - 1; i >= 0; --i)
858 ch = e->value.character.string[i];
859 if (ch != ' ')
860 break;
861 ++count;
864 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
865 for (i = 0; i < count; ++i)
866 result->value.character.string[i] = ' ';
868 for (i = count; i < len; ++i)
869 result->value.character.string[i] = e->value.character.string[i - count];
871 return result;
875 gfc_expr *
876 gfc_simplify_aimag (gfc_expr *e)
878 gfc_expr *result;
880 if (e->expr_type != EXPR_CONSTANT)
881 return NULL;
883 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
884 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
886 return range_check (result, "AIMAG");
890 gfc_expr *
891 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
893 gfc_expr *rtrunc, *result;
894 int kind;
896 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
897 if (kind == -1)
898 return &gfc_bad_expr;
900 if (e->expr_type != EXPR_CONSTANT)
901 return NULL;
903 rtrunc = gfc_copy_expr (e);
904 mpfr_trunc (rtrunc->value.real, e->value.real);
906 result = gfc_real2real (rtrunc, kind);
908 gfc_free_expr (rtrunc);
910 return range_check (result, "AINT");
914 gfc_expr *
915 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
917 return simplify_transformation (mask, dim, NULL, true, gfc_and);
921 gfc_expr *
922 gfc_simplify_dint (gfc_expr *e)
924 gfc_expr *rtrunc, *result;
926 if (e->expr_type != EXPR_CONSTANT)
927 return NULL;
929 rtrunc = gfc_copy_expr (e);
930 mpfr_trunc (rtrunc->value.real, e->value.real);
932 result = gfc_real2real (rtrunc, gfc_default_double_kind);
934 gfc_free_expr (rtrunc);
936 return range_check (result, "DINT");
940 gfc_expr *
941 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
943 gfc_expr *result;
944 int kind;
946 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
947 if (kind == -1)
948 return &gfc_bad_expr;
950 if (e->expr_type != EXPR_CONSTANT)
951 return NULL;
953 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
954 mpfr_round (result->value.real, e->value.real);
956 return range_check (result, "ANINT");
960 gfc_expr *
961 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
963 gfc_expr *result;
964 int kind;
966 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
967 return NULL;
969 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
971 switch (x->ts.type)
973 case BT_INTEGER:
974 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
975 mpz_and (result->value.integer, x->value.integer, y->value.integer);
976 return range_check (result, "AND");
978 case BT_LOGICAL:
979 return gfc_get_logical_expr (kind, &x->where,
980 x->value.logical && y->value.logical);
982 default:
983 gcc_unreachable ();
988 gfc_expr *
989 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
991 return simplify_transformation (mask, dim, NULL, false, gfc_or);
995 gfc_expr *
996 gfc_simplify_dnint (gfc_expr *e)
998 gfc_expr *result;
1000 if (e->expr_type != EXPR_CONSTANT)
1001 return NULL;
1003 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
1004 mpfr_round (result->value.real, e->value.real);
1006 return range_check (result, "DNINT");
1010 gfc_expr *
1011 gfc_simplify_asin (gfc_expr *x)
1013 gfc_expr *result;
1015 if (x->expr_type != EXPR_CONSTANT)
1016 return NULL;
1018 switch (x->ts.type)
1020 case BT_REAL:
1021 if (mpfr_cmp_si (x->value.real, 1) > 0
1022 || mpfr_cmp_si (x->value.real, -1) < 0)
1024 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1025 &x->where);
1026 return &gfc_bad_expr;
1028 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1029 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1030 break;
1032 case BT_COMPLEX:
1033 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1034 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1035 break;
1037 default:
1038 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1041 return range_check (result, "ASIN");
1045 gfc_expr *
1046 gfc_simplify_asinh (gfc_expr *x)
1048 gfc_expr *result;
1050 if (x->expr_type != EXPR_CONSTANT)
1051 return NULL;
1053 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1055 switch (x->ts.type)
1057 case BT_REAL:
1058 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1059 break;
1061 case BT_COMPLEX:
1062 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1063 break;
1065 default:
1066 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1069 return range_check (result, "ASINH");
1073 gfc_expr *
1074 gfc_simplify_atan (gfc_expr *x)
1076 gfc_expr *result;
1078 if (x->expr_type != EXPR_CONSTANT)
1079 return NULL;
1081 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1083 switch (x->ts.type)
1085 case BT_REAL:
1086 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1087 break;
1089 case BT_COMPLEX:
1090 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1091 break;
1093 default:
1094 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1097 return range_check (result, "ATAN");
1101 gfc_expr *
1102 gfc_simplify_atanh (gfc_expr *x)
1104 gfc_expr *result;
1106 if (x->expr_type != EXPR_CONSTANT)
1107 return NULL;
1109 switch (x->ts.type)
1111 case BT_REAL:
1112 if (mpfr_cmp_si (x->value.real, 1) >= 0
1113 || mpfr_cmp_si (x->value.real, -1) <= 0)
1115 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1116 "to 1", &x->where);
1117 return &gfc_bad_expr;
1119 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1120 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1121 break;
1123 case BT_COMPLEX:
1124 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1125 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1126 break;
1128 default:
1129 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1132 return range_check (result, "ATANH");
1136 gfc_expr *
1137 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1139 gfc_expr *result;
1141 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1142 return NULL;
1144 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
1146 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1147 "second argument must not be zero", &x->where);
1148 return &gfc_bad_expr;
1151 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1152 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1154 return range_check (result, "ATAN2");
1158 gfc_expr *
1159 gfc_simplify_bessel_j0 (gfc_expr *x)
1161 gfc_expr *result;
1163 if (x->expr_type != EXPR_CONSTANT)
1164 return NULL;
1166 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1167 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1169 return range_check (result, "BESSEL_J0");
1173 gfc_expr *
1174 gfc_simplify_bessel_j1 (gfc_expr *x)
1176 gfc_expr *result;
1178 if (x->expr_type != EXPR_CONSTANT)
1179 return NULL;
1181 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1182 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1184 return range_check (result, "BESSEL_J1");
1188 gfc_expr *
1189 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1191 gfc_expr *result;
1192 long n;
1194 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1195 return NULL;
1197 n = mpz_get_si (order->value.integer);
1198 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1199 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1201 return range_check (result, "BESSEL_JN");
1205 /* Simplify transformational form of JN and YN. */
1207 static gfc_expr *
1208 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1209 bool jn)
1211 gfc_expr *result;
1212 gfc_expr *e;
1213 long n1, n2;
1214 int i;
1215 mpfr_t x2rev, last1, last2;
1217 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1218 || order2->expr_type != EXPR_CONSTANT)
1219 return NULL;
1221 n1 = mpz_get_si (order1->value.integer);
1222 n2 = mpz_get_si (order2->value.integer);
1223 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1224 result->rank = 1;
1225 result->shape = gfc_get_shape (1);
1226 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1228 if (n2 < n1)
1229 return result;
1231 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1232 YN(N, 0.0) = -Inf. */
1234 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1236 if (!jn && gfc_option.flag_range_check)
1238 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1239 gfc_free_expr (result);
1240 return &gfc_bad_expr;
1243 if (jn && n1 == 0)
1245 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1246 mpfr_set_ui (e->value.real, 1, GFC_RND_MODE);
1247 gfc_constructor_append_expr (&result->value.constructor, e,
1248 &x->where);
1249 n1++;
1252 for (i = n1; i <= n2; i++)
1254 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1255 if (jn)
1256 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
1257 else
1258 mpfr_set_inf (e->value.real, -1);
1259 gfc_constructor_append_expr (&result->value.constructor, e,
1260 &x->where);
1263 return result;
1266 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1267 are stable for downward recursion and Neumann functions are stable
1268 for upward recursion. It is
1269 x2rev = 2.0/x,
1270 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1271 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1272 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1274 gfc_set_model_kind (x->ts.kind);
1276 /* Get first recursion anchor. */
1278 mpfr_init (last1);
1279 if (jn)
1280 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1281 else
1282 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1284 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1285 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1286 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1288 mpfr_clear (last1);
1289 gfc_free_expr (e);
1290 gfc_free_expr (result);
1291 return &gfc_bad_expr;
1293 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1295 if (n1 == n2)
1297 mpfr_clear (last1);
1298 return result;
1301 /* Get second recursion anchor. */
1303 mpfr_init (last2);
1304 if (jn)
1305 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1306 else
1307 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1309 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1310 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1311 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1313 mpfr_clear (last1);
1314 mpfr_clear (last2);
1315 gfc_free_expr (e);
1316 gfc_free_expr (result);
1317 return &gfc_bad_expr;
1319 if (jn)
1320 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1321 else
1322 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1324 if (n1 + 1 == n2)
1326 mpfr_clear (last1);
1327 mpfr_clear (last2);
1328 return result;
1331 /* Start actual recursion. */
1333 mpfr_init (x2rev);
1334 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1336 for (i = 2; i <= n2-n1; i++)
1338 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1340 /* Special case: For YN, if the previous N gave -INF, set
1341 also N+1 to -INF. */
1342 if (!jn && !gfc_option.flag_range_check && mpfr_inf_p (last2))
1344 mpfr_set_inf (e->value.real, -1);
1345 gfc_constructor_append_expr (&result->value.constructor, e,
1346 &x->where);
1347 continue;
1350 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1351 GFC_RND_MODE);
1352 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1353 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1355 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1356 goto error;
1358 if (jn)
1359 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1360 -i-1);
1361 else
1362 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1364 mpfr_set (last1, last2, GFC_RND_MODE);
1365 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1368 mpfr_clear (last1);
1369 mpfr_clear (last2);
1370 mpfr_clear (x2rev);
1371 return result;
1373 error:
1374 mpfr_clear (last1);
1375 mpfr_clear (last2);
1376 mpfr_clear (x2rev);
1377 gfc_free_expr (e);
1378 gfc_free_expr (result);
1379 return &gfc_bad_expr;
1383 gfc_expr *
1384 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1386 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1390 gfc_expr *
1391 gfc_simplify_bessel_y0 (gfc_expr *x)
1393 gfc_expr *result;
1395 if (x->expr_type != EXPR_CONSTANT)
1396 return NULL;
1398 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1399 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1401 return range_check (result, "BESSEL_Y0");
1405 gfc_expr *
1406 gfc_simplify_bessel_y1 (gfc_expr *x)
1408 gfc_expr *result;
1410 if (x->expr_type != EXPR_CONSTANT)
1411 return NULL;
1413 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1414 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1416 return range_check (result, "BESSEL_Y1");
1420 gfc_expr *
1421 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1423 gfc_expr *result;
1424 long n;
1426 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1427 return NULL;
1429 n = mpz_get_si (order->value.integer);
1430 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1431 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1433 return range_check (result, "BESSEL_YN");
1437 gfc_expr *
1438 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1440 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1444 gfc_expr *
1445 gfc_simplify_bit_size (gfc_expr *e)
1447 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1448 return gfc_get_int_expr (e->ts.kind, &e->where,
1449 gfc_integer_kinds[i].bit_size);
1453 gfc_expr *
1454 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1456 int b;
1458 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1459 return NULL;
1461 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1462 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1464 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1465 mpz_tstbit (e->value.integer, b));
1469 static int
1470 compare_bitwise (gfc_expr *i, gfc_expr *j)
1472 mpz_t x, y;
1473 int k, res;
1475 gcc_assert (i->ts.type == BT_INTEGER);
1476 gcc_assert (j->ts.type == BT_INTEGER);
1478 mpz_init_set (x, i->value.integer);
1479 k = gfc_validate_kind (i->ts.type, i->ts.kind, false);
1480 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
1482 mpz_init_set (y, j->value.integer);
1483 k = gfc_validate_kind (j->ts.type, j->ts.kind, false);
1484 convert_mpz_to_unsigned (y, gfc_integer_kinds[k].bit_size);
1486 res = mpz_cmp (x, y);
1487 mpz_clear (x);
1488 mpz_clear (y);
1489 return res;
1493 gfc_expr *
1494 gfc_simplify_bge (gfc_expr *i, gfc_expr *j)
1496 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1497 return NULL;
1499 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1500 compare_bitwise (i, j) >= 0);
1504 gfc_expr *
1505 gfc_simplify_bgt (gfc_expr *i, gfc_expr *j)
1507 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1508 return NULL;
1510 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1511 compare_bitwise (i, j) > 0);
1515 gfc_expr *
1516 gfc_simplify_ble (gfc_expr *i, gfc_expr *j)
1518 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1519 return NULL;
1521 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1522 compare_bitwise (i, j) <= 0);
1526 gfc_expr *
1527 gfc_simplify_blt (gfc_expr *i, gfc_expr *j)
1529 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1530 return NULL;
1532 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1533 compare_bitwise (i, j) < 0);
1537 gfc_expr *
1538 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1540 gfc_expr *ceil, *result;
1541 int kind;
1543 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1544 if (kind == -1)
1545 return &gfc_bad_expr;
1547 if (e->expr_type != EXPR_CONSTANT)
1548 return NULL;
1550 ceil = gfc_copy_expr (e);
1551 mpfr_ceil (ceil->value.real, e->value.real);
1553 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1554 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1556 gfc_free_expr (ceil);
1558 return range_check (result, "CEILING");
1562 gfc_expr *
1563 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1565 return simplify_achar_char (e, k, "CHAR", false);
1569 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1571 static gfc_expr *
1572 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1574 gfc_expr *result;
1576 if (convert_boz (x, kind) == &gfc_bad_expr)
1577 return &gfc_bad_expr;
1579 if (convert_boz (y, kind) == &gfc_bad_expr)
1580 return &gfc_bad_expr;
1582 if (x->expr_type != EXPR_CONSTANT
1583 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1584 return NULL;
1586 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1588 switch (x->ts.type)
1590 case BT_INTEGER:
1591 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1592 break;
1594 case BT_REAL:
1595 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1596 break;
1598 case BT_COMPLEX:
1599 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1600 break;
1602 default:
1603 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1606 if (!y)
1607 return range_check (result, name);
1609 switch (y->ts.type)
1611 case BT_INTEGER:
1612 mpfr_set_z (mpc_imagref (result->value.complex),
1613 y->value.integer, GFC_RND_MODE);
1614 break;
1616 case BT_REAL:
1617 mpfr_set (mpc_imagref (result->value.complex),
1618 y->value.real, GFC_RND_MODE);
1619 break;
1621 default:
1622 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1625 return range_check (result, name);
1629 gfc_expr *
1630 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1632 int kind;
1634 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1635 if (kind == -1)
1636 return &gfc_bad_expr;
1638 return simplify_cmplx ("CMPLX", x, y, kind);
1642 gfc_expr *
1643 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1645 int kind;
1647 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1648 kind = gfc_default_complex_kind;
1649 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1650 kind = x->ts.kind;
1651 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1652 kind = y->ts.kind;
1653 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1654 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1655 else
1656 gcc_unreachable ();
1658 return simplify_cmplx ("COMPLEX", x, y, kind);
1662 gfc_expr *
1663 gfc_simplify_conjg (gfc_expr *e)
1665 gfc_expr *result;
1667 if (e->expr_type != EXPR_CONSTANT)
1668 return NULL;
1670 result = gfc_copy_expr (e);
1671 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1673 return range_check (result, "CONJG");
1677 gfc_expr *
1678 gfc_simplify_cos (gfc_expr *x)
1680 gfc_expr *result;
1682 if (x->expr_type != EXPR_CONSTANT)
1683 return NULL;
1685 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1687 switch (x->ts.type)
1689 case BT_REAL:
1690 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1691 break;
1693 case BT_COMPLEX:
1694 gfc_set_model_kind (x->ts.kind);
1695 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1696 break;
1698 default:
1699 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1702 return range_check (result, "COS");
1706 gfc_expr *
1707 gfc_simplify_cosh (gfc_expr *x)
1709 gfc_expr *result;
1711 if (x->expr_type != EXPR_CONSTANT)
1712 return NULL;
1714 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1716 switch (x->ts.type)
1718 case BT_REAL:
1719 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1720 break;
1722 case BT_COMPLEX:
1723 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1724 break;
1726 default:
1727 gcc_unreachable ();
1730 return range_check (result, "COSH");
1734 gfc_expr *
1735 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1737 gfc_expr *result;
1739 if (!is_constant_array_expr (mask)
1740 || !gfc_is_constant_expr (dim)
1741 || !gfc_is_constant_expr (kind))
1742 return NULL;
1744 result = transformational_result (mask, dim,
1745 BT_INTEGER,
1746 get_kind (BT_INTEGER, kind, "COUNT",
1747 gfc_default_integer_kind),
1748 &mask->where);
1750 init_result_expr (result, 0, NULL);
1752 /* Passing MASK twice, once as data array, once as mask.
1753 Whenever gfc_count is called, '1' is added to the result. */
1754 return !dim || mask->rank == 1 ?
1755 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1756 simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL);
1760 gfc_expr *
1761 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
1763 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
1767 gfc_expr *
1768 gfc_simplify_dble (gfc_expr *e)
1770 gfc_expr *result = NULL;
1772 if (e->expr_type != EXPR_CONSTANT)
1773 return NULL;
1775 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
1776 return &gfc_bad_expr;
1778 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
1779 if (result == &gfc_bad_expr)
1780 return &gfc_bad_expr;
1782 return range_check (result, "DBLE");
1786 gfc_expr *
1787 gfc_simplify_digits (gfc_expr *x)
1789 int i, digits;
1791 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1793 switch (x->ts.type)
1795 case BT_INTEGER:
1796 digits = gfc_integer_kinds[i].digits;
1797 break;
1799 case BT_REAL:
1800 case BT_COMPLEX:
1801 digits = gfc_real_kinds[i].digits;
1802 break;
1804 default:
1805 gcc_unreachable ();
1808 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
1812 gfc_expr *
1813 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1815 gfc_expr *result;
1816 int kind;
1818 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1819 return NULL;
1821 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1822 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
1824 switch (x->ts.type)
1826 case BT_INTEGER:
1827 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1828 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1829 else
1830 mpz_set_ui (result->value.integer, 0);
1832 break;
1834 case BT_REAL:
1835 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1836 mpfr_sub (result->value.real, x->value.real, y->value.real,
1837 GFC_RND_MODE);
1838 else
1839 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1841 break;
1843 default:
1844 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1847 return range_check (result, "DIM");
1851 gfc_expr*
1852 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
1854 if (!is_constant_array_expr (vector_a)
1855 || !is_constant_array_expr (vector_b))
1856 return NULL;
1858 gcc_assert (vector_a->rank == 1);
1859 gcc_assert (vector_b->rank == 1);
1860 gcc_assert (gfc_compare_types (&vector_a->ts, &vector_b->ts));
1862 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0);
1866 gfc_expr *
1867 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1869 gfc_expr *a1, *a2, *result;
1871 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1872 return NULL;
1874 a1 = gfc_real2real (x, gfc_default_double_kind);
1875 a2 = gfc_real2real (y, gfc_default_double_kind);
1877 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
1878 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1880 gfc_free_expr (a2);
1881 gfc_free_expr (a1);
1883 return range_check (result, "DPROD");
1887 static gfc_expr *
1888 simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg,
1889 bool right)
1891 gfc_expr *result;
1892 int i, k, size, shift;
1894 if (arg1->expr_type != EXPR_CONSTANT || arg2->expr_type != EXPR_CONSTANT
1895 || shiftarg->expr_type != EXPR_CONSTANT)
1896 return NULL;
1898 k = gfc_validate_kind (BT_INTEGER, arg1->ts.kind, false);
1899 size = gfc_integer_kinds[k].bit_size;
1901 if (gfc_extract_int (shiftarg, &shift) != NULL)
1903 gfc_error ("Invalid SHIFT argument of DSHIFTL at %L", &shiftarg->where);
1904 return &gfc_bad_expr;
1907 gcc_assert (shift >= 0 && shift <= size);
1909 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
1910 if (right)
1911 shift = size - shift;
1913 result = gfc_get_constant_expr (BT_INTEGER, arg1->ts.kind, &arg1->where);
1914 mpz_set_ui (result->value.integer, 0);
1916 for (i = 0; i < shift; i++)
1917 if (mpz_tstbit (arg2->value.integer, size - shift + i))
1918 mpz_setbit (result->value.integer, i);
1920 for (i = 0; i < size - shift; i++)
1921 if (mpz_tstbit (arg1->value.integer, i))
1922 mpz_setbit (result->value.integer, shift + i);
1924 /* Convert to a signed value. */
1925 convert_mpz_to_signed (result->value.integer, size);
1927 return result;
1931 gfc_expr *
1932 gfc_simplify_dshiftr (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
1934 return simplify_dshift (arg1, arg2, shiftarg, true);
1938 gfc_expr *
1939 gfc_simplify_dshiftl (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
1941 return simplify_dshift (arg1, arg2, shiftarg, false);
1945 gfc_expr *
1946 gfc_simplify_erf (gfc_expr *x)
1948 gfc_expr *result;
1950 if (x->expr_type != EXPR_CONSTANT)
1951 return NULL;
1953 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1954 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1956 return range_check (result, "ERF");
1960 gfc_expr *
1961 gfc_simplify_erfc (gfc_expr *x)
1963 gfc_expr *result;
1965 if (x->expr_type != EXPR_CONSTANT)
1966 return NULL;
1968 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1969 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1971 return range_check (result, "ERFC");
1975 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
1977 #define MAX_ITER 200
1978 #define ARG_LIMIT 12
1980 /* Calculate ERFC_SCALED directly by its definition:
1982 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
1984 using a large precision for intermediate results. This is used for all
1985 but large values of the argument. */
1986 static void
1987 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
1989 mp_prec_t prec;
1990 mpfr_t a, b;
1992 prec = mpfr_get_default_prec ();
1993 mpfr_set_default_prec (10 * prec);
1995 mpfr_init (a);
1996 mpfr_init (b);
1998 mpfr_set (a, arg, GFC_RND_MODE);
1999 mpfr_sqr (b, a, GFC_RND_MODE);
2000 mpfr_exp (b, b, GFC_RND_MODE);
2001 mpfr_erfc (a, a, GFC_RND_MODE);
2002 mpfr_mul (a, a, b, GFC_RND_MODE);
2004 mpfr_set (res, a, GFC_RND_MODE);
2005 mpfr_set_default_prec (prec);
2007 mpfr_clear (a);
2008 mpfr_clear (b);
2011 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2013 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2014 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2015 / (2 * x**2)**n)
2017 This is used for large values of the argument. Intermediate calculations
2018 are performed with twice the precision. We don't do a fixed number of
2019 iterations of the sum, but stop when it has converged to the required
2020 precision. */
2021 static void
2022 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
2024 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
2025 mpz_t num;
2026 mp_prec_t prec;
2027 unsigned i;
2029 prec = mpfr_get_default_prec ();
2030 mpfr_set_default_prec (2 * prec);
2032 mpfr_init (sum);
2033 mpfr_init (x);
2034 mpfr_init (u);
2035 mpfr_init (v);
2036 mpfr_init (w);
2037 mpz_init (num);
2039 mpfr_init (oldsum);
2040 mpfr_init (sumtrunc);
2041 mpfr_set_prec (oldsum, prec);
2042 mpfr_set_prec (sumtrunc, prec);
2044 mpfr_set (x, arg, GFC_RND_MODE);
2045 mpfr_set_ui (sum, 1, GFC_RND_MODE);
2046 mpz_set_ui (num, 1);
2048 mpfr_set (u, x, GFC_RND_MODE);
2049 mpfr_sqr (u, u, GFC_RND_MODE);
2050 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
2051 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
2053 for (i = 1; i < MAX_ITER; i++)
2055 mpfr_set (oldsum, sum, GFC_RND_MODE);
2057 mpz_mul_ui (num, num, 2 * i - 1);
2058 mpz_neg (num, num);
2060 mpfr_set (w, u, GFC_RND_MODE);
2061 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
2063 mpfr_set_z (v, num, GFC_RND_MODE);
2064 mpfr_mul (v, v, w, GFC_RND_MODE);
2066 mpfr_add (sum, sum, v, GFC_RND_MODE);
2068 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
2069 if (mpfr_cmp (sumtrunc, oldsum) == 0)
2070 break;
2073 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2074 set too low. */
2075 gcc_assert (i < MAX_ITER);
2077 /* Divide by x * sqrt(Pi). */
2078 mpfr_const_pi (u, GFC_RND_MODE);
2079 mpfr_sqrt (u, u, GFC_RND_MODE);
2080 mpfr_mul (u, u, x, GFC_RND_MODE);
2081 mpfr_div (sum, sum, u, GFC_RND_MODE);
2083 mpfr_set (res, sum, GFC_RND_MODE);
2084 mpfr_set_default_prec (prec);
2086 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
2087 mpz_clear (num);
2091 gfc_expr *
2092 gfc_simplify_erfc_scaled (gfc_expr *x)
2094 gfc_expr *result;
2096 if (x->expr_type != EXPR_CONSTANT)
2097 return NULL;
2099 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2100 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
2101 asympt_erfc_scaled (result->value.real, x->value.real);
2102 else
2103 fullprec_erfc_scaled (result->value.real, x->value.real);
2105 return range_check (result, "ERFC_SCALED");
2108 #undef MAX_ITER
2109 #undef ARG_LIMIT
2112 gfc_expr *
2113 gfc_simplify_epsilon (gfc_expr *e)
2115 gfc_expr *result;
2116 int i;
2118 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2120 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
2121 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
2123 return range_check (result, "EPSILON");
2127 gfc_expr *
2128 gfc_simplify_exp (gfc_expr *x)
2130 gfc_expr *result;
2132 if (x->expr_type != EXPR_CONSTANT)
2133 return NULL;
2135 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2137 switch (x->ts.type)
2139 case BT_REAL:
2140 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2141 break;
2143 case BT_COMPLEX:
2144 gfc_set_model_kind (x->ts.kind);
2145 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2146 break;
2148 default:
2149 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2152 return range_check (result, "EXP");
2156 gfc_expr *
2157 gfc_simplify_exponent (gfc_expr *x)
2159 int i;
2160 gfc_expr *result;
2162 if (x->expr_type != EXPR_CONSTANT)
2163 return NULL;
2165 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2166 &x->where);
2168 gfc_set_model (x->value.real);
2170 if (mpfr_sgn (x->value.real) == 0)
2172 mpz_set_ui (result->value.integer, 0);
2173 return result;
2176 i = (int) mpfr_get_exp (x->value.real);
2177 mpz_set_si (result->value.integer, i);
2179 return range_check (result, "EXPONENT");
2183 gfc_expr *
2184 gfc_simplify_float (gfc_expr *a)
2186 gfc_expr *result;
2188 if (a->expr_type != EXPR_CONSTANT)
2189 return NULL;
2191 if (a->is_boz)
2193 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2194 return &gfc_bad_expr;
2196 result = gfc_copy_expr (a);
2198 else
2199 result = gfc_int2real (a, gfc_default_real_kind);
2201 return range_check (result, "FLOAT");
2205 static bool
2206 is_last_ref_vtab (gfc_expr *e)
2208 gfc_ref *ref;
2209 gfc_component *comp = NULL;
2211 if (e->expr_type != EXPR_VARIABLE)
2212 return false;
2214 for (ref = e->ref; ref; ref = ref->next)
2215 if (ref->type == REF_COMPONENT)
2216 comp = ref->u.c.component;
2218 if (!e->ref || !comp)
2219 return e->symtree->n.sym->attr.vtab;
2221 if (comp->name[0] == '_' && strcmp (comp->name, "_vptr") == 0)
2222 return true;
2224 return false;
2228 gfc_expr *
2229 gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold)
2231 /* Avoid simplification of resolved symbols. */
2232 if (is_last_ref_vtab (a) || is_last_ref_vtab (mold))
2233 return NULL;
2235 if (a->ts.type == BT_DERIVED && mold->ts.type == BT_DERIVED)
2236 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2237 gfc_type_is_extension_of (mold->ts.u.derived,
2238 a->ts.u.derived));
2239 /* Return .false. if the dynamic type can never be the same. */
2240 if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS
2241 && !gfc_type_is_extension_of
2242 (mold->ts.u.derived->components->ts.u.derived,
2243 a->ts.u.derived->components->ts.u.derived)
2244 && !gfc_type_is_extension_of
2245 (a->ts.u.derived->components->ts.u.derived,
2246 mold->ts.u.derived->components->ts.u.derived))
2247 || (a->ts.type == BT_DERIVED && mold->ts.type == BT_CLASS
2248 && !gfc_type_is_extension_of
2249 (a->ts.u.derived,
2250 mold->ts.u.derived->components->ts.u.derived)
2251 && !gfc_type_is_extension_of
2252 (mold->ts.u.derived->components->ts.u.derived,
2253 a->ts.u.derived))
2254 || (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
2255 && !gfc_type_is_extension_of
2256 (mold->ts.u.derived,
2257 a->ts.u.derived->components->ts.u.derived)))
2258 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2260 if (mold->ts.type == BT_DERIVED
2261 && gfc_type_is_extension_of (mold->ts.u.derived,
2262 a->ts.u.derived->components->ts.u.derived))
2263 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, true);
2265 return NULL;
2269 gfc_expr *
2270 gfc_simplify_same_type_as (gfc_expr *a, gfc_expr *b)
2272 /* Avoid simplification of resolved symbols. */
2273 if (is_last_ref_vtab (a) || is_last_ref_vtab (b))
2274 return NULL;
2276 /* Return .false. if the dynamic type can never be the
2277 same. */
2278 if ((a->ts.type == BT_CLASS || b->ts.type == BT_CLASS)
2279 && !gfc_type_compatible (&a->ts, &b->ts)
2280 && !gfc_type_compatible (&b->ts, &a->ts))
2281 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2283 if (a->ts.type != BT_DERIVED || b->ts.type != BT_DERIVED)
2284 return NULL;
2286 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2287 gfc_compare_derived_types (a->ts.u.derived,
2288 b->ts.u.derived));
2292 gfc_expr *
2293 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
2295 gfc_expr *result;
2296 mpfr_t floor;
2297 int kind;
2299 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
2300 if (kind == -1)
2301 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2303 if (e->expr_type != EXPR_CONSTANT)
2304 return NULL;
2306 gfc_set_model_kind (kind);
2308 mpfr_init (floor);
2309 mpfr_floor (floor, e->value.real);
2311 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
2312 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2314 mpfr_clear (floor);
2316 return range_check (result, "FLOOR");
2320 gfc_expr *
2321 gfc_simplify_fraction (gfc_expr *x)
2323 gfc_expr *result;
2324 mpfr_t absv, exp, pow2;
2326 if (x->expr_type != EXPR_CONSTANT)
2327 return NULL;
2329 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
2331 if (mpfr_sgn (x->value.real) == 0)
2333 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2334 return result;
2337 gfc_set_model_kind (x->ts.kind);
2338 mpfr_init (exp);
2339 mpfr_init (absv);
2340 mpfr_init (pow2);
2342 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2343 mpfr_log2 (exp, absv, GFC_RND_MODE);
2345 mpfr_trunc (exp, exp);
2346 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2348 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2350 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
2352 mpfr_clears (exp, absv, pow2, NULL);
2354 return range_check (result, "FRACTION");
2358 gfc_expr *
2359 gfc_simplify_gamma (gfc_expr *x)
2361 gfc_expr *result;
2363 if (x->expr_type != EXPR_CONSTANT)
2364 return NULL;
2366 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2367 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2369 return range_check (result, "GAMMA");
2373 gfc_expr *
2374 gfc_simplify_huge (gfc_expr *e)
2376 gfc_expr *result;
2377 int i;
2379 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2380 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2382 switch (e->ts.type)
2384 case BT_INTEGER:
2385 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2386 break;
2388 case BT_REAL:
2389 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2390 break;
2392 default:
2393 gcc_unreachable ();
2396 return result;
2400 gfc_expr *
2401 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2403 gfc_expr *result;
2405 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2406 return NULL;
2408 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2409 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2410 return range_check (result, "HYPOT");
2414 /* We use the processor's collating sequence, because all
2415 systems that gfortran currently works on are ASCII. */
2417 gfc_expr *
2418 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2420 gfc_expr *result;
2421 gfc_char_t index;
2422 int k;
2424 if (e->expr_type != EXPR_CONSTANT)
2425 return NULL;
2427 if (e->value.character.length != 1)
2429 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2430 return &gfc_bad_expr;
2433 index = e->value.character.string[0];
2435 if (gfc_option.warn_surprising && index > 127)
2436 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2437 &e->where);
2439 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
2440 if (k == -1)
2441 return &gfc_bad_expr;
2443 result = gfc_get_int_expr (k, &e->where, index);
2445 return range_check (result, "IACHAR");
2449 static gfc_expr *
2450 do_bit_and (gfc_expr *result, gfc_expr *e)
2452 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2453 gcc_assert (result->ts.type == BT_INTEGER
2454 && result->expr_type == EXPR_CONSTANT);
2456 mpz_and (result->value.integer, result->value.integer, e->value.integer);
2457 return result;
2461 gfc_expr *
2462 gfc_simplify_iall (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2464 return simplify_transformation (array, dim, mask, -1, do_bit_and);
2468 static gfc_expr *
2469 do_bit_ior (gfc_expr *result, gfc_expr *e)
2471 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2472 gcc_assert (result->ts.type == BT_INTEGER
2473 && result->expr_type == EXPR_CONSTANT);
2475 mpz_ior (result->value.integer, result->value.integer, e->value.integer);
2476 return result;
2480 gfc_expr *
2481 gfc_simplify_iany (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2483 return simplify_transformation (array, dim, mask, 0, do_bit_ior);
2487 gfc_expr *
2488 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2490 gfc_expr *result;
2492 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2493 return NULL;
2495 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2496 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2498 return range_check (result, "IAND");
2502 gfc_expr *
2503 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2505 gfc_expr *result;
2506 int k, pos;
2508 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2509 return NULL;
2511 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2513 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
2514 return &gfc_bad_expr;
2517 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2519 if (pos >= gfc_integer_kinds[k].bit_size)
2521 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
2522 &y->where);
2523 return &gfc_bad_expr;
2526 result = gfc_copy_expr (x);
2528 convert_mpz_to_unsigned (result->value.integer,
2529 gfc_integer_kinds[k].bit_size);
2531 mpz_clrbit (result->value.integer, pos);
2533 convert_mpz_to_signed (result->value.integer,
2534 gfc_integer_kinds[k].bit_size);
2536 return result;
2540 gfc_expr *
2541 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2543 gfc_expr *result;
2544 int pos, len;
2545 int i, k, bitsize;
2546 int *bits;
2548 if (x->expr_type != EXPR_CONSTANT
2549 || y->expr_type != EXPR_CONSTANT
2550 || z->expr_type != EXPR_CONSTANT)
2551 return NULL;
2553 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2555 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
2556 return &gfc_bad_expr;
2559 if (gfc_extract_int (z, &len) != NULL || len < 0)
2561 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
2562 return &gfc_bad_expr;
2565 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2567 bitsize = gfc_integer_kinds[k].bit_size;
2569 if (pos + len > bitsize)
2571 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2572 "bit size at %L", &y->where);
2573 return &gfc_bad_expr;
2576 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2577 convert_mpz_to_unsigned (result->value.integer,
2578 gfc_integer_kinds[k].bit_size);
2580 bits = XCNEWVEC (int, bitsize);
2582 for (i = 0; i < bitsize; i++)
2583 bits[i] = 0;
2585 for (i = 0; i < len; i++)
2586 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2588 for (i = 0; i < bitsize; i++)
2590 if (bits[i] == 0)
2591 mpz_clrbit (result->value.integer, i);
2592 else if (bits[i] == 1)
2593 mpz_setbit (result->value.integer, i);
2594 else
2595 gfc_internal_error ("IBITS: Bad bit");
2598 free (bits);
2600 convert_mpz_to_signed (result->value.integer,
2601 gfc_integer_kinds[k].bit_size);
2603 return result;
2607 gfc_expr *
2608 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2610 gfc_expr *result;
2611 int k, pos;
2613 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2614 return NULL;
2616 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2618 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
2619 return &gfc_bad_expr;
2622 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2624 if (pos >= gfc_integer_kinds[k].bit_size)
2626 gfc_error ("Second argument of IBSET exceeds bit size at %L",
2627 &y->where);
2628 return &gfc_bad_expr;
2631 result = gfc_copy_expr (x);
2633 convert_mpz_to_unsigned (result->value.integer,
2634 gfc_integer_kinds[k].bit_size);
2636 mpz_setbit (result->value.integer, pos);
2638 convert_mpz_to_signed (result->value.integer,
2639 gfc_integer_kinds[k].bit_size);
2641 return result;
2645 gfc_expr *
2646 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2648 gfc_expr *result;
2649 gfc_char_t index;
2650 int k;
2652 if (e->expr_type != EXPR_CONSTANT)
2653 return NULL;
2655 if (e->value.character.length != 1)
2657 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2658 return &gfc_bad_expr;
2661 index = e->value.character.string[0];
2663 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
2664 if (k == -1)
2665 return &gfc_bad_expr;
2667 result = gfc_get_int_expr (k, &e->where, index);
2669 return range_check (result, "ICHAR");
2673 gfc_expr *
2674 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2676 gfc_expr *result;
2678 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2679 return NULL;
2681 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2682 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2684 return range_check (result, "IEOR");
2688 gfc_expr *
2689 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2691 gfc_expr *result;
2692 int back, len, lensub;
2693 int i, j, k, count, index = 0, start;
2695 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2696 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2697 return NULL;
2699 if (b != NULL && b->value.logical != 0)
2700 back = 1;
2701 else
2702 back = 0;
2704 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2705 if (k == -1)
2706 return &gfc_bad_expr;
2708 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
2710 len = x->value.character.length;
2711 lensub = y->value.character.length;
2713 if (len < lensub)
2715 mpz_set_si (result->value.integer, 0);
2716 return result;
2719 if (back == 0)
2721 if (lensub == 0)
2723 mpz_set_si (result->value.integer, 1);
2724 return result;
2726 else if (lensub == 1)
2728 for (i = 0; i < len; i++)
2730 for (j = 0; j < lensub; j++)
2732 if (y->value.character.string[j]
2733 == x->value.character.string[i])
2735 index = i + 1;
2736 goto done;
2741 else
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 start = i;
2751 count = 0;
2753 for (k = 0; k < lensub; k++)
2755 if (y->value.character.string[k]
2756 == x->value.character.string[k + start])
2757 count++;
2760 if (count == lensub)
2762 index = start + 1;
2763 goto done;
2771 else
2773 if (lensub == 0)
2775 mpz_set_si (result->value.integer, len + 1);
2776 return result;
2778 else if (lensub == 1)
2780 for (i = 0; i < len; i++)
2782 for (j = 0; j < lensub; j++)
2784 if (y->value.character.string[j]
2785 == x->value.character.string[len - i])
2787 index = len - i + 1;
2788 goto done;
2793 else
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 start = len - i;
2803 if (start <= len - lensub)
2805 count = 0;
2806 for (k = 0; k < lensub; k++)
2807 if (y->value.character.string[k]
2808 == x->value.character.string[k + start])
2809 count++;
2811 if (count == lensub)
2813 index = start + 1;
2814 goto done;
2817 else
2819 continue;
2827 done:
2828 mpz_set_si (result->value.integer, index);
2829 return range_check (result, "INDEX");
2833 static gfc_expr *
2834 simplify_intconv (gfc_expr *e, int kind, const char *name)
2836 gfc_expr *result = NULL;
2838 if (e->expr_type != EXPR_CONSTANT)
2839 return NULL;
2841 result = gfc_convert_constant (e, BT_INTEGER, kind);
2842 if (result == &gfc_bad_expr)
2843 return &gfc_bad_expr;
2845 return range_check (result, name);
2849 gfc_expr *
2850 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
2852 int kind;
2854 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
2855 if (kind == -1)
2856 return &gfc_bad_expr;
2858 return simplify_intconv (e, kind, "INT");
2861 gfc_expr *
2862 gfc_simplify_int2 (gfc_expr *e)
2864 return simplify_intconv (e, 2, "INT2");
2868 gfc_expr *
2869 gfc_simplify_int8 (gfc_expr *e)
2871 return simplify_intconv (e, 8, "INT8");
2875 gfc_expr *
2876 gfc_simplify_long (gfc_expr *e)
2878 return simplify_intconv (e, 4, "LONG");
2882 gfc_expr *
2883 gfc_simplify_ifix (gfc_expr *e)
2885 gfc_expr *rtrunc, *result;
2887 if (e->expr_type != EXPR_CONSTANT)
2888 return NULL;
2890 rtrunc = gfc_copy_expr (e);
2891 mpfr_trunc (rtrunc->value.real, e->value.real);
2893 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2894 &e->where);
2895 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2897 gfc_free_expr (rtrunc);
2899 return range_check (result, "IFIX");
2903 gfc_expr *
2904 gfc_simplify_idint (gfc_expr *e)
2906 gfc_expr *rtrunc, *result;
2908 if (e->expr_type != EXPR_CONSTANT)
2909 return NULL;
2911 rtrunc = gfc_copy_expr (e);
2912 mpfr_trunc (rtrunc->value.real, e->value.real);
2914 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2915 &e->where);
2916 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2918 gfc_free_expr (rtrunc);
2920 return range_check (result, "IDINT");
2924 gfc_expr *
2925 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
2927 gfc_expr *result;
2929 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2930 return NULL;
2932 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2933 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2935 return range_check (result, "IOR");
2939 static gfc_expr *
2940 do_bit_xor (gfc_expr *result, gfc_expr *e)
2942 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2943 gcc_assert (result->ts.type == BT_INTEGER
2944 && result->expr_type == EXPR_CONSTANT);
2946 mpz_xor (result->value.integer, result->value.integer, e->value.integer);
2947 return result;
2951 gfc_expr *
2952 gfc_simplify_iparity (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2954 return simplify_transformation (array, dim, mask, 0, do_bit_xor);
2959 gfc_expr *
2960 gfc_simplify_is_iostat_end (gfc_expr *x)
2962 if (x->expr_type != EXPR_CONSTANT)
2963 return NULL;
2965 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2966 mpz_cmp_si (x->value.integer,
2967 LIBERROR_END) == 0);
2971 gfc_expr *
2972 gfc_simplify_is_iostat_eor (gfc_expr *x)
2974 if (x->expr_type != EXPR_CONSTANT)
2975 return NULL;
2977 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2978 mpz_cmp_si (x->value.integer,
2979 LIBERROR_EOR) == 0);
2983 gfc_expr *
2984 gfc_simplify_isnan (gfc_expr *x)
2986 if (x->expr_type != EXPR_CONSTANT)
2987 return NULL;
2989 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2990 mpfr_nan_p (x->value.real));
2994 /* Performs a shift on its first argument. Depending on the last
2995 argument, the shift can be arithmetic, i.e. with filling from the
2996 left like in the SHIFTA intrinsic. */
2997 static gfc_expr *
2998 simplify_shift (gfc_expr *e, gfc_expr *s, const char *name,
2999 bool arithmetic, int direction)
3001 gfc_expr *result;
3002 int ashift, *bits, i, k, bitsize, shift;
3004 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3005 return NULL;
3006 if (gfc_extract_int (s, &shift) != NULL)
3008 gfc_error ("Invalid second argument of %s at %L", name, &s->where);
3009 return &gfc_bad_expr;
3012 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
3013 bitsize = gfc_integer_kinds[k].bit_size;
3015 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3017 if (shift == 0)
3019 mpz_set (result->value.integer, e->value.integer);
3020 return result;
3023 if (direction > 0 && shift < 0)
3025 /* Left shift, as in SHIFTL. */
3026 gfc_error ("Second argument of %s is negative at %L", name, &e->where);
3027 return &gfc_bad_expr;
3029 else if (direction < 0)
3031 /* Right shift, as in SHIFTR or SHIFTA. */
3032 if (shift < 0)
3034 gfc_error ("Second argument of %s is negative at %L",
3035 name, &e->where);
3036 return &gfc_bad_expr;
3039 shift = -shift;
3042 ashift = (shift >= 0 ? shift : -shift);
3044 if (ashift > bitsize)
3046 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3047 "at %L", name, &e->where);
3048 return &gfc_bad_expr;
3051 bits = XCNEWVEC (int, bitsize);
3053 for (i = 0; i < bitsize; i++)
3054 bits[i] = mpz_tstbit (e->value.integer, i);
3056 if (shift > 0)
3058 /* Left shift. */
3059 for (i = 0; i < shift; i++)
3060 mpz_clrbit (result->value.integer, i);
3062 for (i = 0; i < bitsize - shift; i++)
3064 if (bits[i] == 0)
3065 mpz_clrbit (result->value.integer, i + shift);
3066 else
3067 mpz_setbit (result->value.integer, i + shift);
3070 else
3072 /* Right shift. */
3073 if (arithmetic && bits[bitsize - 1])
3074 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3075 mpz_setbit (result->value.integer, i);
3076 else
3077 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3078 mpz_clrbit (result->value.integer, i);
3080 for (i = bitsize - 1; i >= ashift; i--)
3082 if (bits[i] == 0)
3083 mpz_clrbit (result->value.integer, i - ashift);
3084 else
3085 mpz_setbit (result->value.integer, i - ashift);
3089 convert_mpz_to_signed (result->value.integer, bitsize);
3090 free (bits);
3092 return result;
3096 gfc_expr *
3097 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
3099 return simplify_shift (e, s, "ISHFT", false, 0);
3103 gfc_expr *
3104 gfc_simplify_lshift (gfc_expr *e, gfc_expr *s)
3106 return simplify_shift (e, s, "LSHIFT", false, 1);
3110 gfc_expr *
3111 gfc_simplify_rshift (gfc_expr *e, gfc_expr *s)
3113 return simplify_shift (e, s, "RSHIFT", true, -1);
3117 gfc_expr *
3118 gfc_simplify_shifta (gfc_expr *e, gfc_expr *s)
3120 return simplify_shift (e, s, "SHIFTA", true, -1);
3124 gfc_expr *
3125 gfc_simplify_shiftl (gfc_expr *e, gfc_expr *s)
3127 return simplify_shift (e, s, "SHIFTL", false, 1);
3131 gfc_expr *
3132 gfc_simplify_shiftr (gfc_expr *e, gfc_expr *s)
3134 return simplify_shift (e, s, "SHIFTR", false, -1);
3138 gfc_expr *
3139 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
3141 gfc_expr *result;
3142 int shift, ashift, isize, ssize, delta, k;
3143 int i, *bits;
3145 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3146 return NULL;
3148 if (gfc_extract_int (s, &shift) != NULL)
3150 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
3151 return &gfc_bad_expr;
3154 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3155 isize = gfc_integer_kinds[k].bit_size;
3157 if (sz != NULL)
3159 if (sz->expr_type != EXPR_CONSTANT)
3160 return NULL;
3162 if (gfc_extract_int (sz, &ssize) != NULL || ssize <= 0)
3164 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
3165 return &gfc_bad_expr;
3168 if (ssize > isize)
3170 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
3171 "BIT_SIZE of first argument at %L", &s->where);
3172 return &gfc_bad_expr;
3175 else
3176 ssize = isize;
3178 if (shift >= 0)
3179 ashift = shift;
3180 else
3181 ashift = -shift;
3183 if (ashift > ssize)
3185 if (sz != NULL)
3186 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3187 "third argument at %L", &s->where);
3188 else
3189 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3190 "BIT_SIZE of first argument at %L", &s->where);
3191 return &gfc_bad_expr;
3194 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3196 mpz_set (result->value.integer, e->value.integer);
3198 if (shift == 0)
3199 return result;
3201 convert_mpz_to_unsigned (result->value.integer, isize);
3203 bits = XCNEWVEC (int, ssize);
3205 for (i = 0; i < ssize; i++)
3206 bits[i] = mpz_tstbit (e->value.integer, i);
3208 delta = ssize - ashift;
3210 if (shift > 0)
3212 for (i = 0; i < delta; i++)
3214 if (bits[i] == 0)
3215 mpz_clrbit (result->value.integer, i + shift);
3216 else
3217 mpz_setbit (result->value.integer, i + shift);
3220 for (i = delta; i < ssize; i++)
3222 if (bits[i] == 0)
3223 mpz_clrbit (result->value.integer, i - delta);
3224 else
3225 mpz_setbit (result->value.integer, i - delta);
3228 else
3230 for (i = 0; i < ashift; i++)
3232 if (bits[i] == 0)
3233 mpz_clrbit (result->value.integer, i + delta);
3234 else
3235 mpz_setbit (result->value.integer, i + delta);
3238 for (i = ashift; i < ssize; i++)
3240 if (bits[i] == 0)
3241 mpz_clrbit (result->value.integer, i + shift);
3242 else
3243 mpz_setbit (result->value.integer, i + shift);
3247 convert_mpz_to_signed (result->value.integer, isize);
3249 free (bits);
3250 return result;
3254 gfc_expr *
3255 gfc_simplify_kind (gfc_expr *e)
3257 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
3261 static gfc_expr *
3262 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
3263 gfc_array_spec *as, gfc_ref *ref, bool coarray)
3265 gfc_expr *l, *u, *result;
3266 int k;
3268 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3269 gfc_default_integer_kind);
3270 if (k == -1)
3271 return &gfc_bad_expr;
3273 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3275 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3276 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3277 if (!coarray && array->expr_type != EXPR_VARIABLE)
3279 if (upper)
3281 gfc_expr* dim = result;
3282 mpz_set_si (dim->value.integer, d);
3284 result = gfc_simplify_size (array, dim, kind);
3285 gfc_free_expr (dim);
3286 if (!result)
3287 goto returnNull;
3289 else
3290 mpz_set_si (result->value.integer, 1);
3292 goto done;
3295 /* Otherwise, we have a variable expression. */
3296 gcc_assert (array->expr_type == EXPR_VARIABLE);
3297 gcc_assert (as);
3299 /* The last dimension of an assumed-size array is special. */
3300 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
3301 || (coarray && d == as->rank + as->corank
3302 && (!upper || gfc_option.coarray == GFC_FCOARRAY_SINGLE)))
3304 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
3306 gfc_free_expr (result);
3307 return gfc_copy_expr (as->lower[d-1]);
3310 goto returnNull;
3313 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3315 /* Then, we need to know the extent of the given dimension. */
3316 if (coarray || ref->u.ar.type == AR_FULL)
3318 l = as->lower[d-1];
3319 u = as->upper[d-1];
3321 if (l->expr_type != EXPR_CONSTANT || u == NULL
3322 || u->expr_type != EXPR_CONSTANT)
3323 goto returnNull;
3325 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
3327 /* Zero extent. */
3328 if (upper)
3329 mpz_set_si (result->value.integer, 0);
3330 else
3331 mpz_set_si (result->value.integer, 1);
3333 else
3335 /* Nonzero extent. */
3336 if (upper)
3337 mpz_set (result->value.integer, u->value.integer);
3338 else
3339 mpz_set (result->value.integer, l->value.integer);
3342 else
3344 if (upper)
3346 if (gfc_ref_dimen_size (&ref->u.ar, d-1, &result->value.integer, NULL)
3347 != SUCCESS)
3348 goto returnNull;
3350 else
3351 mpz_set_si (result->value.integer, (long int) 1);
3354 done:
3355 return range_check (result, upper ? "UBOUND" : "LBOUND");
3357 returnNull:
3358 gfc_free_expr (result);
3359 return NULL;
3363 static gfc_expr *
3364 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3366 gfc_ref *ref;
3367 gfc_array_spec *as;
3368 int d;
3370 if (array->expr_type != EXPR_VARIABLE)
3372 as = NULL;
3373 ref = NULL;
3374 goto done;
3377 /* Follow any component references. */
3378 as = array->symtree->n.sym->as;
3379 for (ref = array->ref; ref; ref = ref->next)
3381 switch (ref->type)
3383 case REF_ARRAY:
3384 switch (ref->u.ar.type)
3386 case AR_ELEMENT:
3387 as = NULL;
3388 continue;
3390 case AR_FULL:
3391 /* We're done because 'as' has already been set in the
3392 previous iteration. */
3393 if (!ref->next)
3394 goto done;
3396 /* Fall through. */
3398 case AR_UNKNOWN:
3399 return NULL;
3401 case AR_SECTION:
3402 as = ref->u.ar.as;
3403 goto done;
3406 gcc_unreachable ();
3408 case REF_COMPONENT:
3409 as = ref->u.c.component->as;
3410 continue;
3412 case REF_SUBSTRING:
3413 continue;
3417 gcc_unreachable ();
3419 done:
3421 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE))
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 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3495 static gfc_expr *
3496 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3498 gfc_ref *ref;
3499 gfc_array_spec *as;
3500 int d;
3502 if (array->expr_type != EXPR_VARIABLE)
3503 return NULL;
3505 /* Follow any component references. */
3506 as = array->symtree->n.sym->as;
3507 for (ref = array->ref; ref; ref = ref->next)
3509 switch (ref->type)
3511 case REF_ARRAY:
3512 switch (ref->u.ar.type)
3514 case AR_ELEMENT:
3515 if (ref->next == NULL)
3517 gcc_assert (ref->u.ar.as->corank > 0
3518 && ref->u.ar.as->rank == 0);
3519 as = ref->u.ar.as;
3520 goto done;
3522 as = NULL;
3523 continue;
3525 case AR_FULL:
3526 /* We're done because 'as' has already been set in the
3527 previous iteration. */
3528 if (!ref->next)
3529 goto done;
3531 /* Fall through. */
3533 case AR_UNKNOWN:
3534 return NULL;
3536 case AR_SECTION:
3537 as = ref->u.ar.as;
3538 goto done;
3541 gcc_unreachable ();
3543 case REF_COMPONENT:
3544 as = ref->u.c.component->as;
3545 continue;
3547 case REF_SUBSTRING:
3548 continue;
3552 gcc_unreachable ();
3554 done:
3556 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
3557 return NULL;
3559 if (dim == NULL)
3561 /* Multi-dimensional cobounds. */
3562 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3563 gfc_expr *e;
3564 int k;
3566 /* Simplify the cobounds for each dimension. */
3567 for (d = 0; d < as->corank; d++)
3569 bounds[d] = simplify_bound_dim (array, kind, d + 1 + array->rank,
3570 upper, as, ref, true);
3571 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3573 int j;
3575 for (j = 0; j < d; j++)
3576 gfc_free_expr (bounds[j]);
3577 return bounds[d];
3581 /* Allocate the result expression. */
3582 e = gfc_get_expr ();
3583 e->where = array->where;
3584 e->expr_type = EXPR_ARRAY;
3585 e->ts.type = BT_INTEGER;
3586 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3587 gfc_default_integer_kind);
3588 if (k == -1)
3590 gfc_free_expr (e);
3591 return &gfc_bad_expr;
3593 e->ts.kind = k;
3595 /* The result is a rank 1 array; its size is the rank of the first
3596 argument to {L,U}COBOUND. */
3597 e->rank = 1;
3598 e->shape = gfc_get_shape (1);
3599 mpz_init_set_ui (e->shape[0], as->corank);
3601 /* Create the constructor for this array. */
3602 for (d = 0; d < as->corank; d++)
3603 gfc_constructor_append_expr (&e->value.constructor,
3604 bounds[d], &e->where);
3605 return e;
3607 else
3609 /* A DIM argument is specified. */
3610 if (dim->expr_type != EXPR_CONSTANT)
3611 return NULL;
3613 d = mpz_get_si (dim->value.integer);
3615 if (d < 1 || d > as->corank)
3617 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3618 return &gfc_bad_expr;
3621 return simplify_bound_dim (array, kind, d+array->rank, upper, as, ref, true);
3626 gfc_expr *
3627 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3629 return simplify_bound (array, dim, kind, 0);
3633 gfc_expr *
3634 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3636 return simplify_cobound (array, dim, kind, 0);
3639 gfc_expr *
3640 gfc_simplify_leadz (gfc_expr *e)
3642 unsigned long lz, bs;
3643 int i;
3645 if (e->expr_type != EXPR_CONSTANT)
3646 return NULL;
3648 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3649 bs = gfc_integer_kinds[i].bit_size;
3650 if (mpz_cmp_si (e->value.integer, 0) == 0)
3651 lz = bs;
3652 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3653 lz = 0;
3654 else
3655 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3657 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3661 gfc_expr *
3662 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3664 gfc_expr *result;
3665 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3667 if (k == -1)
3668 return &gfc_bad_expr;
3670 if (e->expr_type == EXPR_CONSTANT)
3672 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3673 mpz_set_si (result->value.integer, e->value.character.length);
3674 return range_check (result, "LEN");
3676 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3677 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3678 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3680 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3681 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3682 return range_check (result, "LEN");
3684 else
3685 return NULL;
3689 gfc_expr *
3690 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3692 gfc_expr *result;
3693 int count, len, i;
3694 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3696 if (k == -1)
3697 return &gfc_bad_expr;
3699 if (e->expr_type != EXPR_CONSTANT)
3700 return NULL;
3702 len = e->value.character.length;
3703 for (count = 0, i = 1; i <= len; i++)
3704 if (e->value.character.string[len - i] == ' ')
3705 count++;
3706 else
3707 break;
3709 result = gfc_get_int_expr (k, &e->where, len - count);
3710 return range_check (result, "LEN_TRIM");
3713 gfc_expr *
3714 gfc_simplify_lgamma (gfc_expr *x)
3716 gfc_expr *result;
3717 int sg;
3719 if (x->expr_type != EXPR_CONSTANT)
3720 return NULL;
3722 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3723 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
3725 return range_check (result, "LGAMMA");
3729 gfc_expr *
3730 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
3732 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3733 return NULL;
3735 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3736 gfc_compare_string (a, b) >= 0);
3740 gfc_expr *
3741 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
3743 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3744 return NULL;
3746 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3747 gfc_compare_string (a, b) > 0);
3751 gfc_expr *
3752 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
3754 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3755 return NULL;
3757 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3758 gfc_compare_string (a, b) <= 0);
3762 gfc_expr *
3763 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
3765 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3766 return NULL;
3768 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3769 gfc_compare_string (a, b) < 0);
3773 gfc_expr *
3774 gfc_simplify_log (gfc_expr *x)
3776 gfc_expr *result;
3778 if (x->expr_type != EXPR_CONSTANT)
3779 return NULL;
3781 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3783 switch (x->ts.type)
3785 case BT_REAL:
3786 if (mpfr_sgn (x->value.real) <= 0)
3788 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3789 "to zero", &x->where);
3790 gfc_free_expr (result);
3791 return &gfc_bad_expr;
3794 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
3795 break;
3797 case BT_COMPLEX:
3798 if ((mpfr_sgn (mpc_realref (x->value.complex)) == 0)
3799 && (mpfr_sgn (mpc_imagref (x->value.complex)) == 0))
3801 gfc_error ("Complex argument of LOG at %L cannot be zero",
3802 &x->where);
3803 gfc_free_expr (result);
3804 return &gfc_bad_expr;
3807 gfc_set_model_kind (x->ts.kind);
3808 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
3809 break;
3811 default:
3812 gfc_internal_error ("gfc_simplify_log: bad type");
3815 return range_check (result, "LOG");
3819 gfc_expr *
3820 gfc_simplify_log10 (gfc_expr *x)
3822 gfc_expr *result;
3824 if (x->expr_type != EXPR_CONSTANT)
3825 return NULL;
3827 if (mpfr_sgn (x->value.real) <= 0)
3829 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3830 "to zero", &x->where);
3831 return &gfc_bad_expr;
3834 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3835 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
3837 return range_check (result, "LOG10");
3841 gfc_expr *
3842 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
3844 int kind;
3846 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
3847 if (kind < 0)
3848 return &gfc_bad_expr;
3850 if (e->expr_type != EXPR_CONSTANT)
3851 return NULL;
3853 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
3857 gfc_expr*
3858 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
3860 gfc_expr *result;
3861 int row, result_rows, col, result_columns;
3862 int stride_a, offset_a, stride_b, offset_b;
3864 if (!is_constant_array_expr (matrix_a)
3865 || !is_constant_array_expr (matrix_b))
3866 return NULL;
3868 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
3869 result = gfc_get_array_expr (matrix_a->ts.type,
3870 matrix_a->ts.kind,
3871 &matrix_a->where);
3873 if (matrix_a->rank == 1 && matrix_b->rank == 2)
3875 result_rows = 1;
3876 result_columns = mpz_get_si (matrix_b->shape[0]);
3877 stride_a = 1;
3878 stride_b = mpz_get_si (matrix_b->shape[0]);
3880 result->rank = 1;
3881 result->shape = gfc_get_shape (result->rank);
3882 mpz_init_set_si (result->shape[0], result_columns);
3884 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
3886 result_rows = mpz_get_si (matrix_b->shape[0]);
3887 result_columns = 1;
3888 stride_a = mpz_get_si (matrix_a->shape[0]);
3889 stride_b = 1;
3891 result->rank = 1;
3892 result->shape = gfc_get_shape (result->rank);
3893 mpz_init_set_si (result->shape[0], result_rows);
3895 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
3897 result_rows = mpz_get_si (matrix_a->shape[0]);
3898 result_columns = mpz_get_si (matrix_b->shape[1]);
3899 stride_a = mpz_get_si (matrix_a->shape[1]);
3900 stride_b = mpz_get_si (matrix_b->shape[0]);
3902 result->rank = 2;
3903 result->shape = gfc_get_shape (result->rank);
3904 mpz_init_set_si (result->shape[0], result_rows);
3905 mpz_init_set_si (result->shape[1], result_columns);
3907 else
3908 gcc_unreachable();
3910 offset_a = offset_b = 0;
3911 for (col = 0; col < result_columns; ++col)
3913 offset_a = 0;
3915 for (row = 0; row < result_rows; ++row)
3917 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
3918 matrix_b, 1, offset_b);
3919 gfc_constructor_append_expr (&result->value.constructor,
3920 e, NULL);
3922 offset_a += 1;
3925 offset_b += stride_b;
3928 return result;
3932 gfc_expr *
3933 gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
3935 gfc_expr *result;
3936 int kind, arg, k;
3937 const char *s;
3939 if (i->expr_type != EXPR_CONSTANT)
3940 return NULL;
3942 kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind);
3943 if (kind == -1)
3944 return &gfc_bad_expr;
3945 k = gfc_validate_kind (BT_INTEGER, kind, false);
3947 s = gfc_extract_int (i, &arg);
3948 gcc_assert (!s);
3950 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
3952 /* MASKR(n) = 2^n - 1 */
3953 mpz_set_ui (result->value.integer, 1);
3954 mpz_mul_2exp (result->value.integer, result->value.integer, arg);
3955 mpz_sub_ui (result->value.integer, result->value.integer, 1);
3957 convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
3959 return result;
3963 gfc_expr *
3964 gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
3966 gfc_expr *result;
3967 int kind, arg, k;
3968 const char *s;
3969 mpz_t z;
3971 if (i->expr_type != EXPR_CONSTANT)
3972 return NULL;
3974 kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind);
3975 if (kind == -1)
3976 return &gfc_bad_expr;
3977 k = gfc_validate_kind (BT_INTEGER, kind, false);
3979 s = gfc_extract_int (i, &arg);
3980 gcc_assert (!s);
3982 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
3984 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
3985 mpz_init_set_ui (z, 1);
3986 mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size);
3987 mpz_set_ui (result->value.integer, 1);
3988 mpz_mul_2exp (result->value.integer, result->value.integer,
3989 gfc_integer_kinds[k].bit_size - arg);
3990 mpz_sub (result->value.integer, z, result->value.integer);
3991 mpz_clear (z);
3993 convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
3995 return result;
3999 gfc_expr *
4000 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
4002 if (tsource->expr_type != EXPR_CONSTANT
4003 || fsource->expr_type != EXPR_CONSTANT
4004 || mask->expr_type != EXPR_CONSTANT)
4005 return NULL;
4007 return gfc_copy_expr (mask->value.logical ? tsource : fsource);
4011 gfc_expr *
4012 gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr)
4014 mpz_t arg1, arg2, mask;
4015 gfc_expr *result;
4017 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT
4018 || mask_expr->expr_type != EXPR_CONSTANT)
4019 return NULL;
4021 result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where);
4023 /* Convert all argument to unsigned. */
4024 mpz_init_set (arg1, i->value.integer);
4025 mpz_init_set (arg2, j->value.integer);
4026 mpz_init_set (mask, mask_expr->value.integer);
4028 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4029 mpz_and (arg1, arg1, mask);
4030 mpz_com (mask, mask);
4031 mpz_and (arg2, arg2, mask);
4032 mpz_ior (result->value.integer, arg1, arg2);
4034 mpz_clear (arg1);
4035 mpz_clear (arg2);
4036 mpz_clear (mask);
4038 return result;
4042 /* Selects between current value and extremum for simplify_min_max
4043 and simplify_minval_maxval. */
4044 static void
4045 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
4047 switch (arg->ts.type)
4049 case BT_INTEGER:
4050 if (mpz_cmp (arg->value.integer,
4051 extremum->value.integer) * sign > 0)
4052 mpz_set (extremum->value.integer, arg->value.integer);
4053 break;
4055 case BT_REAL:
4056 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4057 if (sign > 0)
4058 mpfr_max (extremum->value.real, extremum->value.real,
4059 arg->value.real, GFC_RND_MODE);
4060 else
4061 mpfr_min (extremum->value.real, extremum->value.real,
4062 arg->value.real, GFC_RND_MODE);
4063 break;
4065 case BT_CHARACTER:
4066 #define LENGTH(x) ((x)->value.character.length)
4067 #define STRING(x) ((x)->value.character.string)
4068 if (LENGTH(extremum) < LENGTH(arg))
4070 gfc_char_t *tmp = STRING(extremum);
4072 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
4073 memcpy (STRING(extremum), tmp,
4074 LENGTH(extremum) * sizeof (gfc_char_t));
4075 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
4076 LENGTH(arg) - LENGTH(extremum));
4077 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
4078 LENGTH(extremum) = LENGTH(arg);
4079 free (tmp);
4082 if (gfc_compare_string (arg, extremum) * sign > 0)
4084 free (STRING(extremum));
4085 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
4086 memcpy (STRING(extremum), STRING(arg),
4087 LENGTH(arg) * sizeof (gfc_char_t));
4088 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
4089 LENGTH(extremum) - LENGTH(arg));
4090 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
4092 #undef LENGTH
4093 #undef STRING
4094 break;
4096 default:
4097 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4102 /* This function is special since MAX() can take any number of
4103 arguments. The simplified expression is a rewritten version of the
4104 argument list containing at most one constant element. Other
4105 constant elements are deleted. Because the argument list has
4106 already been checked, this function always succeeds. sign is 1 for
4107 MAX(), -1 for MIN(). */
4109 static gfc_expr *
4110 simplify_min_max (gfc_expr *expr, int sign)
4112 gfc_actual_arglist *arg, *last, *extremum;
4113 gfc_intrinsic_sym * specific;
4115 last = NULL;
4116 extremum = NULL;
4117 specific = expr->value.function.isym;
4119 arg = expr->value.function.actual;
4121 for (; arg; last = arg, arg = arg->next)
4123 if (arg->expr->expr_type != EXPR_CONSTANT)
4124 continue;
4126 if (extremum == NULL)
4128 extremum = arg;
4129 continue;
4132 min_max_choose (arg->expr, extremum->expr, sign);
4134 /* Delete the extra constant argument. */
4135 if (last == NULL)
4136 expr->value.function.actual = arg->next;
4137 else
4138 last->next = arg->next;
4140 arg->next = NULL;
4141 gfc_free_actual_arglist (arg);
4142 arg = last;
4145 /* If there is one value left, replace the function call with the
4146 expression. */
4147 if (expr->value.function.actual->next != NULL)
4148 return NULL;
4150 /* Convert to the correct type and kind. */
4151 if (expr->ts.type != BT_UNKNOWN)
4152 return gfc_convert_constant (expr->value.function.actual->expr,
4153 expr->ts.type, expr->ts.kind);
4155 if (specific->ts.type != BT_UNKNOWN)
4156 return gfc_convert_constant (expr->value.function.actual->expr,
4157 specific->ts.type, specific->ts.kind);
4159 return gfc_copy_expr (expr->value.function.actual->expr);
4163 gfc_expr *
4164 gfc_simplify_min (gfc_expr *e)
4166 return simplify_min_max (e, -1);
4170 gfc_expr *
4171 gfc_simplify_max (gfc_expr *e)
4173 return simplify_min_max (e, 1);
4177 /* This is a simplified version of simplify_min_max to provide
4178 simplification of minval and maxval for a vector. */
4180 static gfc_expr *
4181 simplify_minval_maxval (gfc_expr *expr, int sign)
4183 gfc_constructor *c, *extremum;
4184 gfc_intrinsic_sym * specific;
4186 extremum = NULL;
4187 specific = expr->value.function.isym;
4189 for (c = gfc_constructor_first (expr->value.constructor);
4190 c; c = gfc_constructor_next (c))
4192 if (c->expr->expr_type != EXPR_CONSTANT)
4193 return NULL;
4195 if (extremum == NULL)
4197 extremum = c;
4198 continue;
4201 min_max_choose (c->expr, extremum->expr, sign);
4204 if (extremum == NULL)
4205 return NULL;
4207 /* Convert to the correct type and kind. */
4208 if (expr->ts.type != BT_UNKNOWN)
4209 return gfc_convert_constant (extremum->expr,
4210 expr->ts.type, expr->ts.kind);
4212 if (specific->ts.type != BT_UNKNOWN)
4213 return gfc_convert_constant (extremum->expr,
4214 specific->ts.type, specific->ts.kind);
4216 return gfc_copy_expr (extremum->expr);
4220 gfc_expr *
4221 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4223 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4224 return NULL;
4226 return simplify_minval_maxval (array, -1);
4230 gfc_expr *
4231 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4233 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4234 return NULL;
4236 return simplify_minval_maxval (array, 1);
4240 gfc_expr *
4241 gfc_simplify_maxexponent (gfc_expr *x)
4243 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4244 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4245 gfc_real_kinds[i].max_exponent);
4249 gfc_expr *
4250 gfc_simplify_minexponent (gfc_expr *x)
4252 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4253 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4254 gfc_real_kinds[i].min_exponent);
4258 gfc_expr *
4259 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
4261 gfc_expr *result;
4262 mpfr_t tmp;
4263 int kind;
4265 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4266 return NULL;
4268 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4269 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4271 switch (a->ts.type)
4273 case BT_INTEGER:
4274 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4276 /* Result is processor-dependent. */
4277 gfc_error ("Second argument MOD at %L is zero", &a->where);
4278 gfc_free_expr (result);
4279 return &gfc_bad_expr;
4281 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
4282 break;
4284 case BT_REAL:
4285 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4287 /* Result is processor-dependent. */
4288 gfc_error ("Second argument of MOD at %L is zero", &p->where);
4289 gfc_free_expr (result);
4290 return &gfc_bad_expr;
4293 gfc_set_model_kind (kind);
4294 mpfr_init (tmp);
4295 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
4296 mpfr_trunc (tmp, tmp);
4297 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
4298 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
4299 mpfr_clear (tmp);
4300 break;
4302 default:
4303 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4306 return range_check (result, "MOD");
4310 gfc_expr *
4311 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
4313 gfc_expr *result;
4314 mpfr_t tmp;
4315 int kind;
4317 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4318 return NULL;
4320 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4321 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4323 switch (a->ts.type)
4325 case BT_INTEGER:
4326 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4328 /* Result is processor-dependent. This processor just opts
4329 to not handle it at all. */
4330 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
4331 gfc_free_expr (result);
4332 return &gfc_bad_expr;
4334 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
4336 break;
4338 case BT_REAL:
4339 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4341 /* Result is processor-dependent. */
4342 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
4343 gfc_free_expr (result);
4344 return &gfc_bad_expr;
4347 gfc_set_model_kind (kind);
4348 mpfr_init (tmp);
4349 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
4350 mpfr_floor (tmp, tmp);
4351 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
4352 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
4353 mpfr_clear (tmp);
4354 break;
4356 default:
4357 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4360 return range_check (result, "MODULO");
4364 /* Exists for the sole purpose of consistency with other intrinsics. */
4365 gfc_expr *
4366 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
4367 gfc_expr *fp ATTRIBUTE_UNUSED,
4368 gfc_expr *l ATTRIBUTE_UNUSED,
4369 gfc_expr *to ATTRIBUTE_UNUSED,
4370 gfc_expr *tp ATTRIBUTE_UNUSED)
4372 return NULL;
4376 gfc_expr *
4377 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
4379 gfc_expr *result;
4380 mp_exp_t emin, emax;
4381 int kind;
4383 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
4384 return NULL;
4386 if (mpfr_sgn (s->value.real) == 0)
4388 gfc_error ("Second argument of NEAREST at %L shall not be zero",
4389 &s->where);
4390 return &gfc_bad_expr;
4393 result = gfc_copy_expr (x);
4395 /* Save current values of emin and emax. */
4396 emin = mpfr_get_emin ();
4397 emax = mpfr_get_emax ();
4399 /* Set emin and emax for the current model number. */
4400 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
4401 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
4402 mpfr_get_prec(result->value.real) + 1);
4403 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
4404 mpfr_check_range (result->value.real, 0, GMP_RNDU);
4406 if (mpfr_sgn (s->value.real) > 0)
4408 mpfr_nextabove (result->value.real);
4409 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
4411 else
4413 mpfr_nextbelow (result->value.real);
4414 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
4417 mpfr_set_emin (emin);
4418 mpfr_set_emax (emax);
4420 /* Only NaN can occur. Do not use range check as it gives an
4421 error for denormal numbers. */
4422 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
4424 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
4425 gfc_free_expr (result);
4426 return &gfc_bad_expr;
4429 return result;
4433 static gfc_expr *
4434 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
4436 gfc_expr *itrunc, *result;
4437 int kind;
4439 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4440 if (kind == -1)
4441 return &gfc_bad_expr;
4443 if (e->expr_type != EXPR_CONSTANT)
4444 return NULL;
4446 itrunc = gfc_copy_expr (e);
4447 mpfr_round (itrunc->value.real, e->value.real);
4449 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4450 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4452 gfc_free_expr (itrunc);
4454 return range_check (result, name);
4458 gfc_expr *
4459 gfc_simplify_new_line (gfc_expr *e)
4461 gfc_expr *result;
4463 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4464 result->value.character.string[0] = '\n';
4466 return result;
4470 gfc_expr *
4471 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4473 return simplify_nint ("NINT", e, k);
4477 gfc_expr *
4478 gfc_simplify_idnint (gfc_expr *e)
4480 return simplify_nint ("IDNINT", e, NULL);
4484 static gfc_expr *
4485 add_squared (gfc_expr *result, gfc_expr *e)
4487 mpfr_t tmp;
4489 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4490 gcc_assert (result->ts.type == BT_REAL
4491 && result->expr_type == EXPR_CONSTANT);
4493 gfc_set_model_kind (result->ts.kind);
4494 mpfr_init (tmp);
4495 mpfr_pow_ui (tmp, e->value.real, 2, GFC_RND_MODE);
4496 mpfr_add (result->value.real, result->value.real, tmp,
4497 GFC_RND_MODE);
4498 mpfr_clear (tmp);
4500 return result;
4504 static gfc_expr *
4505 do_sqrt (gfc_expr *result, gfc_expr *e)
4507 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4508 gcc_assert (result->ts.type == BT_REAL
4509 && result->expr_type == EXPR_CONSTANT);
4511 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
4512 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4513 return result;
4517 gfc_expr *
4518 gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
4520 gfc_expr *result;
4522 if (!is_constant_array_expr (e)
4523 || (dim != NULL && !gfc_is_constant_expr (dim)))
4524 return NULL;
4526 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
4527 init_result_expr (result, 0, NULL);
4529 if (!dim || e->rank == 1)
4531 result = simplify_transformation_to_scalar (result, e, NULL,
4532 add_squared);
4533 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4535 else
4536 result = simplify_transformation_to_array (result, e, dim, NULL,
4537 add_squared, &do_sqrt);
4539 return result;
4543 gfc_expr *
4544 gfc_simplify_not (gfc_expr *e)
4546 gfc_expr *result;
4548 if (e->expr_type != EXPR_CONSTANT)
4549 return NULL;
4551 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4552 mpz_com (result->value.integer, e->value.integer);
4554 return range_check (result, "NOT");
4558 gfc_expr *
4559 gfc_simplify_null (gfc_expr *mold)
4561 gfc_expr *result;
4563 if (mold)
4565 result = gfc_copy_expr (mold);
4566 result->expr_type = EXPR_NULL;
4568 else
4569 result = gfc_get_null_expr (NULL);
4571 return result;
4575 gfc_expr *
4576 gfc_simplify_num_images (void)
4578 gfc_expr *result;
4580 if (gfc_option.coarray == GFC_FCOARRAY_NONE)
4582 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
4583 return &gfc_bad_expr;
4586 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE)
4587 return NULL;
4589 /* FIXME: gfc_current_locus is wrong. */
4590 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4591 &gfc_current_locus);
4592 mpz_set_si (result->value.integer, 1);
4593 return result;
4597 gfc_expr *
4598 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4600 gfc_expr *result;
4601 int kind;
4603 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4604 return NULL;
4606 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4608 switch (x->ts.type)
4610 case BT_INTEGER:
4611 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4612 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4613 return range_check (result, "OR");
4615 case BT_LOGICAL:
4616 return gfc_get_logical_expr (kind, &x->where,
4617 x->value.logical || y->value.logical);
4618 default:
4619 gcc_unreachable();
4624 gfc_expr *
4625 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4627 gfc_expr *result;
4628 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4630 if (!is_constant_array_expr(array)
4631 || !is_constant_array_expr(vector)
4632 || (!gfc_is_constant_expr (mask)
4633 && !is_constant_array_expr(mask)))
4634 return NULL;
4636 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4637 if (array->ts.type == BT_DERIVED)
4638 result->ts.u.derived = array->ts.u.derived;
4640 array_ctor = gfc_constructor_first (array->value.constructor);
4641 vector_ctor = vector
4642 ? gfc_constructor_first (vector->value.constructor)
4643 : NULL;
4645 if (mask->expr_type == EXPR_CONSTANT
4646 && mask->value.logical)
4648 /* Copy all elements of ARRAY to RESULT. */
4649 while (array_ctor)
4651 gfc_constructor_append_expr (&result->value.constructor,
4652 gfc_copy_expr (array_ctor->expr),
4653 NULL);
4655 array_ctor = gfc_constructor_next (array_ctor);
4656 vector_ctor = gfc_constructor_next (vector_ctor);
4659 else if (mask->expr_type == EXPR_ARRAY)
4661 /* Copy only those elements of ARRAY to RESULT whose
4662 MASK equals .TRUE.. */
4663 mask_ctor = gfc_constructor_first (mask->value.constructor);
4664 while (mask_ctor)
4666 if (mask_ctor->expr->value.logical)
4668 gfc_constructor_append_expr (&result->value.constructor,
4669 gfc_copy_expr (array_ctor->expr),
4670 NULL);
4671 vector_ctor = gfc_constructor_next (vector_ctor);
4674 array_ctor = gfc_constructor_next (array_ctor);
4675 mask_ctor = gfc_constructor_next (mask_ctor);
4679 /* Append any left-over elements from VECTOR to RESULT. */
4680 while (vector_ctor)
4682 gfc_constructor_append_expr (&result->value.constructor,
4683 gfc_copy_expr (vector_ctor->expr),
4684 NULL);
4685 vector_ctor = gfc_constructor_next (vector_ctor);
4688 result->shape = gfc_get_shape (1);
4689 gfc_array_size (result, &result->shape[0]);
4691 if (array->ts.type == BT_CHARACTER)
4692 result->ts.u.cl = array->ts.u.cl;
4694 return result;
4698 static gfc_expr *
4699 do_xor (gfc_expr *result, gfc_expr *e)
4701 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
4702 gcc_assert (result->ts.type == BT_LOGICAL
4703 && result->expr_type == EXPR_CONSTANT);
4705 result->value.logical = result->value.logical != e->value.logical;
4706 return result;
4711 gfc_expr *
4712 gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
4714 return simplify_transformation (e, dim, NULL, 0, do_xor);
4718 gfc_expr *
4719 gfc_simplify_popcnt (gfc_expr *e)
4721 int res, k;
4722 mpz_t x;
4724 if (e->expr_type != EXPR_CONSTANT)
4725 return NULL;
4727 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4729 /* Convert argument to unsigned, then count the '1' bits. */
4730 mpz_init_set (x, e->value.integer);
4731 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
4732 res = mpz_popcount (x);
4733 mpz_clear (x);
4735 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res);
4739 gfc_expr *
4740 gfc_simplify_poppar (gfc_expr *e)
4742 gfc_expr *popcnt;
4743 const char *s;
4744 int i;
4746 if (e->expr_type != EXPR_CONSTANT)
4747 return NULL;
4749 popcnt = gfc_simplify_popcnt (e);
4750 gcc_assert (popcnt);
4752 s = gfc_extract_int (popcnt, &i);
4753 gcc_assert (!s);
4755 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2);
4759 gfc_expr *
4760 gfc_simplify_precision (gfc_expr *e)
4762 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4763 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
4764 gfc_real_kinds[i].precision);
4768 gfc_expr *
4769 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
4771 return simplify_transformation (array, dim, mask, 1, gfc_multiply);
4775 gfc_expr *
4776 gfc_simplify_radix (gfc_expr *e)
4778 int i;
4779 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4781 switch (e->ts.type)
4783 case BT_INTEGER:
4784 i = gfc_integer_kinds[i].radix;
4785 break;
4787 case BT_REAL:
4788 i = gfc_real_kinds[i].radix;
4789 break;
4791 default:
4792 gcc_unreachable ();
4795 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4799 gfc_expr *
4800 gfc_simplify_range (gfc_expr *e)
4802 int i;
4803 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4805 switch (e->ts.type)
4807 case BT_INTEGER:
4808 i = gfc_integer_kinds[i].range;
4809 break;
4811 case BT_REAL:
4812 case BT_COMPLEX:
4813 i = gfc_real_kinds[i].range;
4814 break;
4816 default:
4817 gcc_unreachable ();
4820 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4824 gfc_expr *
4825 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
4827 gfc_expr *result = NULL;
4828 int kind;
4830 if (e->ts.type == BT_COMPLEX)
4831 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
4832 else
4833 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
4835 if (kind == -1)
4836 return &gfc_bad_expr;
4838 if (e->expr_type != EXPR_CONSTANT)
4839 return NULL;
4841 if (convert_boz (e, kind) == &gfc_bad_expr)
4842 return &gfc_bad_expr;
4844 result = gfc_convert_constant (e, BT_REAL, kind);
4845 if (result == &gfc_bad_expr)
4846 return &gfc_bad_expr;
4848 return range_check (result, "REAL");
4852 gfc_expr *
4853 gfc_simplify_realpart (gfc_expr *e)
4855 gfc_expr *result;
4857 if (e->expr_type != EXPR_CONSTANT)
4858 return NULL;
4860 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
4861 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
4863 return range_check (result, "REALPART");
4866 gfc_expr *
4867 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
4869 gfc_expr *result;
4870 int i, j, len, ncop, nlen;
4871 mpz_t ncopies;
4872 bool have_length = false;
4874 /* If NCOPIES isn't a constant, there's nothing we can do. */
4875 if (n->expr_type != EXPR_CONSTANT)
4876 return NULL;
4878 /* If NCOPIES is negative, it's an error. */
4879 if (mpz_sgn (n->value.integer) < 0)
4881 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4882 &n->where);
4883 return &gfc_bad_expr;
4886 /* If we don't know the character length, we can do no more. */
4887 if (e->ts.u.cl && e->ts.u.cl->length
4888 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
4890 len = mpz_get_si (e->ts.u.cl->length->value.integer);
4891 have_length = true;
4893 else if (e->expr_type == EXPR_CONSTANT
4894 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
4896 len = e->value.character.length;
4898 else
4899 return NULL;
4901 /* If the source length is 0, any value of NCOPIES is valid
4902 and everything behaves as if NCOPIES == 0. */
4903 mpz_init (ncopies);
4904 if (len == 0)
4905 mpz_set_ui (ncopies, 0);
4906 else
4907 mpz_set (ncopies, n->value.integer);
4909 /* Check that NCOPIES isn't too large. */
4910 if (len)
4912 mpz_t max, mlen;
4913 int i;
4915 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4916 mpz_init (max);
4917 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4919 if (have_length)
4921 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
4922 e->ts.u.cl->length->value.integer);
4924 else
4926 mpz_init_set_si (mlen, len);
4927 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
4928 mpz_clear (mlen);
4931 /* The check itself. */
4932 if (mpz_cmp (ncopies, max) > 0)
4934 mpz_clear (max);
4935 mpz_clear (ncopies);
4936 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4937 &n->where);
4938 return &gfc_bad_expr;
4941 mpz_clear (max);
4943 mpz_clear (ncopies);
4945 /* For further simplification, we need the character string to be
4946 constant. */
4947 if (e->expr_type != EXPR_CONSTANT)
4948 return NULL;
4950 if (len ||
4951 (e->ts.u.cl->length &&
4952 mpz_sgn (e->ts.u.cl->length->value.integer)) != 0)
4954 const char *res = gfc_extract_int (n, &ncop);
4955 gcc_assert (res == NULL);
4957 else
4958 ncop = 0;
4960 len = e->value.character.length;
4961 nlen = ncop * len;
4963 result = gfc_get_constant_expr (BT_CHARACTER, e->ts.kind, &e->where);
4965 if (ncop == 0)
4966 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
4968 len = e->value.character.length;
4969 nlen = ncop * len;
4971 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
4972 for (i = 0; i < ncop; i++)
4973 for (j = 0; j < len; j++)
4974 result->value.character.string[j+i*len]= e->value.character.string[j];
4976 result->value.character.string[nlen] = '\0'; /* For debugger */
4977 return result;
4981 /* This one is a bear, but mainly has to do with shuffling elements. */
4983 gfc_expr *
4984 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
4985 gfc_expr *pad, gfc_expr *order_exp)
4987 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
4988 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
4989 mpz_t index, size;
4990 unsigned long j;
4991 size_t nsource;
4992 gfc_expr *e, *result;
4994 /* Check that argument expression types are OK. */
4995 if (!is_constant_array_expr (source)
4996 || !is_constant_array_expr (shape_exp)
4997 || !is_constant_array_expr (pad)
4998 || !is_constant_array_expr (order_exp))
4999 return NULL;
5001 /* Proceed with simplification, unpacking the array. */
5003 mpz_init (index);
5004 rank = 0;
5006 for (;;)
5008 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
5009 if (e == NULL)
5010 break;
5012 gfc_extract_int (e, &shape[rank]);
5014 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
5015 gcc_assert (shape[rank] >= 0);
5017 rank++;
5020 gcc_assert (rank > 0);
5022 /* Now unpack the order array if present. */
5023 if (order_exp == NULL)
5025 for (i = 0; i < rank; i++)
5026 order[i] = i;
5028 else
5030 for (i = 0; i < rank; i++)
5031 x[i] = 0;
5033 for (i = 0; i < rank; i++)
5035 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
5036 gcc_assert (e);
5038 gfc_extract_int (e, &order[i]);
5040 gcc_assert (order[i] >= 1 && order[i] <= rank);
5041 order[i]--;
5042 gcc_assert (x[order[i]] == 0);
5043 x[order[i]] = 1;
5047 /* Count the elements in the source and padding arrays. */
5049 npad = 0;
5050 if (pad != NULL)
5052 gfc_array_size (pad, &size);
5053 npad = mpz_get_ui (size);
5054 mpz_clear (size);
5057 gfc_array_size (source, &size);
5058 nsource = mpz_get_ui (size);
5059 mpz_clear (size);
5061 /* If it weren't for that pesky permutation we could just loop
5062 through the source and round out any shortage with pad elements.
5063 But no, someone just had to have the compiler do something the
5064 user should be doing. */
5066 for (i = 0; i < rank; i++)
5067 x[i] = 0;
5069 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5070 &source->where);
5071 if (source->ts.type == BT_DERIVED)
5072 result->ts.u.derived = source->ts.u.derived;
5073 result->rank = rank;
5074 result->shape = gfc_get_shape (rank);
5075 for (i = 0; i < rank; i++)
5076 mpz_init_set_ui (result->shape[i], shape[i]);
5078 while (nsource > 0 || npad > 0)
5080 /* Figure out which element to extract. */
5081 mpz_set_ui (index, 0);
5083 for (i = rank - 1; i >= 0; i--)
5085 mpz_add_ui (index, index, x[order[i]]);
5086 if (i != 0)
5087 mpz_mul_ui (index, index, shape[order[i - 1]]);
5090 if (mpz_cmp_ui (index, INT_MAX) > 0)
5091 gfc_internal_error ("Reshaped array too large at %C");
5093 j = mpz_get_ui (index);
5095 if (j < nsource)
5096 e = gfc_constructor_lookup_expr (source->value.constructor, j);
5097 else
5099 gcc_assert (npad > 0);
5101 j = j - nsource;
5102 j = j % npad;
5103 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
5105 gcc_assert (e);
5107 gfc_constructor_append_expr (&result->value.constructor,
5108 gfc_copy_expr (e), &e->where);
5110 /* Calculate the next element. */
5111 i = 0;
5113 inc:
5114 if (++x[i] < shape[i])
5115 continue;
5116 x[i++] = 0;
5117 if (i < rank)
5118 goto inc;
5120 break;
5123 mpz_clear (index);
5125 return result;
5129 gfc_expr *
5130 gfc_simplify_rrspacing (gfc_expr *x)
5132 gfc_expr *result;
5133 int i;
5134 long int e, p;
5136 if (x->expr_type != EXPR_CONSTANT)
5137 return NULL;
5139 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5141 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5142 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5144 /* Special case x = -0 and 0. */
5145 if (mpfr_sgn (result->value.real) == 0)
5147 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5148 return result;
5151 /* | x * 2**(-e) | * 2**p. */
5152 e = - (long int) mpfr_get_exp (x->value.real);
5153 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
5155 p = (long int) gfc_real_kinds[i].digits;
5156 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
5158 return range_check (result, "RRSPACING");
5162 gfc_expr *
5163 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
5165 int k, neg_flag, power, exp_range;
5166 mpfr_t scale, radix;
5167 gfc_expr *result;
5169 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5170 return NULL;
5172 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5174 if (mpfr_sgn (x->value.real) == 0)
5176 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5177 return result;
5180 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
5182 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
5184 /* This check filters out values of i that would overflow an int. */
5185 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
5186 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
5188 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
5189 gfc_free_expr (result);
5190 return &gfc_bad_expr;
5193 /* Compute scale = radix ** power. */
5194 power = mpz_get_si (i->value.integer);
5196 if (power >= 0)
5197 neg_flag = 0;
5198 else
5200 neg_flag = 1;
5201 power = -power;
5204 gfc_set_model_kind (x->ts.kind);
5205 mpfr_init (scale);
5206 mpfr_init (radix);
5207 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
5208 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
5210 if (neg_flag)
5211 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
5212 else
5213 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
5215 mpfr_clears (scale, radix, NULL);
5217 return range_check (result, "SCALE");
5221 /* Variants of strspn and strcspn that operate on wide characters. */
5223 static size_t
5224 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
5226 size_t i = 0;
5227 const gfc_char_t *c;
5229 while (s1[i])
5231 for (c = s2; *c; c++)
5233 if (s1[i] == *c)
5234 break;
5236 if (*c == '\0')
5237 break;
5238 i++;
5241 return i;
5244 static size_t
5245 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
5247 size_t i = 0;
5248 const gfc_char_t *c;
5250 while (s1[i])
5252 for (c = s2; *c; c++)
5254 if (s1[i] == *c)
5255 break;
5257 if (*c)
5258 break;
5259 i++;
5262 return i;
5266 gfc_expr *
5267 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
5269 gfc_expr *result;
5270 int back;
5271 size_t i;
5272 size_t indx, len, lenc;
5273 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
5275 if (k == -1)
5276 return &gfc_bad_expr;
5278 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
5279 return NULL;
5281 if (b != NULL && b->value.logical != 0)
5282 back = 1;
5283 else
5284 back = 0;
5286 len = e->value.character.length;
5287 lenc = c->value.character.length;
5289 if (len == 0 || lenc == 0)
5291 indx = 0;
5293 else
5295 if (back == 0)
5297 indx = wide_strcspn (e->value.character.string,
5298 c->value.character.string) + 1;
5299 if (indx > len)
5300 indx = 0;
5302 else
5304 i = 0;
5305 for (indx = len; indx > 0; indx--)
5307 for (i = 0; i < lenc; i++)
5309 if (c->value.character.string[i]
5310 == e->value.character.string[indx - 1])
5311 break;
5313 if (i < lenc)
5314 break;
5319 result = gfc_get_int_expr (k, &e->where, indx);
5320 return range_check (result, "SCAN");
5324 gfc_expr *
5325 gfc_simplify_selected_char_kind (gfc_expr *e)
5327 int kind;
5329 if (e->expr_type != EXPR_CONSTANT)
5330 return NULL;
5332 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
5333 || gfc_compare_with_Cstring (e, "default", false) == 0)
5334 kind = 1;
5335 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
5336 kind = 4;
5337 else
5338 kind = -1;
5340 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5344 gfc_expr *
5345 gfc_simplify_selected_int_kind (gfc_expr *e)
5347 int i, kind, range;
5349 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
5350 return NULL;
5352 kind = INT_MAX;
5354 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
5355 if (gfc_integer_kinds[i].range >= range
5356 && gfc_integer_kinds[i].kind < kind)
5357 kind = gfc_integer_kinds[i].kind;
5359 if (kind == INT_MAX)
5360 kind = -1;
5362 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5366 gfc_expr *
5367 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
5369 int range, precision, radix, i, kind, found_precision, found_range,
5370 found_radix;
5371 locus *loc = &gfc_current_locus;
5373 if (p == NULL)
5374 precision = 0;
5375 else
5377 if (p->expr_type != EXPR_CONSTANT
5378 || gfc_extract_int (p, &precision) != NULL)
5379 return NULL;
5380 loc = &p->where;
5383 if (q == NULL)
5384 range = 0;
5385 else
5387 if (q->expr_type != EXPR_CONSTANT
5388 || gfc_extract_int (q, &range) != NULL)
5389 return NULL;
5391 if (!loc)
5392 loc = &q->where;
5395 if (rdx == NULL)
5396 radix = 0;
5397 else
5399 if (rdx->expr_type != EXPR_CONSTANT
5400 || gfc_extract_int (rdx, &radix) != NULL)
5401 return NULL;
5403 if (!loc)
5404 loc = &rdx->where;
5407 kind = INT_MAX;
5408 found_precision = 0;
5409 found_range = 0;
5410 found_radix = 0;
5412 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
5414 if (gfc_real_kinds[i].precision >= precision)
5415 found_precision = 1;
5417 if (gfc_real_kinds[i].range >= range)
5418 found_range = 1;
5420 if (gfc_real_kinds[i].radix >= radix)
5421 found_radix = 1;
5423 if (gfc_real_kinds[i].precision >= precision
5424 && gfc_real_kinds[i].range >= range
5425 && gfc_real_kinds[i].radix >= radix && gfc_real_kinds[i].kind < kind)
5426 kind = gfc_real_kinds[i].kind;
5429 if (kind == INT_MAX)
5431 if (found_radix && found_range && !found_precision)
5432 kind = -1;
5433 else if (found_radix && found_precision && !found_range)
5434 kind = -2;
5435 else if (found_radix && !found_precision && !found_range)
5436 kind = -3;
5437 else if (found_radix)
5438 kind = -4;
5439 else
5440 kind = -5;
5443 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
5447 gfc_expr *
5448 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
5450 gfc_expr *result;
5451 mpfr_t exp, absv, log2, pow2, frac;
5452 unsigned long exp2;
5454 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5455 return NULL;
5457 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5459 if (mpfr_sgn (x->value.real) == 0)
5461 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5462 return result;
5465 gfc_set_model_kind (x->ts.kind);
5466 mpfr_init (absv);
5467 mpfr_init (log2);
5468 mpfr_init (exp);
5469 mpfr_init (pow2);
5470 mpfr_init (frac);
5472 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
5473 mpfr_log2 (log2, absv, GFC_RND_MODE);
5475 mpfr_trunc (log2, log2);
5476 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
5478 /* Old exponent value, and fraction. */
5479 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
5481 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
5483 /* New exponent. */
5484 exp2 = (unsigned long) mpz_get_d (i->value.integer);
5485 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
5487 mpfr_clears (absv, log2, pow2, frac, NULL);
5489 return range_check (result, "SET_EXPONENT");
5493 gfc_expr *
5494 gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
5496 mpz_t shape[GFC_MAX_DIMENSIONS];
5497 gfc_expr *result, *e, *f;
5498 gfc_array_ref *ar;
5499 int n;
5500 gfc_try t;
5501 int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind);
5503 result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
5505 if (source->rank == 0)
5506 return result;
5508 if (source->expr_type == EXPR_VARIABLE)
5510 ar = gfc_find_array_ref (source);
5511 t = gfc_array_ref_shape (ar, shape);
5513 else if (source->shape)
5515 t = SUCCESS;
5516 for (n = 0; n < source->rank; n++)
5518 mpz_init (shape[n]);
5519 mpz_set (shape[n], source->shape[n]);
5522 else
5523 t = FAILURE;
5525 for (n = 0; n < source->rank; n++)
5527 e = gfc_get_constant_expr (BT_INTEGER, k, &source->where);
5529 if (t == SUCCESS)
5531 mpz_set (e->value.integer, shape[n]);
5532 mpz_clear (shape[n]);
5534 else
5536 mpz_set_ui (e->value.integer, n + 1);
5538 f = gfc_simplify_size (source, e, NULL);
5539 gfc_free_expr (e);
5540 if (f == NULL)
5542 gfc_free_expr (result);
5543 return NULL;
5545 else
5546 e = f;
5549 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5552 return result;
5556 gfc_expr *
5557 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5559 mpz_t size;
5560 gfc_expr *return_value;
5561 int d;
5562 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
5564 if (k == -1)
5565 return &gfc_bad_expr;
5567 /* For unary operations, the size of the result is given by the size
5568 of the operand. For binary ones, it's the size of the first operand
5569 unless it is scalar, then it is the size of the second. */
5570 if (array->expr_type == EXPR_OP && !array->value.op.uop)
5572 gfc_expr* replacement;
5573 gfc_expr* simplified;
5575 switch (array->value.op.op)
5577 /* Unary operations. */
5578 case INTRINSIC_NOT:
5579 case INTRINSIC_UPLUS:
5580 case INTRINSIC_UMINUS:
5581 replacement = array->value.op.op1;
5582 break;
5584 /* Binary operations. If any one of the operands is scalar, take
5585 the other one's size. If both of them are arrays, it does not
5586 matter -- try to find one with known shape, if possible. */
5587 default:
5588 if (array->value.op.op1->rank == 0)
5589 replacement = array->value.op.op2;
5590 else if (array->value.op.op2->rank == 0)
5591 replacement = array->value.op.op1;
5592 else
5594 simplified = gfc_simplify_size (array->value.op.op1, dim, kind);
5595 if (simplified)
5596 return simplified;
5598 replacement = array->value.op.op2;
5600 break;
5603 /* Try to reduce it directly if possible. */
5604 simplified = gfc_simplify_size (replacement, dim, kind);
5606 /* Otherwise, we build a new SIZE call. This is hopefully at least
5607 simpler than the original one. */
5608 if (!simplified)
5609 simplified = gfc_build_intrinsic_call ("size", array->where, 3,
5610 gfc_copy_expr (replacement),
5611 gfc_copy_expr (dim),
5612 gfc_copy_expr (kind));
5614 return simplified;
5617 if (dim == NULL)
5619 if (gfc_array_size (array, &size) == FAILURE)
5620 return NULL;
5622 else
5624 if (dim->expr_type != EXPR_CONSTANT)
5625 return NULL;
5627 d = mpz_get_ui (dim->value.integer) - 1;
5628 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
5629 return NULL;
5632 return_value = gfc_get_int_expr (k, &array->where, mpz_get_si (size));
5633 mpz_clear (size);
5634 return return_value;
5638 gfc_expr *
5639 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
5641 gfc_expr *result;
5643 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
5644 return NULL;
5646 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5648 switch (x->ts.type)
5650 case BT_INTEGER:
5651 mpz_abs (result->value.integer, x->value.integer);
5652 if (mpz_sgn (y->value.integer) < 0)
5653 mpz_neg (result->value.integer, result->value.integer);
5654 break;
5656 case BT_REAL:
5657 if (gfc_option.flag_sign_zero)
5658 mpfr_copysign (result->value.real, x->value.real, y->value.real,
5659 GFC_RND_MODE);
5660 else
5661 mpfr_setsign (result->value.real, x->value.real,
5662 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
5663 break;
5665 default:
5666 gfc_internal_error ("Bad type in gfc_simplify_sign");
5669 return result;
5673 gfc_expr *
5674 gfc_simplify_sin (gfc_expr *x)
5676 gfc_expr *result;
5678 if (x->expr_type != EXPR_CONSTANT)
5679 return NULL;
5681 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5683 switch (x->ts.type)
5685 case BT_REAL:
5686 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
5687 break;
5689 case BT_COMPLEX:
5690 gfc_set_model (x->value.real);
5691 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5692 break;
5694 default:
5695 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
5698 return range_check (result, "SIN");
5702 gfc_expr *
5703 gfc_simplify_sinh (gfc_expr *x)
5705 gfc_expr *result;
5707 if (x->expr_type != EXPR_CONSTANT)
5708 return NULL;
5710 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5712 switch (x->ts.type)
5714 case BT_REAL:
5715 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
5716 break;
5718 case BT_COMPLEX:
5719 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5720 break;
5722 default:
5723 gcc_unreachable ();
5726 return range_check (result, "SINH");
5730 /* The argument is always a double precision real that is converted to
5731 single precision. TODO: Rounding! */
5733 gfc_expr *
5734 gfc_simplify_sngl (gfc_expr *a)
5736 gfc_expr *result;
5738 if (a->expr_type != EXPR_CONSTANT)
5739 return NULL;
5741 result = gfc_real2real (a, gfc_default_real_kind);
5742 return range_check (result, "SNGL");
5746 gfc_expr *
5747 gfc_simplify_spacing (gfc_expr *x)
5749 gfc_expr *result;
5750 int i;
5751 long int en, ep;
5753 if (x->expr_type != EXPR_CONSTANT)
5754 return NULL;
5756 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5758 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5760 /* Special case x = 0 and -0. */
5761 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5762 if (mpfr_sgn (result->value.real) == 0)
5764 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5765 return result;
5768 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5769 are the radix, exponent of x, and precision. This excludes the
5770 possibility of subnormal numbers. Fortran 2003 states the result is
5771 b**max(e - p, emin - 1). */
5773 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
5774 en = (long int) gfc_real_kinds[i].min_exponent - 1;
5775 en = en > ep ? en : ep;
5777 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
5778 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
5780 return range_check (result, "SPACING");
5784 gfc_expr *
5785 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
5787 gfc_expr *result = 0L;
5788 int i, j, dim, ncopies;
5789 mpz_t size;
5791 if ((!gfc_is_constant_expr (source)
5792 && !is_constant_array_expr (source))
5793 || !gfc_is_constant_expr (dim_expr)
5794 || !gfc_is_constant_expr (ncopies_expr))
5795 return NULL;
5797 gcc_assert (dim_expr->ts.type == BT_INTEGER);
5798 gfc_extract_int (dim_expr, &dim);
5799 dim -= 1; /* zero-base DIM */
5801 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
5802 gfc_extract_int (ncopies_expr, &ncopies);
5803 ncopies = MAX (ncopies, 0);
5805 /* Do not allow the array size to exceed the limit for an array
5806 constructor. */
5807 if (source->expr_type == EXPR_ARRAY)
5809 if (gfc_array_size (source, &size) == FAILURE)
5810 gfc_internal_error ("Failure getting length of a constant array.");
5812 else
5813 mpz_init_set_ui (size, 1);
5815 if (mpz_get_si (size)*ncopies > gfc_option.flag_max_array_constructor)
5816 return NULL;
5818 if (source->expr_type == EXPR_CONSTANT)
5820 gcc_assert (dim == 0);
5822 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5823 &source->where);
5824 if (source->ts.type == BT_DERIVED)
5825 result->ts.u.derived = source->ts.u.derived;
5826 result->rank = 1;
5827 result->shape = gfc_get_shape (result->rank);
5828 mpz_init_set_si (result->shape[0], ncopies);
5830 for (i = 0; i < ncopies; ++i)
5831 gfc_constructor_append_expr (&result->value.constructor,
5832 gfc_copy_expr (source), NULL);
5834 else if (source->expr_type == EXPR_ARRAY)
5836 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
5837 gfc_constructor *source_ctor;
5839 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
5840 gcc_assert (dim >= 0 && dim <= source->rank);
5842 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5843 &source->where);
5844 if (source->ts.type == BT_DERIVED)
5845 result->ts.u.derived = source->ts.u.derived;
5846 result->rank = source->rank + 1;
5847 result->shape = gfc_get_shape (result->rank);
5849 for (i = 0, j = 0; i < result->rank; ++i)
5851 if (i != dim)
5852 mpz_init_set (result->shape[i], source->shape[j++]);
5853 else
5854 mpz_init_set_si (result->shape[i], ncopies);
5856 extent[i] = mpz_get_si (result->shape[i]);
5857 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
5860 offset = 0;
5861 for (source_ctor = gfc_constructor_first (source->value.constructor);
5862 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
5864 for (i = 0; i < ncopies; ++i)
5865 gfc_constructor_insert_expr (&result->value.constructor,
5866 gfc_copy_expr (source_ctor->expr),
5867 NULL, offset + i * rstride[dim]);
5869 offset += (dim == 0 ? ncopies : 1);
5872 else
5873 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
5874 Replace NULL with gcc_unreachable() after implementing
5875 gfc_simplify_cshift(). */
5876 return NULL;
5878 if (source->ts.type == BT_CHARACTER)
5879 result->ts.u.cl = source->ts.u.cl;
5881 return result;
5885 gfc_expr *
5886 gfc_simplify_sqrt (gfc_expr *e)
5888 gfc_expr *result = NULL;
5890 if (e->expr_type != EXPR_CONSTANT)
5891 return NULL;
5893 switch (e->ts.type)
5895 case BT_REAL:
5896 if (mpfr_cmp_si (e->value.real, 0) < 0)
5898 gfc_error ("Argument of SQRT at %L has a negative value",
5899 &e->where);
5900 return &gfc_bad_expr;
5902 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5903 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
5904 break;
5906 case BT_COMPLEX:
5907 gfc_set_model (e->value.real);
5909 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5910 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
5911 break;
5913 default:
5914 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
5917 return range_check (result, "SQRT");
5921 gfc_expr *
5922 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5924 return simplify_transformation (array, dim, mask, 0, gfc_add);
5928 gfc_expr *
5929 gfc_simplify_tan (gfc_expr *x)
5931 gfc_expr *result;
5933 if (x->expr_type != EXPR_CONSTANT)
5934 return NULL;
5936 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5938 switch (x->ts.type)
5940 case BT_REAL:
5941 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
5942 break;
5944 case BT_COMPLEX:
5945 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5946 break;
5948 default:
5949 gcc_unreachable ();
5952 return range_check (result, "TAN");
5956 gfc_expr *
5957 gfc_simplify_tanh (gfc_expr *x)
5959 gfc_expr *result;
5961 if (x->expr_type != EXPR_CONSTANT)
5962 return NULL;
5964 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5966 switch (x->ts.type)
5968 case BT_REAL:
5969 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
5970 break;
5972 case BT_COMPLEX:
5973 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5974 break;
5976 default:
5977 gcc_unreachable ();
5980 return range_check (result, "TANH");
5984 gfc_expr *
5985 gfc_simplify_tiny (gfc_expr *e)
5987 gfc_expr *result;
5988 int i;
5990 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
5992 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
5993 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5995 return result;
5999 gfc_expr *
6000 gfc_simplify_trailz (gfc_expr *e)
6002 unsigned long tz, bs;
6003 int i;
6005 if (e->expr_type != EXPR_CONSTANT)
6006 return NULL;
6008 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
6009 bs = gfc_integer_kinds[i].bit_size;
6010 tz = mpz_scan1 (e->value.integer, 0);
6012 return gfc_get_int_expr (gfc_default_integer_kind,
6013 &e->where, MIN (tz, bs));
6017 gfc_expr *
6018 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
6020 gfc_expr *result;
6021 gfc_expr *mold_element;
6022 size_t source_size;
6023 size_t result_size;
6024 size_t result_elt_size;
6025 size_t buffer_size;
6026 mpz_t tmp;
6027 unsigned char *buffer;
6029 if (!gfc_is_constant_expr (source)
6030 || (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
6031 || !gfc_is_constant_expr (size))
6032 return NULL;
6034 if (source->expr_type == EXPR_FUNCTION)
6035 return NULL;
6037 /* Calculate the size of the source. */
6038 if (source->expr_type == EXPR_ARRAY
6039 && gfc_array_size (source, &tmp) == FAILURE)
6040 gfc_internal_error ("Failure getting length of a constant array.");
6042 source_size = gfc_target_expr_size (source);
6044 /* Create an empty new expression with the appropriate characteristics. */
6045 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
6046 &source->where);
6047 result->ts = mold->ts;
6049 mold_element = mold->expr_type == EXPR_ARRAY
6050 ? gfc_constructor_first (mold->value.constructor)->expr
6051 : mold;
6053 /* Set result character length, if needed. Note that this needs to be
6054 set even for array expressions, in order to pass this information into
6055 gfc_target_interpret_expr. */
6056 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
6057 result->value.character.length = mold_element->value.character.length;
6059 /* Set the number of elements in the result, and determine its size. */
6060 result_elt_size = gfc_target_expr_size (mold_element);
6061 if (result_elt_size == 0)
6063 gfc_free_expr (result);
6064 return NULL;
6067 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
6069 int result_length;
6071 result->expr_type = EXPR_ARRAY;
6072 result->rank = 1;
6074 if (size)
6075 result_length = (size_t)mpz_get_ui (size->value.integer);
6076 else
6078 result_length = source_size / result_elt_size;
6079 if (result_length * result_elt_size < source_size)
6080 result_length += 1;
6083 result->shape = gfc_get_shape (1);
6084 mpz_init_set_ui (result->shape[0], result_length);
6086 result_size = result_length * result_elt_size;
6088 else
6090 result->rank = 0;
6091 result_size = result_elt_size;
6094 if (gfc_option.warn_surprising && source_size < result_size)
6095 gfc_warning("Intrinsic TRANSFER at %L has partly undefined result: "
6096 "source size %ld < result size %ld", &source->where,
6097 (long) source_size, (long) result_size);
6099 /* Allocate the buffer to store the binary version of the source. */
6100 buffer_size = MAX (source_size, result_size);
6101 buffer = (unsigned char*)alloca (buffer_size);
6102 memset (buffer, 0, buffer_size);
6104 /* Now write source to the buffer. */
6105 gfc_target_encode_expr (source, buffer, buffer_size);
6107 /* And read the buffer back into the new expression. */
6108 gfc_target_interpret_expr (buffer, buffer_size, result);
6110 return result;
6114 gfc_expr *
6115 gfc_simplify_transpose (gfc_expr *matrix)
6117 int row, matrix_rows, col, matrix_cols;
6118 gfc_expr *result;
6120 if (!is_constant_array_expr (matrix))
6121 return NULL;
6123 gcc_assert (matrix->rank == 2);
6125 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
6126 &matrix->where);
6127 result->rank = 2;
6128 result->shape = gfc_get_shape (result->rank);
6129 mpz_set (result->shape[0], matrix->shape[1]);
6130 mpz_set (result->shape[1], matrix->shape[0]);
6132 if (matrix->ts.type == BT_CHARACTER)
6133 result->ts.u.cl = matrix->ts.u.cl;
6134 else if (matrix->ts.type == BT_DERIVED)
6135 result->ts.u.derived = matrix->ts.u.derived;
6137 matrix_rows = mpz_get_si (matrix->shape[0]);
6138 matrix_cols = mpz_get_si (matrix->shape[1]);
6139 for (row = 0; row < matrix_rows; ++row)
6140 for (col = 0; col < matrix_cols; ++col)
6142 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
6143 col * matrix_rows + row);
6144 gfc_constructor_insert_expr (&result->value.constructor,
6145 gfc_copy_expr (e), &matrix->where,
6146 row * matrix_cols + col);
6149 return result;
6153 gfc_expr *
6154 gfc_simplify_trim (gfc_expr *e)
6156 gfc_expr *result;
6157 int count, i, len, lentrim;
6159 if (e->expr_type != EXPR_CONSTANT)
6160 return NULL;
6162 len = e->value.character.length;
6163 for (count = 0, i = 1; i <= len; ++i)
6165 if (e->value.character.string[len - i] == ' ')
6166 count++;
6167 else
6168 break;
6171 lentrim = len - count;
6173 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
6174 for (i = 0; i < lentrim; i++)
6175 result->value.character.string[i] = e->value.character.string[i];
6177 return result;
6181 gfc_expr *
6182 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
6184 gfc_expr *result;
6185 gfc_ref *ref;
6186 gfc_array_spec *as;
6187 gfc_constructor *sub_cons;
6188 bool first_image;
6189 int d;
6191 if (!is_constant_array_expr (sub))
6192 return NULL;
6194 /* Follow any component references. */
6195 as = coarray->symtree->n.sym->as;
6196 for (ref = coarray->ref; ref; ref = ref->next)
6197 if (ref->type == REF_COMPONENT)
6198 as = ref->u.ar.as;
6200 if (as->type == AS_DEFERRED)
6201 return NULL;
6203 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6204 the cosubscript addresses the first image. */
6206 sub_cons = gfc_constructor_first (sub->value.constructor);
6207 first_image = true;
6209 for (d = 1; d <= as->corank; d++)
6211 gfc_expr *ca_bound;
6212 int cmp;
6214 gcc_assert (sub_cons != NULL);
6216 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
6217 NULL, true);
6218 if (ca_bound == NULL)
6219 return NULL;
6221 if (ca_bound == &gfc_bad_expr)
6222 return ca_bound;
6224 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
6226 if (cmp == 0)
6228 gfc_free_expr (ca_bound);
6229 sub_cons = gfc_constructor_next (sub_cons);
6230 continue;
6233 first_image = false;
6235 if (cmp > 0)
6237 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6238 "SUB has %ld and COARRAY lower bound is %ld)",
6239 &coarray->where, d,
6240 mpz_get_si (sub_cons->expr->value.integer),
6241 mpz_get_si (ca_bound->value.integer));
6242 gfc_free_expr (ca_bound);
6243 return &gfc_bad_expr;
6246 gfc_free_expr (ca_bound);
6248 /* Check whether upperbound is valid for the multi-images case. */
6249 if (d < as->corank)
6251 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
6252 NULL, true);
6253 if (ca_bound == &gfc_bad_expr)
6254 return ca_bound;
6256 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
6257 && mpz_cmp (ca_bound->value.integer,
6258 sub_cons->expr->value.integer) < 0)
6260 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6261 "SUB has %ld and COARRAY upper bound is %ld)",
6262 &coarray->where, d,
6263 mpz_get_si (sub_cons->expr->value.integer),
6264 mpz_get_si (ca_bound->value.integer));
6265 gfc_free_expr (ca_bound);
6266 return &gfc_bad_expr;
6269 if (ca_bound)
6270 gfc_free_expr (ca_bound);
6273 sub_cons = gfc_constructor_next (sub_cons);
6276 gcc_assert (sub_cons == NULL);
6278 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE && !first_image)
6279 return NULL;
6281 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6282 &gfc_current_locus);
6283 if (first_image)
6284 mpz_set_si (result->value.integer, 1);
6285 else
6286 mpz_set_si (result->value.integer, 0);
6288 return result;
6292 gfc_expr *
6293 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim)
6295 gfc_ref *ref;
6296 gfc_array_spec *as;
6297 int d;
6299 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE)
6300 return NULL;
6302 if (coarray == NULL)
6304 gfc_expr *result;
6305 /* FIXME: gfc_current_locus is wrong. */
6306 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6307 &gfc_current_locus);
6308 mpz_set_si (result->value.integer, 1);
6309 return result;
6312 gcc_assert (coarray->expr_type == EXPR_VARIABLE);
6314 /* Follow any component references. */
6315 as = coarray->symtree->n.sym->as;
6316 for (ref = coarray->ref; ref; ref = ref->next)
6317 if (ref->type == REF_COMPONENT)
6318 as = ref->u.ar.as;
6320 if (as->type == AS_DEFERRED)
6321 return NULL;
6323 if (dim == NULL)
6325 /* Multi-dimensional bounds. */
6326 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
6327 gfc_expr *e;
6329 /* Simplify the bounds for each dimension. */
6330 for (d = 0; d < as->corank; d++)
6332 bounds[d] = simplify_bound_dim (coarray, NULL, d + as->rank + 1, 0,
6333 as, NULL, true);
6334 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
6336 int j;
6338 for (j = 0; j < d; j++)
6339 gfc_free_expr (bounds[j]);
6341 return bounds[d];
6345 /* Allocate the result expression. */
6346 e = gfc_get_expr ();
6347 e->where = coarray->where;
6348 e->expr_type = EXPR_ARRAY;
6349 e->ts.type = BT_INTEGER;
6350 e->ts.kind = gfc_default_integer_kind;
6352 e->rank = 1;
6353 e->shape = gfc_get_shape (1);
6354 mpz_init_set_ui (e->shape[0], as->corank);
6356 /* Create the constructor for this array. */
6357 for (d = 0; d < as->corank; d++)
6358 gfc_constructor_append_expr (&e->value.constructor,
6359 bounds[d], &e->where);
6361 return e;
6363 else
6365 /* A DIM argument is specified. */
6366 if (dim->expr_type != EXPR_CONSTANT)
6367 return NULL;
6369 d = mpz_get_si (dim->value.integer);
6371 if (d < 1 || d > as->corank)
6373 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
6374 return &gfc_bad_expr;
6377 return simplify_bound_dim (coarray, NULL, d + as->rank, 0, as, NULL,
6378 true);
6383 gfc_expr *
6384 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6386 return simplify_bound (array, dim, kind, 1);
6389 gfc_expr *
6390 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6392 return simplify_cobound (array, dim, kind, 1);
6396 gfc_expr *
6397 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
6399 gfc_expr *result, *e;
6400 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
6402 if (!is_constant_array_expr (vector)
6403 || !is_constant_array_expr (mask)
6404 || (!gfc_is_constant_expr (field)
6405 && !is_constant_array_expr(field)))
6406 return NULL;
6408 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
6409 &vector->where);
6410 if (vector->ts.type == BT_DERIVED)
6411 result->ts.u.derived = vector->ts.u.derived;
6412 result->rank = mask->rank;
6413 result->shape = gfc_copy_shape (mask->shape, mask->rank);
6415 if (vector->ts.type == BT_CHARACTER)
6416 result->ts.u.cl = vector->ts.u.cl;
6418 vector_ctor = gfc_constructor_first (vector->value.constructor);
6419 mask_ctor = gfc_constructor_first (mask->value.constructor);
6420 field_ctor
6421 = field->expr_type == EXPR_ARRAY
6422 ? gfc_constructor_first (field->value.constructor)
6423 : NULL;
6425 while (mask_ctor)
6427 if (mask_ctor->expr->value.logical)
6429 gcc_assert (vector_ctor);
6430 e = gfc_copy_expr (vector_ctor->expr);
6431 vector_ctor = gfc_constructor_next (vector_ctor);
6433 else if (field->expr_type == EXPR_ARRAY)
6434 e = gfc_copy_expr (field_ctor->expr);
6435 else
6436 e = gfc_copy_expr (field);
6438 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
6440 mask_ctor = gfc_constructor_next (mask_ctor);
6441 field_ctor = gfc_constructor_next (field_ctor);
6444 return result;
6448 gfc_expr *
6449 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
6451 gfc_expr *result;
6452 int back;
6453 size_t index, len, lenset;
6454 size_t i;
6455 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
6457 if (k == -1)
6458 return &gfc_bad_expr;
6460 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
6461 return NULL;
6463 if (b != NULL && b->value.logical != 0)
6464 back = 1;
6465 else
6466 back = 0;
6468 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
6470 len = s->value.character.length;
6471 lenset = set->value.character.length;
6473 if (len == 0)
6475 mpz_set_ui (result->value.integer, 0);
6476 return result;
6479 if (back == 0)
6481 if (lenset == 0)
6483 mpz_set_ui (result->value.integer, 1);
6484 return result;
6487 index = wide_strspn (s->value.character.string,
6488 set->value.character.string) + 1;
6489 if (index > len)
6490 index = 0;
6493 else
6495 if (lenset == 0)
6497 mpz_set_ui (result->value.integer, len);
6498 return result;
6500 for (index = len; index > 0; index --)
6502 for (i = 0; i < lenset; i++)
6504 if (s->value.character.string[index - 1]
6505 == set->value.character.string[i])
6506 break;
6508 if (i == lenset)
6509 break;
6513 mpz_set_ui (result->value.integer, index);
6514 return result;
6518 gfc_expr *
6519 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
6521 gfc_expr *result;
6522 int kind;
6524 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6525 return NULL;
6527 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
6529 switch (x->ts.type)
6531 case BT_INTEGER:
6532 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
6533 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
6534 return range_check (result, "XOR");
6536 case BT_LOGICAL:
6537 return gfc_get_logical_expr (kind, &x->where,
6538 (x->value.logical && !y->value.logical)
6539 || (!x->value.logical && y->value.logical));
6541 default:
6542 gcc_unreachable ();
6547 /****************** Constant simplification *****************/
6549 /* Master function to convert one constant to another. While this is
6550 used as a simplification function, it requires the destination type
6551 and kind information which is supplied by a special case in
6552 do_simplify(). */
6554 gfc_expr *
6555 gfc_convert_constant (gfc_expr *e, bt type, int kind)
6557 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
6558 gfc_constructor *c;
6560 switch (e->ts.type)
6562 case BT_INTEGER:
6563 switch (type)
6565 case BT_INTEGER:
6566 f = gfc_int2int;
6567 break;
6568 case BT_REAL:
6569 f = gfc_int2real;
6570 break;
6571 case BT_COMPLEX:
6572 f = gfc_int2complex;
6573 break;
6574 case BT_LOGICAL:
6575 f = gfc_int2log;
6576 break;
6577 default:
6578 goto oops;
6580 break;
6582 case BT_REAL:
6583 switch (type)
6585 case BT_INTEGER:
6586 f = gfc_real2int;
6587 break;
6588 case BT_REAL:
6589 f = gfc_real2real;
6590 break;
6591 case BT_COMPLEX:
6592 f = gfc_real2complex;
6593 break;
6594 default:
6595 goto oops;
6597 break;
6599 case BT_COMPLEX:
6600 switch (type)
6602 case BT_INTEGER:
6603 f = gfc_complex2int;
6604 break;
6605 case BT_REAL:
6606 f = gfc_complex2real;
6607 break;
6608 case BT_COMPLEX:
6609 f = gfc_complex2complex;
6610 break;
6612 default:
6613 goto oops;
6615 break;
6617 case BT_LOGICAL:
6618 switch (type)
6620 case BT_INTEGER:
6621 f = gfc_log2int;
6622 break;
6623 case BT_LOGICAL:
6624 f = gfc_log2log;
6625 break;
6626 default:
6627 goto oops;
6629 break;
6631 case BT_HOLLERITH:
6632 switch (type)
6634 case BT_INTEGER:
6635 f = gfc_hollerith2int;
6636 break;
6638 case BT_REAL:
6639 f = gfc_hollerith2real;
6640 break;
6642 case BT_COMPLEX:
6643 f = gfc_hollerith2complex;
6644 break;
6646 case BT_CHARACTER:
6647 f = gfc_hollerith2character;
6648 break;
6650 case BT_LOGICAL:
6651 f = gfc_hollerith2logical;
6652 break;
6654 default:
6655 goto oops;
6657 break;
6659 default:
6660 oops:
6661 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
6664 result = NULL;
6666 switch (e->expr_type)
6668 case EXPR_CONSTANT:
6669 result = f (e, kind);
6670 if (result == NULL)
6671 return &gfc_bad_expr;
6672 break;
6674 case EXPR_ARRAY:
6675 if (!gfc_is_constant_expr (e))
6676 break;
6678 result = gfc_get_array_expr (type, kind, &e->where);
6679 result->shape = gfc_copy_shape (e->shape, e->rank);
6680 result->rank = e->rank;
6682 for (c = gfc_constructor_first (e->value.constructor);
6683 c; c = gfc_constructor_next (c))
6685 gfc_expr *tmp;
6686 if (c->iterator == NULL)
6687 tmp = f (c->expr, kind);
6688 else
6690 g = gfc_convert_constant (c->expr, type, kind);
6691 if (g == &gfc_bad_expr)
6693 gfc_free_expr (result);
6694 return g;
6696 tmp = g;
6699 if (tmp == NULL)
6701 gfc_free_expr (result);
6702 return NULL;
6705 gfc_constructor_append_expr (&result->value.constructor,
6706 tmp, &c->where);
6709 break;
6711 default:
6712 break;
6715 return result;
6719 /* Function for converting character constants. */
6720 gfc_expr *
6721 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
6723 gfc_expr *result;
6724 int i;
6726 if (!gfc_is_constant_expr (e))
6727 return NULL;
6729 if (e->expr_type == EXPR_CONSTANT)
6731 /* Simple case of a scalar. */
6732 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
6733 if (result == NULL)
6734 return &gfc_bad_expr;
6736 result->value.character.length = e->value.character.length;
6737 result->value.character.string
6738 = gfc_get_wide_string (e->value.character.length + 1);
6739 memcpy (result->value.character.string, e->value.character.string,
6740 (e->value.character.length + 1) * sizeof (gfc_char_t));
6742 /* Check we only have values representable in the destination kind. */
6743 for (i = 0; i < result->value.character.length; i++)
6744 if (!gfc_check_character_range (result->value.character.string[i],
6745 kind))
6747 gfc_error ("Character '%s' in string at %L cannot be converted "
6748 "into character kind %d",
6749 gfc_print_wide_char (result->value.character.string[i]),
6750 &e->where, kind);
6751 return &gfc_bad_expr;
6754 return result;
6756 else if (e->expr_type == EXPR_ARRAY)
6758 /* For an array constructor, we convert each constructor element. */
6759 gfc_constructor *c;
6761 result = gfc_get_array_expr (type, kind, &e->where);
6762 result->shape = gfc_copy_shape (e->shape, e->rank);
6763 result->rank = e->rank;
6764 result->ts.u.cl = e->ts.u.cl;
6766 for (c = gfc_constructor_first (e->value.constructor);
6767 c; c = gfc_constructor_next (c))
6769 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
6770 if (tmp == &gfc_bad_expr)
6772 gfc_free_expr (result);
6773 return &gfc_bad_expr;
6776 if (tmp == NULL)
6778 gfc_free_expr (result);
6779 return NULL;
6782 gfc_constructor_append_expr (&result->value.constructor,
6783 tmp, &c->where);
6786 return result;
6788 else
6789 return NULL;
6793 gfc_expr *
6794 gfc_simplify_compiler_options (void)
6796 char *str;
6797 gfc_expr *result;
6799 str = gfc_get_option_string ();
6800 result = gfc_get_character_expr (gfc_default_character_kind,
6801 &gfc_current_locus, str, strlen (str));
6802 free (str);
6803 return result;
6807 gfc_expr *
6808 gfc_simplify_compiler_version (void)
6810 char *buffer;
6811 size_t len;
6813 len = strlen ("GCC version ") + strlen (version_string);
6814 buffer = XALLOCAVEC (char, len + 1);
6815 snprintf (buffer, len + 1, "GCC version %s", version_string);
6816 return gfc_get_character_expr (gfc_default_character_kind,
6817 &gfc_current_locus, buffer, len);