PR 78534 Change character length from int to size_t
[official-gcc.git] / gcc / fortran / simplify.c
blob4ea8163e598066cffee114a9478fe31f6da6aef9
1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
3 Contributed by Andy Vaught & Katherine Holcomb
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h" /* For BITS_PER_UNIT. */
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;
35 static gfc_expr *simplify_size (gfc_expr *, gfc_expr *, int);
38 /* Note that 'simplification' is not just transforming expressions.
39 For functions that are not simplified at compile time, range
40 checking is done if possible.
42 The return convention is that each simplification function returns:
44 A new expression node corresponding to the simplified arguments.
45 The original arguments are destroyed by the caller, and must not
46 be a part of the new expression.
48 NULL pointer indicating that no simplification was possible and
49 the original expression should remain intact.
51 An expression pointer to gfc_bad_expr (a static placeholder)
52 indicating that some error has prevented simplification. The
53 error is generated within the function and should be propagated
54 upwards
56 By the time a simplification function gets control, it has been
57 decided that the function call is really supposed to be the
58 intrinsic. No type checking is strictly necessary, since only
59 valid types will be passed on. On the other hand, a simplification
60 subroutine may have to look at the type of an argument as part of
61 its processing.
63 Array arguments are only passed to these subroutines that implement
64 the simplification of transformational intrinsics.
66 The functions in this file don't have much comment with them, but
67 everything is reasonably straight-forward. The Standard, chapter 13
68 is the best comment you'll find for this file anyway. */
70 /* Range checks an expression node. If all goes well, returns the
71 node, otherwise returns &gfc_bad_expr and frees the node. */
73 static gfc_expr *
74 range_check (gfc_expr *result, const char *name)
76 if (result == NULL)
77 return &gfc_bad_expr;
79 if (result->expr_type != EXPR_CONSTANT)
80 return result;
82 switch (gfc_range_check (result))
84 case ARITH_OK:
85 return result;
87 case ARITH_OVERFLOW:
88 gfc_error ("Result of %s overflows its kind at %L", name,
89 &result->where);
90 break;
92 case ARITH_UNDERFLOW:
93 gfc_error ("Result of %s underflows its kind at %L", name,
94 &result->where);
95 break;
97 case ARITH_NAN:
98 gfc_error ("Result of %s is NaN at %L", name, &result->where);
99 break;
101 default:
102 gfc_error ("Result of %s gives range error for its kind at %L", name,
103 &result->where);
104 break;
107 gfc_free_expr (result);
108 return &gfc_bad_expr;
112 /* A helper function that gets an optional and possibly missing
113 kind parameter. Returns the kind, -1 if something went wrong. */
115 static int
116 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
118 int kind;
120 if (k == NULL)
121 return default_kind;
123 if (k->expr_type != EXPR_CONSTANT)
125 gfc_error ("KIND parameter of %s at %L must be an initialization "
126 "expression", name, &k->where);
127 return -1;
130 if (gfc_extract_int (k, &kind) != NULL
131 || gfc_validate_kind (type, kind, true) < 0)
133 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
134 return -1;
137 return kind;
141 /* Converts an mpz_t signed variable into an unsigned one, assuming
142 two's complement representations and a binary width of bitsize.
143 The conversion is a no-op unless x is negative; otherwise, it can
144 be accomplished by masking out the high bits. */
146 static void
147 convert_mpz_to_unsigned (mpz_t x, int bitsize)
149 mpz_t mask;
151 if (mpz_sgn (x) < 0)
153 /* Confirm that no bits above the signed range are unset if we
154 are doing range checking. */
155 if (flag_range_check != 0)
156 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
158 mpz_init_set_ui (mask, 1);
159 mpz_mul_2exp (mask, mask, bitsize);
160 mpz_sub_ui (mask, mask, 1);
162 mpz_and (x, x, mask);
164 mpz_clear (mask);
166 else
168 /* Confirm that no bits above the signed range are set. */
169 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
174 /* Converts an mpz_t unsigned variable into a signed one, assuming
175 two's complement representations and a binary width of bitsize.
176 If the bitsize-1 bit is set, this is taken as a sign bit and
177 the number is converted to the corresponding negative number. */
179 void
180 gfc_convert_mpz_to_signed (mpz_t x, int bitsize)
182 mpz_t mask;
184 /* Confirm that no bits above the unsigned range are set if we are
185 doing range checking. */
186 if (flag_range_check != 0)
187 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
189 if (mpz_tstbit (x, bitsize - 1) == 1)
191 mpz_init_set_ui (mask, 1);
192 mpz_mul_2exp (mask, mask, bitsize);
193 mpz_sub_ui (mask, mask, 1);
195 /* We negate the number by hand, zeroing the high bits, that is
196 make it the corresponding positive number, and then have it
197 negated by GMP, giving the correct representation of the
198 negative number. */
199 mpz_com (x, x);
200 mpz_add_ui (x, x, 1);
201 mpz_and (x, x, mask);
203 mpz_neg (x, x);
205 mpz_clear (mask);
210 /* In-place convert BOZ to REAL of the specified kind. */
212 static gfc_expr *
213 convert_boz (gfc_expr *x, int kind)
215 if (x && x->ts.type == BT_INTEGER && x->is_boz)
217 gfc_typespec ts;
218 gfc_clear_ts (&ts);
219 ts.type = BT_REAL;
220 ts.kind = kind;
222 if (!gfc_convert_boz (x, &ts))
223 return &gfc_bad_expr;
226 return x;
230 /* Test that the expression is an constant array. */
232 static bool
233 is_constant_array_expr (gfc_expr *e)
235 gfc_constructor *c;
237 if (e == NULL)
238 return true;
240 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
241 return false;
243 for (c = gfc_constructor_first (e->value.constructor);
244 c; c = gfc_constructor_next (c))
245 if (c->expr->expr_type != EXPR_CONSTANT
246 && c->expr->expr_type != EXPR_STRUCTURE)
247 return false;
249 return true;
253 /* Initialize a transformational result expression with a given value. */
255 static void
256 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
258 if (e && e->expr_type == EXPR_ARRAY)
260 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
261 while (ctor)
263 init_result_expr (ctor->expr, init, array);
264 ctor = gfc_constructor_next (ctor);
267 else if (e && e->expr_type == EXPR_CONSTANT)
269 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
270 int length;
271 gfc_char_t *string;
273 switch (e->ts.type)
275 case BT_LOGICAL:
276 e->value.logical = (init ? 1 : 0);
277 break;
279 case BT_INTEGER:
280 if (init == INT_MIN)
281 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
282 else if (init == INT_MAX)
283 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
284 else
285 mpz_set_si (e->value.integer, init);
286 break;
288 case BT_REAL:
289 if (init == INT_MIN)
291 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
292 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
294 else if (init == INT_MAX)
295 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
296 else
297 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
298 break;
300 case BT_COMPLEX:
301 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
302 break;
304 case BT_CHARACTER:
305 if (init == INT_MIN)
307 gfc_expr *len = gfc_simplify_len (array, NULL);
308 gfc_extract_int (len, &length);
309 string = gfc_get_wide_string (length + 1);
310 gfc_wide_memset (string, 0, length);
312 else if (init == INT_MAX)
314 gfc_expr *len = gfc_simplify_len (array, NULL);
315 gfc_extract_int (len, &length);
316 string = gfc_get_wide_string (length + 1);
317 gfc_wide_memset (string, 255, length);
319 else
321 length = 0;
322 string = gfc_get_wide_string (1);
325 string[length] = '\0';
326 e->value.character.length = length;
327 e->value.character.string = string;
328 break;
330 default:
331 gcc_unreachable();
334 else
335 gcc_unreachable();
339 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
340 if conj_a is true, the matrix_a is complex conjugated. */
342 static gfc_expr *
343 compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
344 gfc_expr *matrix_b, int stride_b, int offset_b,
345 bool conj_a)
347 gfc_expr *result, *a, *b, *c;
349 result = gfc_get_constant_expr (matrix_a->ts.type, matrix_a->ts.kind,
350 &matrix_a->where);
351 init_result_expr (result, 0, NULL);
353 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
354 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
355 while (a && b)
357 /* Copying of expressions is required as operands are free'd
358 by the gfc_arith routines. */
359 switch (result->ts.type)
361 case BT_LOGICAL:
362 result = gfc_or (result,
363 gfc_and (gfc_copy_expr (a),
364 gfc_copy_expr (b)));
365 break;
367 case BT_INTEGER:
368 case BT_REAL:
369 case BT_COMPLEX:
370 if (conj_a && a->ts.type == BT_COMPLEX)
371 c = gfc_simplify_conjg (a);
372 else
373 c = gfc_copy_expr (a);
374 result = gfc_add (result, gfc_multiply (c, gfc_copy_expr (b)));
375 break;
377 default:
378 gcc_unreachable();
381 offset_a += stride_a;
382 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
384 offset_b += stride_b;
385 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
388 return result;
392 /* Build a result expression for transformational intrinsics,
393 depending on DIM. */
395 static gfc_expr *
396 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
397 int kind, locus* where)
399 gfc_expr *result;
400 int i, nelem;
402 if (!dim || array->rank == 1)
403 return gfc_get_constant_expr (type, kind, where);
405 result = gfc_get_array_expr (type, kind, where);
406 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
407 result->rank = array->rank - 1;
409 /* gfc_array_size() would count the number of elements in the constructor,
410 we have not built those yet. */
411 nelem = 1;
412 for (i = 0; i < result->rank; ++i)
413 nelem *= mpz_get_ui (result->shape[i]);
415 for (i = 0; i < nelem; ++i)
417 gfc_constructor_append_expr (&result->value.constructor,
418 gfc_get_constant_expr (type, kind, where),
419 NULL);
422 return result;
426 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
428 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
429 of COUNT intrinsic is .TRUE..
431 Interface and implementation mimics arith functions as
432 gfc_add, gfc_multiply, etc. */
434 static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
436 gfc_expr *result;
438 gcc_assert (op1->ts.type == BT_INTEGER);
439 gcc_assert (op2->ts.type == BT_LOGICAL);
440 gcc_assert (op2->value.logical);
442 result = gfc_copy_expr (op1);
443 mpz_add_ui (result->value.integer, result->value.integer, 1);
445 gfc_free_expr (op1);
446 gfc_free_expr (op2);
447 return result;
451 /* Transforms an ARRAY with operation OP, according to MASK, to a
452 scalar RESULT. E.g. called if
454 REAL, PARAMETER :: array(n, m) = ...
455 REAL, PARAMETER :: s = SUM(array)
457 where OP == gfc_add(). */
459 static gfc_expr *
460 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
461 transformational_op op)
463 gfc_expr *a, *m;
464 gfc_constructor *array_ctor, *mask_ctor;
466 /* Shortcut for constant .FALSE. MASK. */
467 if (mask
468 && mask->expr_type == EXPR_CONSTANT
469 && !mask->value.logical)
470 return result;
472 array_ctor = gfc_constructor_first (array->value.constructor);
473 mask_ctor = NULL;
474 if (mask && mask->expr_type == EXPR_ARRAY)
475 mask_ctor = gfc_constructor_first (mask->value.constructor);
477 while (array_ctor)
479 a = array_ctor->expr;
480 array_ctor = gfc_constructor_next (array_ctor);
482 /* A constant MASK equals .TRUE. here and can be ignored. */
483 if (mask_ctor)
485 m = mask_ctor->expr;
486 mask_ctor = gfc_constructor_next (mask_ctor);
487 if (!m->value.logical)
488 continue;
491 result = op (result, gfc_copy_expr (a));
492 if (!result)
493 return result;
496 return result;
499 /* Transforms an ARRAY with operation OP, according to MASK, to an
500 array RESULT. E.g. called if
502 REAL, PARAMETER :: array(n, m) = ...
503 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
505 where OP == gfc_multiply().
506 The result might be post processed using post_op. */
508 static gfc_expr *
509 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
510 gfc_expr *mask, transformational_op op,
511 transformational_op post_op)
513 mpz_t size;
514 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
515 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
516 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
518 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
519 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
520 tmpstride[GFC_MAX_DIMENSIONS];
522 /* Shortcut for constant .FALSE. MASK. */
523 if (mask
524 && mask->expr_type == EXPR_CONSTANT
525 && !mask->value.logical)
526 return result;
528 /* Build an indexed table for array element expressions to minimize
529 linked-list traversal. Masked elements are set to NULL. */
530 gfc_array_size (array, &size);
531 arraysize = mpz_get_ui (size);
532 mpz_clear (size);
534 arrayvec = XCNEWVEC (gfc_expr*, arraysize);
536 array_ctor = gfc_constructor_first (array->value.constructor);
537 mask_ctor = NULL;
538 if (mask && mask->expr_type == EXPR_ARRAY)
539 mask_ctor = gfc_constructor_first (mask->value.constructor);
541 for (i = 0; i < arraysize; ++i)
543 arrayvec[i] = array_ctor->expr;
544 array_ctor = gfc_constructor_next (array_ctor);
546 if (mask_ctor)
548 if (!mask_ctor->expr->value.logical)
549 arrayvec[i] = NULL;
551 mask_ctor = gfc_constructor_next (mask_ctor);
555 /* Same for the result expression. */
556 gfc_array_size (result, &size);
557 resultsize = mpz_get_ui (size);
558 mpz_clear (size);
560 resultvec = XCNEWVEC (gfc_expr*, resultsize);
561 result_ctor = gfc_constructor_first (result->value.constructor);
562 for (i = 0; i < resultsize; ++i)
564 resultvec[i] = result_ctor->expr;
565 result_ctor = gfc_constructor_next (result_ctor);
568 gfc_extract_int (dim, &dim_index);
569 dim_index -= 1; /* zero-base index */
570 dim_extent = 0;
571 dim_stride = 0;
573 for (i = 0, n = 0; i < array->rank; ++i)
575 count[i] = 0;
576 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
577 if (i == dim_index)
579 dim_extent = mpz_get_si (array->shape[i]);
580 dim_stride = tmpstride[i];
581 continue;
584 extent[n] = mpz_get_si (array->shape[i]);
585 sstride[n] = tmpstride[i];
586 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
587 n += 1;
590 done = false;
591 base = arrayvec;
592 dest = resultvec;
593 while (!done)
595 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
596 if (*src)
597 *dest = op (*dest, gfc_copy_expr (*src));
599 count[0]++;
600 base += sstride[0];
601 dest += dstride[0];
603 n = 0;
604 while (!done && count[n] == extent[n])
606 count[n] = 0;
607 base -= sstride[n] * extent[n];
608 dest -= dstride[n] * extent[n];
610 n++;
611 if (n < result->rank)
613 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
614 times, we'd warn for the last iteration, because the
615 array index will have already been incremented to the
616 array sizes, and we can't tell that this must make
617 the test against result->rank false, because ranks
618 must not exceed GFC_MAX_DIMENSIONS. */
619 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray-bounds)
620 count[n]++;
621 base += sstride[n];
622 dest += dstride[n];
623 GCC_DIAGNOSTIC_POP
625 else
626 done = true;
630 /* Place updated expression in result constructor. */
631 result_ctor = gfc_constructor_first (result->value.constructor);
632 for (i = 0; i < resultsize; ++i)
634 if (post_op)
635 result_ctor->expr = post_op (result_ctor->expr, resultvec[i]);
636 else
637 result_ctor->expr = resultvec[i];
638 result_ctor = gfc_constructor_next (result_ctor);
641 free (arrayvec);
642 free (resultvec);
643 return result;
647 static gfc_expr *
648 simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
649 int init_val, transformational_op op)
651 gfc_expr *result;
653 if (!is_constant_array_expr (array)
654 || !gfc_is_constant_expr (dim))
655 return NULL;
657 if (mask
658 && !is_constant_array_expr (mask)
659 && mask->expr_type != EXPR_CONSTANT)
660 return NULL;
662 result = transformational_result (array, dim, array->ts.type,
663 array->ts.kind, &array->where);
664 init_result_expr (result, init_val, NULL);
666 return !dim || array->rank == 1 ?
667 simplify_transformation_to_scalar (result, array, mask, op) :
668 simplify_transformation_to_array (result, array, dim, mask, op, NULL);
672 /********************** Simplification functions *****************************/
674 gfc_expr *
675 gfc_simplify_abs (gfc_expr *e)
677 gfc_expr *result;
679 if (e->expr_type != EXPR_CONSTANT)
680 return NULL;
682 switch (e->ts.type)
684 case BT_INTEGER:
685 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
686 mpz_abs (result->value.integer, e->value.integer);
687 return range_check (result, "IABS");
689 case BT_REAL:
690 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
691 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
692 return range_check (result, "ABS");
694 case BT_COMPLEX:
695 gfc_set_model_kind (e->ts.kind);
696 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
697 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
698 return range_check (result, "CABS");
700 default:
701 gfc_internal_error ("gfc_simplify_abs(): Bad type");
706 static gfc_expr *
707 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
709 gfc_expr *result;
710 int kind;
711 bool too_large = false;
713 if (e->expr_type != EXPR_CONSTANT)
714 return NULL;
716 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
717 if (kind == -1)
718 return &gfc_bad_expr;
720 if (mpz_cmp_si (e->value.integer, 0) < 0)
722 gfc_error ("Argument of %s function at %L is negative", name,
723 &e->where);
724 return &gfc_bad_expr;
727 if (ascii && warn_surprising && mpz_cmp_si (e->value.integer, 127) > 0)
728 gfc_warning (OPT_Wsurprising,
729 "Argument of %s function at %L outside of range [0,127]",
730 name, &e->where);
732 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
733 too_large = true;
734 else if (kind == 4)
736 mpz_t t;
737 mpz_init_set_ui (t, 2);
738 mpz_pow_ui (t, t, 32);
739 mpz_sub_ui (t, t, 1);
740 if (mpz_cmp (e->value.integer, t) > 0)
741 too_large = true;
742 mpz_clear (t);
745 if (too_large)
747 gfc_error ("Argument of %s function at %L is too large for the "
748 "collating sequence of kind %d", name, &e->where, kind);
749 return &gfc_bad_expr;
752 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
753 result->value.character.string[0] = mpz_get_ui (e->value.integer);
755 return result;
760 /* We use the processor's collating sequence, because all
761 systems that gfortran currently works on are ASCII. */
763 gfc_expr *
764 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
766 return simplify_achar_char (e, k, "ACHAR", true);
770 gfc_expr *
771 gfc_simplify_acos (gfc_expr *x)
773 gfc_expr *result;
775 if (x->expr_type != EXPR_CONSTANT)
776 return NULL;
778 switch (x->ts.type)
780 case BT_REAL:
781 if (mpfr_cmp_si (x->value.real, 1) > 0
782 || mpfr_cmp_si (x->value.real, -1) < 0)
784 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
785 &x->where);
786 return &gfc_bad_expr;
788 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
789 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
790 break;
792 case BT_COMPLEX:
793 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
794 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
795 break;
797 default:
798 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
801 return range_check (result, "ACOS");
804 gfc_expr *
805 gfc_simplify_acosh (gfc_expr *x)
807 gfc_expr *result;
809 if (x->expr_type != EXPR_CONSTANT)
810 return NULL;
812 switch (x->ts.type)
814 case BT_REAL:
815 if (mpfr_cmp_si (x->value.real, 1) < 0)
817 gfc_error ("Argument of ACOSH at %L must not be less than 1",
818 &x->where);
819 return &gfc_bad_expr;
822 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
823 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
824 break;
826 case BT_COMPLEX:
827 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
828 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
829 break;
831 default:
832 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
835 return range_check (result, "ACOSH");
838 gfc_expr *
839 gfc_simplify_adjustl (gfc_expr *e)
841 gfc_expr *result;
842 int count, i, len;
843 gfc_char_t ch;
845 if (e->expr_type != EXPR_CONSTANT)
846 return NULL;
848 len = e->value.character.length;
850 for (count = 0, i = 0; i < len; ++i)
852 ch = e->value.character.string[i];
853 if (ch != ' ')
854 break;
855 ++count;
858 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
859 for (i = 0; i < len - count; ++i)
860 result->value.character.string[i] = e->value.character.string[count + i];
862 return result;
866 gfc_expr *
867 gfc_simplify_adjustr (gfc_expr *e)
869 gfc_expr *result;
870 int count, i, len;
871 gfc_char_t ch;
873 if (e->expr_type != EXPR_CONSTANT)
874 return NULL;
876 len = e->value.character.length;
878 for (count = 0, i = len - 1; i >= 0; --i)
880 ch = e->value.character.string[i];
881 if (ch != ' ')
882 break;
883 ++count;
886 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
887 for (i = 0; i < count; ++i)
888 result->value.character.string[i] = ' ';
890 for (i = count; i < len; ++i)
891 result->value.character.string[i] = e->value.character.string[i - count];
893 return result;
897 gfc_expr *
898 gfc_simplify_aimag (gfc_expr *e)
900 gfc_expr *result;
902 if (e->expr_type != EXPR_CONSTANT)
903 return NULL;
905 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
906 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
908 return range_check (result, "AIMAG");
912 gfc_expr *
913 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
915 gfc_expr *rtrunc, *result;
916 int kind;
918 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
919 if (kind == -1)
920 return &gfc_bad_expr;
922 if (e->expr_type != EXPR_CONSTANT)
923 return NULL;
925 rtrunc = gfc_copy_expr (e);
926 mpfr_trunc (rtrunc->value.real, e->value.real);
928 result = gfc_real2real (rtrunc, kind);
930 gfc_free_expr (rtrunc);
932 return range_check (result, "AINT");
936 gfc_expr *
937 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
939 return simplify_transformation (mask, dim, NULL, true, gfc_and);
943 gfc_expr *
944 gfc_simplify_dint (gfc_expr *e)
946 gfc_expr *rtrunc, *result;
948 if (e->expr_type != EXPR_CONSTANT)
949 return NULL;
951 rtrunc = gfc_copy_expr (e);
952 mpfr_trunc (rtrunc->value.real, e->value.real);
954 result = gfc_real2real (rtrunc, gfc_default_double_kind);
956 gfc_free_expr (rtrunc);
958 return range_check (result, "DINT");
962 gfc_expr *
963 gfc_simplify_dreal (gfc_expr *e)
965 gfc_expr *result = NULL;
967 if (e->expr_type != EXPR_CONSTANT)
968 return NULL;
970 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
971 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
973 return range_check (result, "DREAL");
977 gfc_expr *
978 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
980 gfc_expr *result;
981 int kind;
983 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
984 if (kind == -1)
985 return &gfc_bad_expr;
987 if (e->expr_type != EXPR_CONSTANT)
988 return NULL;
990 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
991 mpfr_round (result->value.real, e->value.real);
993 return range_check (result, "ANINT");
997 gfc_expr *
998 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
1000 gfc_expr *result;
1001 int kind;
1003 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1004 return NULL;
1006 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1008 switch (x->ts.type)
1010 case BT_INTEGER:
1011 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
1012 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1013 return range_check (result, "AND");
1015 case BT_LOGICAL:
1016 return gfc_get_logical_expr (kind, &x->where,
1017 x->value.logical && y->value.logical);
1019 default:
1020 gcc_unreachable ();
1025 gfc_expr *
1026 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
1028 return simplify_transformation (mask, dim, NULL, false, gfc_or);
1032 gfc_expr *
1033 gfc_simplify_dnint (gfc_expr *e)
1035 gfc_expr *result;
1037 if (e->expr_type != EXPR_CONSTANT)
1038 return NULL;
1040 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
1041 mpfr_round (result->value.real, e->value.real);
1043 return range_check (result, "DNINT");
1047 gfc_expr *
1048 gfc_simplify_asin (gfc_expr *x)
1050 gfc_expr *result;
1052 if (x->expr_type != EXPR_CONSTANT)
1053 return NULL;
1055 switch (x->ts.type)
1057 case BT_REAL:
1058 if (mpfr_cmp_si (x->value.real, 1) > 0
1059 || mpfr_cmp_si (x->value.real, -1) < 0)
1061 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1062 &x->where);
1063 return &gfc_bad_expr;
1065 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1066 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1067 break;
1069 case BT_COMPLEX:
1070 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1071 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1072 break;
1074 default:
1075 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1078 return range_check (result, "ASIN");
1082 gfc_expr *
1083 gfc_simplify_asinh (gfc_expr *x)
1085 gfc_expr *result;
1087 if (x->expr_type != EXPR_CONSTANT)
1088 return NULL;
1090 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1092 switch (x->ts.type)
1094 case BT_REAL:
1095 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1096 break;
1098 case BT_COMPLEX:
1099 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1100 break;
1102 default:
1103 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1106 return range_check (result, "ASINH");
1110 gfc_expr *
1111 gfc_simplify_atan (gfc_expr *x)
1113 gfc_expr *result;
1115 if (x->expr_type != EXPR_CONSTANT)
1116 return NULL;
1118 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1120 switch (x->ts.type)
1122 case BT_REAL:
1123 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1124 break;
1126 case BT_COMPLEX:
1127 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1128 break;
1130 default:
1131 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1134 return range_check (result, "ATAN");
1138 gfc_expr *
1139 gfc_simplify_atanh (gfc_expr *x)
1141 gfc_expr *result;
1143 if (x->expr_type != EXPR_CONSTANT)
1144 return NULL;
1146 switch (x->ts.type)
1148 case BT_REAL:
1149 if (mpfr_cmp_si (x->value.real, 1) >= 0
1150 || mpfr_cmp_si (x->value.real, -1) <= 0)
1152 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1153 "to 1", &x->where);
1154 return &gfc_bad_expr;
1156 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1157 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1158 break;
1160 case BT_COMPLEX:
1161 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1162 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1163 break;
1165 default:
1166 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1169 return range_check (result, "ATANH");
1173 gfc_expr *
1174 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1176 gfc_expr *result;
1178 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1179 return NULL;
1181 if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
1183 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1184 "second argument must not be zero", &x->where);
1185 return &gfc_bad_expr;
1188 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1189 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1191 return range_check (result, "ATAN2");
1195 gfc_expr *
1196 gfc_simplify_bessel_j0 (gfc_expr *x)
1198 gfc_expr *result;
1200 if (x->expr_type != EXPR_CONSTANT)
1201 return NULL;
1203 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1204 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1206 return range_check (result, "BESSEL_J0");
1210 gfc_expr *
1211 gfc_simplify_bessel_j1 (gfc_expr *x)
1213 gfc_expr *result;
1215 if (x->expr_type != EXPR_CONSTANT)
1216 return NULL;
1218 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1219 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1221 return range_check (result, "BESSEL_J1");
1225 gfc_expr *
1226 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1228 gfc_expr *result;
1229 long n;
1231 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1232 return NULL;
1234 n = mpz_get_si (order->value.integer);
1235 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1236 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1238 return range_check (result, "BESSEL_JN");
1242 /* Simplify transformational form of JN and YN. */
1244 static gfc_expr *
1245 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1246 bool jn)
1248 gfc_expr *result;
1249 gfc_expr *e;
1250 long n1, n2;
1251 int i;
1252 mpfr_t x2rev, last1, last2;
1254 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1255 || order2->expr_type != EXPR_CONSTANT)
1256 return NULL;
1258 n1 = mpz_get_si (order1->value.integer);
1259 n2 = mpz_get_si (order2->value.integer);
1260 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1261 result->rank = 1;
1262 result->shape = gfc_get_shape (1);
1263 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1265 if (n2 < n1)
1266 return result;
1268 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1269 YN(N, 0.0) = -Inf. */
1271 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1273 if (!jn && flag_range_check)
1275 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1276 gfc_free_expr (result);
1277 return &gfc_bad_expr;
1280 if (jn && n1 == 0)
1282 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1283 mpfr_set_ui (e->value.real, 1, GFC_RND_MODE);
1284 gfc_constructor_append_expr (&result->value.constructor, e,
1285 &x->where);
1286 n1++;
1289 for (i = n1; i <= n2; i++)
1291 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1292 if (jn)
1293 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
1294 else
1295 mpfr_set_inf (e->value.real, -1);
1296 gfc_constructor_append_expr (&result->value.constructor, e,
1297 &x->where);
1300 return result;
1303 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1304 are stable for downward recursion and Neumann functions are stable
1305 for upward recursion. It is
1306 x2rev = 2.0/x,
1307 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1308 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1309 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1311 gfc_set_model_kind (x->ts.kind);
1313 /* Get first recursion anchor. */
1315 mpfr_init (last1);
1316 if (jn)
1317 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1318 else
1319 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1321 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1322 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1323 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1325 mpfr_clear (last1);
1326 gfc_free_expr (e);
1327 gfc_free_expr (result);
1328 return &gfc_bad_expr;
1330 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1332 if (n1 == n2)
1334 mpfr_clear (last1);
1335 return result;
1338 /* Get second recursion anchor. */
1340 mpfr_init (last2);
1341 if (jn)
1342 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1343 else
1344 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1346 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1347 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1348 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1350 mpfr_clear (last1);
1351 mpfr_clear (last2);
1352 gfc_free_expr (e);
1353 gfc_free_expr (result);
1354 return &gfc_bad_expr;
1356 if (jn)
1357 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1358 else
1359 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1361 if (n1 + 1 == n2)
1363 mpfr_clear (last1);
1364 mpfr_clear (last2);
1365 return result;
1368 /* Start actual recursion. */
1370 mpfr_init (x2rev);
1371 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1373 for (i = 2; i <= n2-n1; i++)
1375 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1377 /* Special case: For YN, if the previous N gave -INF, set
1378 also N+1 to -INF. */
1379 if (!jn && !flag_range_check && mpfr_inf_p (last2))
1381 mpfr_set_inf (e->value.real, -1);
1382 gfc_constructor_append_expr (&result->value.constructor, e,
1383 &x->where);
1384 continue;
1387 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1388 GFC_RND_MODE);
1389 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1390 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1392 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1394 /* Range_check frees "e" in that case. */
1395 e = NULL;
1396 goto error;
1399 if (jn)
1400 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1401 -i-1);
1402 else
1403 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1405 mpfr_set (last1, last2, GFC_RND_MODE);
1406 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1409 mpfr_clear (last1);
1410 mpfr_clear (last2);
1411 mpfr_clear (x2rev);
1412 return result;
1414 error:
1415 mpfr_clear (last1);
1416 mpfr_clear (last2);
1417 mpfr_clear (x2rev);
1418 gfc_free_expr (e);
1419 gfc_free_expr (result);
1420 return &gfc_bad_expr;
1424 gfc_expr *
1425 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1427 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1431 gfc_expr *
1432 gfc_simplify_bessel_y0 (gfc_expr *x)
1434 gfc_expr *result;
1436 if (x->expr_type != EXPR_CONSTANT)
1437 return NULL;
1439 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1440 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1442 return range_check (result, "BESSEL_Y0");
1446 gfc_expr *
1447 gfc_simplify_bessel_y1 (gfc_expr *x)
1449 gfc_expr *result;
1451 if (x->expr_type != EXPR_CONSTANT)
1452 return NULL;
1454 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1455 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1457 return range_check (result, "BESSEL_Y1");
1461 gfc_expr *
1462 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1464 gfc_expr *result;
1465 long n;
1467 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1468 return NULL;
1470 n = mpz_get_si (order->value.integer);
1471 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1472 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1474 return range_check (result, "BESSEL_YN");
1478 gfc_expr *
1479 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1481 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1485 gfc_expr *
1486 gfc_simplify_bit_size (gfc_expr *e)
1488 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1489 return gfc_get_int_expr (e->ts.kind, &e->where,
1490 gfc_integer_kinds[i].bit_size);
1494 gfc_expr *
1495 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1497 int b;
1499 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1500 return NULL;
1502 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1503 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1505 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1506 mpz_tstbit (e->value.integer, b));
1510 static int
1511 compare_bitwise (gfc_expr *i, gfc_expr *j)
1513 mpz_t x, y;
1514 int k, res;
1516 gcc_assert (i->ts.type == BT_INTEGER);
1517 gcc_assert (j->ts.type == BT_INTEGER);
1519 mpz_init_set (x, i->value.integer);
1520 k = gfc_validate_kind (i->ts.type, i->ts.kind, false);
1521 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
1523 mpz_init_set (y, j->value.integer);
1524 k = gfc_validate_kind (j->ts.type, j->ts.kind, false);
1525 convert_mpz_to_unsigned (y, gfc_integer_kinds[k].bit_size);
1527 res = mpz_cmp (x, y);
1528 mpz_clear (x);
1529 mpz_clear (y);
1530 return res;
1534 gfc_expr *
1535 gfc_simplify_bge (gfc_expr *i, gfc_expr *j)
1537 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1538 return NULL;
1540 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1541 compare_bitwise (i, j) >= 0);
1545 gfc_expr *
1546 gfc_simplify_bgt (gfc_expr *i, gfc_expr *j)
1548 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1549 return NULL;
1551 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1552 compare_bitwise (i, j) > 0);
1556 gfc_expr *
1557 gfc_simplify_ble (gfc_expr *i, gfc_expr *j)
1559 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1560 return NULL;
1562 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1563 compare_bitwise (i, j) <= 0);
1567 gfc_expr *
1568 gfc_simplify_blt (gfc_expr *i, gfc_expr *j)
1570 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1571 return NULL;
1573 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1574 compare_bitwise (i, j) < 0);
1578 gfc_expr *
1579 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1581 gfc_expr *ceil, *result;
1582 int kind;
1584 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1585 if (kind == -1)
1586 return &gfc_bad_expr;
1588 if (e->expr_type != EXPR_CONSTANT)
1589 return NULL;
1591 ceil = gfc_copy_expr (e);
1592 mpfr_ceil (ceil->value.real, e->value.real);
1594 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1595 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1597 gfc_free_expr (ceil);
1599 return range_check (result, "CEILING");
1603 gfc_expr *
1604 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1606 return simplify_achar_char (e, k, "CHAR", false);
1610 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1612 static gfc_expr *
1613 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1615 gfc_expr *result;
1617 if (convert_boz (x, kind) == &gfc_bad_expr)
1618 return &gfc_bad_expr;
1620 if (convert_boz (y, kind) == &gfc_bad_expr)
1621 return &gfc_bad_expr;
1623 if (x->expr_type != EXPR_CONSTANT
1624 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1625 return NULL;
1627 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1629 switch (x->ts.type)
1631 case BT_INTEGER:
1632 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1633 break;
1635 case BT_REAL:
1636 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1637 break;
1639 case BT_COMPLEX:
1640 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1641 break;
1643 default:
1644 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1647 if (!y)
1648 return range_check (result, name);
1650 switch (y->ts.type)
1652 case BT_INTEGER:
1653 mpfr_set_z (mpc_imagref (result->value.complex),
1654 y->value.integer, GFC_RND_MODE);
1655 break;
1657 case BT_REAL:
1658 mpfr_set (mpc_imagref (result->value.complex),
1659 y->value.real, GFC_RND_MODE);
1660 break;
1662 default:
1663 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1666 return range_check (result, name);
1670 gfc_expr *
1671 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1673 int kind;
1675 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1676 if (kind == -1)
1677 return &gfc_bad_expr;
1679 return simplify_cmplx ("CMPLX", x, y, kind);
1683 gfc_expr *
1684 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1686 int kind;
1688 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1689 kind = gfc_default_complex_kind;
1690 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1691 kind = x->ts.kind;
1692 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1693 kind = y->ts.kind;
1694 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1695 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1696 else
1697 gcc_unreachable ();
1699 return simplify_cmplx ("COMPLEX", x, y, kind);
1703 gfc_expr *
1704 gfc_simplify_conjg (gfc_expr *e)
1706 gfc_expr *result;
1708 if (e->expr_type != EXPR_CONSTANT)
1709 return NULL;
1711 result = gfc_copy_expr (e);
1712 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1714 return range_check (result, "CONJG");
1717 /* Return the simplification of the constant expression in icall, or NULL
1718 if the expression is not constant. */
1720 static gfc_expr *
1721 simplify_trig_call (gfc_expr *icall)
1723 gfc_isym_id func = icall->value.function.isym->id;
1724 gfc_expr *x = icall->value.function.actual->expr;
1726 /* The actual simplifiers will return NULL for non-constant x. */
1727 switch (func)
1729 case GFC_ISYM_ACOS:
1730 return gfc_simplify_acos (x);
1731 case GFC_ISYM_ASIN:
1732 return gfc_simplify_asin (x);
1733 case GFC_ISYM_ATAN:
1734 return gfc_simplify_atan (x);
1735 case GFC_ISYM_COS:
1736 return gfc_simplify_cos (x);
1737 case GFC_ISYM_COTAN:
1738 return gfc_simplify_cotan (x);
1739 case GFC_ISYM_SIN:
1740 return gfc_simplify_sin (x);
1741 case GFC_ISYM_TAN:
1742 return gfc_simplify_tan (x);
1743 default:
1744 gfc_internal_error ("in simplify_trig_call(): Bad intrinsic");
1748 /* Convert a floating-point number from radians to degrees. */
1750 static void
1751 degrees_f (mpfr_t x, mp_rnd_t rnd_mode)
1753 mpfr_t tmp;
1754 mpfr_init (tmp);
1756 /* Set x = x % 2pi to avoid offsets with large angles. */
1757 mpfr_const_pi (tmp, rnd_mode);
1758 mpfr_mul_ui (tmp, tmp, 2, rnd_mode);
1759 mpfr_fmod (tmp, x, tmp, rnd_mode);
1761 /* Set x = x * 180. */
1762 mpfr_mul_ui (x, x, 180, rnd_mode);
1764 /* Set x = x / pi. */
1765 mpfr_const_pi (tmp, rnd_mode);
1766 mpfr_div (x, x, tmp, rnd_mode);
1768 mpfr_clear (tmp);
1771 /* Convert a floating-point number from degrees to radians. */
1773 static void
1774 radians_f (mpfr_t x, mp_rnd_t rnd_mode)
1776 mpfr_t tmp;
1777 mpfr_init (tmp);
1779 /* Set x = x % 360 to avoid offsets with large angles. */
1780 mpfr_set_ui (tmp, 360, rnd_mode);
1781 mpfr_fmod (tmp, x, tmp, rnd_mode);
1783 /* Set x = x * pi. */
1784 mpfr_const_pi (tmp, rnd_mode);
1785 mpfr_mul (x, x, tmp, rnd_mode);
1787 /* Set x = x / 180. */
1788 mpfr_div_ui (x, x, 180, rnd_mode);
1790 mpfr_clear (tmp);
1794 /* Convert argument to radians before calling a trig function. */
1796 gfc_expr *
1797 gfc_simplify_trigd (gfc_expr *icall)
1799 gfc_expr *arg;
1801 arg = icall->value.function.actual->expr;
1803 if (arg->ts.type != BT_REAL)
1804 gfc_internal_error ("in gfc_simplify_trigd(): Bad type");
1806 if (arg->expr_type == EXPR_CONSTANT)
1807 /* Convert constant to radians before passing off to simplifier. */
1808 radians_f (arg->value.real, GFC_RND_MODE);
1810 /* Let the usual simplifier take over - we just simplified the arg. */
1811 return simplify_trig_call (icall);
1814 /* Convert result of an inverse trig function to degrees. */
1816 gfc_expr *
1817 gfc_simplify_atrigd (gfc_expr *icall)
1819 gfc_expr *result;
1821 if (icall->value.function.actual->expr->ts.type != BT_REAL)
1822 gfc_internal_error ("in gfc_simplify_atrigd(): Bad type");
1824 /* See if another simplifier has work to do first. */
1825 result = simplify_trig_call (icall);
1827 if (result && result->expr_type == EXPR_CONSTANT)
1829 /* Convert constant to degrees after passing off to actual simplifier. */
1830 degrees_f (result->value.real, GFC_RND_MODE);
1831 return result;
1834 /* Let gfc_resolve_atrigd take care of the non-constant case. */
1835 return NULL;
1838 /* Convert the result of atan2 to degrees. */
1840 gfc_expr *
1841 gfc_simplify_atan2d (gfc_expr *y, gfc_expr *x)
1843 gfc_expr *result;
1845 if (x->ts.type != BT_REAL || y->ts.type != BT_REAL)
1846 gfc_internal_error ("in gfc_simplify_atan2d(): Bad type");
1848 if (x->expr_type == EXPR_CONSTANT && y->expr_type == EXPR_CONSTANT)
1850 result = gfc_simplify_atan2 (y, x);
1851 if (result != NULL)
1853 degrees_f (result->value.real, GFC_RND_MODE);
1854 return result;
1858 /* Let gfc_resolve_atan2d take care of the non-constant case. */
1859 return NULL;
1862 gfc_expr *
1863 gfc_simplify_cos (gfc_expr *x)
1865 gfc_expr *result;
1867 if (x->expr_type != EXPR_CONSTANT)
1868 return NULL;
1870 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1872 switch (x->ts.type)
1874 case BT_REAL:
1875 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1876 break;
1878 case BT_COMPLEX:
1879 gfc_set_model_kind (x->ts.kind);
1880 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1881 break;
1883 default:
1884 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1887 return range_check (result, "COS");
1891 gfc_expr *
1892 gfc_simplify_cosh (gfc_expr *x)
1894 gfc_expr *result;
1896 if (x->expr_type != EXPR_CONSTANT)
1897 return NULL;
1899 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1901 switch (x->ts.type)
1903 case BT_REAL:
1904 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1905 break;
1907 case BT_COMPLEX:
1908 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1909 break;
1911 default:
1912 gcc_unreachable ();
1915 return range_check (result, "COSH");
1919 gfc_expr *
1920 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1922 gfc_expr *result;
1924 if (!is_constant_array_expr (mask)
1925 || !gfc_is_constant_expr (dim)
1926 || !gfc_is_constant_expr (kind))
1927 return NULL;
1929 result = transformational_result (mask, dim,
1930 BT_INTEGER,
1931 get_kind (BT_INTEGER, kind, "COUNT",
1932 gfc_default_integer_kind),
1933 &mask->where);
1935 init_result_expr (result, 0, NULL);
1937 /* Passing MASK twice, once as data array, once as mask.
1938 Whenever gfc_count is called, '1' is added to the result. */
1939 return !dim || mask->rank == 1 ?
1940 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1941 simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL);
1945 gfc_expr *
1946 gfc_simplify_cshift (gfc_expr *array, gfc_expr *shift, gfc_expr *dim)
1948 gfc_expr *a, *result;
1949 int dm;
1951 /* DIM is only useful for rank > 1, but deal with it here as one can
1952 set DIM = 1 for rank = 1. */
1953 if (dim)
1955 if (!gfc_is_constant_expr (dim))
1956 return NULL;
1957 dm = mpz_get_si (dim->value.integer);
1959 else
1960 dm = 1;
1962 /* Copy array into 'a', simplify it, and then test for a constant array. */
1963 a = gfc_copy_expr (array);
1964 gfc_simplify_expr (a, 0);
1965 if (!is_constant_array_expr (a))
1967 gfc_free_expr (a);
1968 return NULL;
1971 if (a->rank == 1)
1973 gfc_constructor *ca, *cr;
1974 mpz_t size;
1975 int i, j, shft, sz;
1977 if (!gfc_is_constant_expr (shift))
1979 gfc_free_expr (a);
1980 return NULL;
1983 shft = mpz_get_si (shift->value.integer);
1985 /* Case (i): If ARRAY has rank one, element i of the result is
1986 ARRAY (1 + MODULO (i + SHIFT - 1, SIZE (ARRAY))). */
1988 mpz_init (size);
1989 gfc_array_size (a, &size);
1990 sz = mpz_get_si (size);
1991 mpz_clear (size);
1993 /* Adjust shft to deal with right or left shifts. */
1994 shft = shft < 0 ? 1 - shft : shft;
1996 /* Special case: Shift to the original order! */
1997 if (sz == 0 || shft % sz == 0)
1998 return a;
2000 result = gfc_copy_expr (a);
2001 cr = gfc_constructor_first (result->value.constructor);
2002 for (i = 0; i < sz; i++, cr = gfc_constructor_next (cr))
2004 j = (i + shft) % sz;
2005 ca = gfc_constructor_first (a->value.constructor);
2006 while (j-- > 0)
2007 ca = gfc_constructor_next (ca);
2008 cr->expr = gfc_copy_expr (ca->expr);
2011 gfc_free_expr (a);
2012 return result;
2014 else
2016 /* FIXME: Deal with rank > 1 arrays. For now, don't leak memory. */
2018 /* GCC bootstrap is too stupid to realize that the above code for dm
2019 is correct. First, dim can be specified for a rank 1 array. It is
2020 not needed in this nor used here. Second, the code is simply waiting
2021 for someone to implement rank > 1 simplification. For now, add a
2022 pessimization to the code that has a zero valid reason to be here. */
2023 if (dm > array->rank)
2024 gcc_unreachable ();
2026 gfc_free_expr (a);
2029 return NULL;
2033 gfc_expr *
2034 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
2036 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
2040 gfc_expr *
2041 gfc_simplify_dble (gfc_expr *e)
2043 gfc_expr *result = NULL;
2045 if (e->expr_type != EXPR_CONSTANT)
2046 return NULL;
2048 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
2049 return &gfc_bad_expr;
2051 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
2052 if (result == &gfc_bad_expr)
2053 return &gfc_bad_expr;
2055 return range_check (result, "DBLE");
2059 gfc_expr *
2060 gfc_simplify_digits (gfc_expr *x)
2062 int i, digits;
2064 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2066 switch (x->ts.type)
2068 case BT_INTEGER:
2069 digits = gfc_integer_kinds[i].digits;
2070 break;
2072 case BT_REAL:
2073 case BT_COMPLEX:
2074 digits = gfc_real_kinds[i].digits;
2075 break;
2077 default:
2078 gcc_unreachable ();
2081 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
2085 gfc_expr *
2086 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
2088 gfc_expr *result;
2089 int kind;
2091 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2092 return NULL;
2094 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
2095 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
2097 switch (x->ts.type)
2099 case BT_INTEGER:
2100 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
2101 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
2102 else
2103 mpz_set_ui (result->value.integer, 0);
2105 break;
2107 case BT_REAL:
2108 if (mpfr_cmp (x->value.real, y->value.real) > 0)
2109 mpfr_sub (result->value.real, x->value.real, y->value.real,
2110 GFC_RND_MODE);
2111 else
2112 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2114 break;
2116 default:
2117 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2120 return range_check (result, "DIM");
2124 gfc_expr*
2125 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
2128 gfc_expr temp;
2130 if (!is_constant_array_expr (vector_a)
2131 || !is_constant_array_expr (vector_b))
2132 return NULL;
2134 gcc_assert (vector_a->rank == 1);
2135 gcc_assert (vector_b->rank == 1);
2137 temp.expr_type = EXPR_OP;
2138 gfc_clear_ts (&temp.ts);
2139 temp.value.op.op = INTRINSIC_NONE;
2140 temp.value.op.op1 = vector_a;
2141 temp.value.op.op2 = vector_b;
2142 gfc_type_convert_binary (&temp, 1);
2144 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0, true);
2148 gfc_expr *
2149 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
2151 gfc_expr *a1, *a2, *result;
2153 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2154 return NULL;
2156 a1 = gfc_real2real (x, gfc_default_double_kind);
2157 a2 = gfc_real2real (y, gfc_default_double_kind);
2159 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
2160 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
2162 gfc_free_expr (a2);
2163 gfc_free_expr (a1);
2165 return range_check (result, "DPROD");
2169 static gfc_expr *
2170 simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg,
2171 bool right)
2173 gfc_expr *result;
2174 int i, k, size, shift;
2176 if (arg1->expr_type != EXPR_CONSTANT || arg2->expr_type != EXPR_CONSTANT
2177 || shiftarg->expr_type != EXPR_CONSTANT)
2178 return NULL;
2180 k = gfc_validate_kind (BT_INTEGER, arg1->ts.kind, false);
2181 size = gfc_integer_kinds[k].bit_size;
2183 gfc_extract_int (shiftarg, &shift);
2185 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2186 if (right)
2187 shift = size - shift;
2189 result = gfc_get_constant_expr (BT_INTEGER, arg1->ts.kind, &arg1->where);
2190 mpz_set_ui (result->value.integer, 0);
2192 for (i = 0; i < shift; i++)
2193 if (mpz_tstbit (arg2->value.integer, size - shift + i))
2194 mpz_setbit (result->value.integer, i);
2196 for (i = 0; i < size - shift; i++)
2197 if (mpz_tstbit (arg1->value.integer, i))
2198 mpz_setbit (result->value.integer, shift + i);
2200 /* Convert to a signed value. */
2201 gfc_convert_mpz_to_signed (result->value.integer, size);
2203 return result;
2207 gfc_expr *
2208 gfc_simplify_dshiftr (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
2210 return simplify_dshift (arg1, arg2, shiftarg, true);
2214 gfc_expr *
2215 gfc_simplify_dshiftl (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
2217 return simplify_dshift (arg1, arg2, shiftarg, false);
2221 gfc_expr *
2222 gfc_simplify_erf (gfc_expr *x)
2224 gfc_expr *result;
2226 if (x->expr_type != EXPR_CONSTANT)
2227 return NULL;
2229 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2230 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
2232 return range_check (result, "ERF");
2236 gfc_expr *
2237 gfc_simplify_erfc (gfc_expr *x)
2239 gfc_expr *result;
2241 if (x->expr_type != EXPR_CONSTANT)
2242 return NULL;
2244 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2245 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
2247 return range_check (result, "ERFC");
2251 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2253 #define MAX_ITER 200
2254 #define ARG_LIMIT 12
2256 /* Calculate ERFC_SCALED directly by its definition:
2258 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2260 using a large precision for intermediate results. This is used for all
2261 but large values of the argument. */
2262 static void
2263 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
2265 mp_prec_t prec;
2266 mpfr_t a, b;
2268 prec = mpfr_get_default_prec ();
2269 mpfr_set_default_prec (10 * prec);
2271 mpfr_init (a);
2272 mpfr_init (b);
2274 mpfr_set (a, arg, GFC_RND_MODE);
2275 mpfr_sqr (b, a, GFC_RND_MODE);
2276 mpfr_exp (b, b, GFC_RND_MODE);
2277 mpfr_erfc (a, a, GFC_RND_MODE);
2278 mpfr_mul (a, a, b, GFC_RND_MODE);
2280 mpfr_set (res, a, GFC_RND_MODE);
2281 mpfr_set_default_prec (prec);
2283 mpfr_clear (a);
2284 mpfr_clear (b);
2287 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2289 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2290 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2291 / (2 * x**2)**n)
2293 This is used for large values of the argument. Intermediate calculations
2294 are performed with twice the precision. We don't do a fixed number of
2295 iterations of the sum, but stop when it has converged to the required
2296 precision. */
2297 static void
2298 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
2300 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
2301 mpz_t num;
2302 mp_prec_t prec;
2303 unsigned i;
2305 prec = mpfr_get_default_prec ();
2306 mpfr_set_default_prec (2 * prec);
2308 mpfr_init (sum);
2309 mpfr_init (x);
2310 mpfr_init (u);
2311 mpfr_init (v);
2312 mpfr_init (w);
2313 mpz_init (num);
2315 mpfr_init (oldsum);
2316 mpfr_init (sumtrunc);
2317 mpfr_set_prec (oldsum, prec);
2318 mpfr_set_prec (sumtrunc, prec);
2320 mpfr_set (x, arg, GFC_RND_MODE);
2321 mpfr_set_ui (sum, 1, GFC_RND_MODE);
2322 mpz_set_ui (num, 1);
2324 mpfr_set (u, x, GFC_RND_MODE);
2325 mpfr_sqr (u, u, GFC_RND_MODE);
2326 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
2327 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
2329 for (i = 1; i < MAX_ITER; i++)
2331 mpfr_set (oldsum, sum, GFC_RND_MODE);
2333 mpz_mul_ui (num, num, 2 * i - 1);
2334 mpz_neg (num, num);
2336 mpfr_set (w, u, GFC_RND_MODE);
2337 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
2339 mpfr_set_z (v, num, GFC_RND_MODE);
2340 mpfr_mul (v, v, w, GFC_RND_MODE);
2342 mpfr_add (sum, sum, v, GFC_RND_MODE);
2344 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
2345 if (mpfr_cmp (sumtrunc, oldsum) == 0)
2346 break;
2349 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2350 set too low. */
2351 gcc_assert (i < MAX_ITER);
2353 /* Divide by x * sqrt(Pi). */
2354 mpfr_const_pi (u, GFC_RND_MODE);
2355 mpfr_sqrt (u, u, GFC_RND_MODE);
2356 mpfr_mul (u, u, x, GFC_RND_MODE);
2357 mpfr_div (sum, sum, u, GFC_RND_MODE);
2359 mpfr_set (res, sum, GFC_RND_MODE);
2360 mpfr_set_default_prec (prec);
2362 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
2363 mpz_clear (num);
2367 gfc_expr *
2368 gfc_simplify_erfc_scaled (gfc_expr *x)
2370 gfc_expr *result;
2372 if (x->expr_type != EXPR_CONSTANT)
2373 return NULL;
2375 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2376 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
2377 asympt_erfc_scaled (result->value.real, x->value.real);
2378 else
2379 fullprec_erfc_scaled (result->value.real, x->value.real);
2381 return range_check (result, "ERFC_SCALED");
2384 #undef MAX_ITER
2385 #undef ARG_LIMIT
2388 gfc_expr *
2389 gfc_simplify_epsilon (gfc_expr *e)
2391 gfc_expr *result;
2392 int i;
2394 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2396 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
2397 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
2399 return range_check (result, "EPSILON");
2403 gfc_expr *
2404 gfc_simplify_exp (gfc_expr *x)
2406 gfc_expr *result;
2408 if (x->expr_type != EXPR_CONSTANT)
2409 return NULL;
2411 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2413 switch (x->ts.type)
2415 case BT_REAL:
2416 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2417 break;
2419 case BT_COMPLEX:
2420 gfc_set_model_kind (x->ts.kind);
2421 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2422 break;
2424 default:
2425 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2428 return range_check (result, "EXP");
2432 gfc_expr *
2433 gfc_simplify_exponent (gfc_expr *x)
2435 long int val;
2436 gfc_expr *result;
2438 if (x->expr_type != EXPR_CONSTANT)
2439 return NULL;
2441 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2442 &x->where);
2444 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2445 if (mpfr_inf_p (x->value.real) || mpfr_nan_p (x->value.real))
2447 int i = gfc_validate_kind (BT_INTEGER, gfc_default_integer_kind, false);
2448 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2449 return result;
2452 /* EXPONENT(+/- 0.0) = 0 */
2453 if (mpfr_zero_p (x->value.real))
2455 mpz_set_ui (result->value.integer, 0);
2456 return result;
2459 gfc_set_model (x->value.real);
2461 val = (long int) mpfr_get_exp (x->value.real);
2462 mpz_set_si (result->value.integer, val);
2464 return range_check (result, "EXPONENT");
2468 gfc_expr *
2469 gfc_simplify_float (gfc_expr *a)
2471 gfc_expr *result;
2473 if (a->expr_type != EXPR_CONSTANT)
2474 return NULL;
2476 if (a->is_boz)
2478 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2479 return &gfc_bad_expr;
2481 result = gfc_copy_expr (a);
2483 else
2484 result = gfc_int2real (a, gfc_default_real_kind);
2486 return range_check (result, "FLOAT");
2490 static bool
2491 is_last_ref_vtab (gfc_expr *e)
2493 gfc_ref *ref;
2494 gfc_component *comp = NULL;
2496 if (e->expr_type != EXPR_VARIABLE)
2497 return false;
2499 for (ref = e->ref; ref; ref = ref->next)
2500 if (ref->type == REF_COMPONENT)
2501 comp = ref->u.c.component;
2503 if (!e->ref || !comp)
2504 return e->symtree->n.sym->attr.vtab;
2506 if (comp->name[0] == '_' && strcmp (comp->name, "_vptr") == 0)
2507 return true;
2509 return false;
2513 gfc_expr *
2514 gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold)
2516 /* Avoid simplification of resolved symbols. */
2517 if (is_last_ref_vtab (a) || is_last_ref_vtab (mold))
2518 return NULL;
2520 if (a->ts.type == BT_DERIVED && mold->ts.type == BT_DERIVED)
2521 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2522 gfc_type_is_extension_of (mold->ts.u.derived,
2523 a->ts.u.derived));
2525 if (UNLIMITED_POLY (a) || UNLIMITED_POLY (mold))
2526 return NULL;
2528 /* Return .false. if the dynamic type can never be an extension. */
2529 if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS
2530 && !gfc_type_is_extension_of
2531 (mold->ts.u.derived->components->ts.u.derived,
2532 a->ts.u.derived->components->ts.u.derived)
2533 && !gfc_type_is_extension_of
2534 (a->ts.u.derived->components->ts.u.derived,
2535 mold->ts.u.derived->components->ts.u.derived))
2536 || (a->ts.type == BT_DERIVED && mold->ts.type == BT_CLASS
2537 && !gfc_type_is_extension_of
2538 (mold->ts.u.derived->components->ts.u.derived,
2539 a->ts.u.derived))
2540 || (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
2541 && !gfc_type_is_extension_of
2542 (mold->ts.u.derived,
2543 a->ts.u.derived->components->ts.u.derived)
2544 && !gfc_type_is_extension_of
2545 (a->ts.u.derived->components->ts.u.derived,
2546 mold->ts.u.derived)))
2547 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2549 /* Return .true. if the dynamic type is guaranteed to be an extension. */
2550 if (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
2551 && gfc_type_is_extension_of (mold->ts.u.derived,
2552 a->ts.u.derived->components->ts.u.derived))
2553 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, true);
2555 return NULL;
2559 gfc_expr *
2560 gfc_simplify_same_type_as (gfc_expr *a, gfc_expr *b)
2562 /* Avoid simplification of resolved symbols. */
2563 if (is_last_ref_vtab (a) || is_last_ref_vtab (b))
2564 return NULL;
2566 /* Return .false. if the dynamic type can never be the
2567 same. */
2568 if (((a->ts.type == BT_CLASS && gfc_expr_attr (a).class_ok)
2569 || (b->ts.type == BT_CLASS && gfc_expr_attr (b).class_ok))
2570 && !gfc_type_compatible (&a->ts, &b->ts)
2571 && !gfc_type_compatible (&b->ts, &a->ts))
2572 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2574 if (a->ts.type != BT_DERIVED || b->ts.type != BT_DERIVED)
2575 return NULL;
2577 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2578 gfc_compare_derived_types (a->ts.u.derived,
2579 b->ts.u.derived));
2583 gfc_expr *
2584 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
2586 gfc_expr *result;
2587 mpfr_t floor;
2588 int kind;
2590 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
2591 if (kind == -1)
2592 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2594 if (e->expr_type != EXPR_CONSTANT)
2595 return NULL;
2597 mpfr_init2 (floor, mpfr_get_prec (e->value.real));
2598 mpfr_floor (floor, e->value.real);
2600 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
2601 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2603 mpfr_clear (floor);
2605 return range_check (result, "FLOOR");
2609 gfc_expr *
2610 gfc_simplify_fraction (gfc_expr *x)
2612 gfc_expr *result;
2614 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2615 mpfr_t absv, exp, pow2;
2616 #else
2617 mpfr_exp_t e;
2618 #endif
2620 if (x->expr_type != EXPR_CONSTANT)
2621 return NULL;
2623 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
2625 /* FRACTION(inf) = NaN. */
2626 if (mpfr_inf_p (x->value.real))
2628 mpfr_set_nan (result->value.real);
2629 return result;
2632 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2634 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
2635 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
2637 if (mpfr_sgn (x->value.real) == 0)
2639 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
2640 return result;
2643 gfc_set_model_kind (x->ts.kind);
2644 mpfr_init (exp);
2645 mpfr_init (absv);
2646 mpfr_init (pow2);
2648 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2649 mpfr_log2 (exp, absv, GFC_RND_MODE);
2651 mpfr_trunc (exp, exp);
2652 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2654 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2656 mpfr_div (result->value.real, x->value.real, pow2, GFC_RND_MODE);
2658 mpfr_clears (exp, absv, pow2, NULL);
2660 #else
2662 /* mpfr_frexp() correctly handles zeros and NaNs. */
2663 mpfr_frexp (&e, result->value.real, x->value.real, GFC_RND_MODE);
2665 #endif
2667 return range_check (result, "FRACTION");
2671 gfc_expr *
2672 gfc_simplify_gamma (gfc_expr *x)
2674 gfc_expr *result;
2676 if (x->expr_type != EXPR_CONSTANT)
2677 return NULL;
2679 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2680 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2682 return range_check (result, "GAMMA");
2686 gfc_expr *
2687 gfc_simplify_huge (gfc_expr *e)
2689 gfc_expr *result;
2690 int i;
2692 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2693 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2695 switch (e->ts.type)
2697 case BT_INTEGER:
2698 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2699 break;
2701 case BT_REAL:
2702 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2703 break;
2705 default:
2706 gcc_unreachable ();
2709 return result;
2713 gfc_expr *
2714 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2716 gfc_expr *result;
2718 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2719 return NULL;
2721 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2722 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2723 return range_check (result, "HYPOT");
2727 /* We use the processor's collating sequence, because all
2728 systems that gfortran currently works on are ASCII. */
2730 gfc_expr *
2731 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2733 gfc_expr *result;
2734 gfc_char_t index;
2735 int k;
2737 if (e->expr_type != EXPR_CONSTANT)
2738 return NULL;
2740 if (e->value.character.length != 1)
2742 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2743 return &gfc_bad_expr;
2746 index = e->value.character.string[0];
2748 if (warn_surprising && index > 127)
2749 gfc_warning (OPT_Wsurprising,
2750 "Argument of IACHAR function at %L outside of range 0..127",
2751 &e->where);
2753 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
2754 if (k == -1)
2755 return &gfc_bad_expr;
2757 result = gfc_get_int_expr (k, &e->where, index);
2759 return range_check (result, "IACHAR");
2763 static gfc_expr *
2764 do_bit_and (gfc_expr *result, gfc_expr *e)
2766 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2767 gcc_assert (result->ts.type == BT_INTEGER
2768 && result->expr_type == EXPR_CONSTANT);
2770 mpz_and (result->value.integer, result->value.integer, e->value.integer);
2771 return result;
2775 gfc_expr *
2776 gfc_simplify_iall (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2778 return simplify_transformation (array, dim, mask, -1, do_bit_and);
2782 static gfc_expr *
2783 do_bit_ior (gfc_expr *result, gfc_expr *e)
2785 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2786 gcc_assert (result->ts.type == BT_INTEGER
2787 && result->expr_type == EXPR_CONSTANT);
2789 mpz_ior (result->value.integer, result->value.integer, e->value.integer);
2790 return result;
2794 gfc_expr *
2795 gfc_simplify_iany (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2797 return simplify_transformation (array, dim, mask, 0, do_bit_ior);
2801 gfc_expr *
2802 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2804 gfc_expr *result;
2806 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2807 return NULL;
2809 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2810 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2812 return range_check (result, "IAND");
2816 gfc_expr *
2817 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2819 gfc_expr *result;
2820 int k, pos;
2822 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2823 return NULL;
2825 gfc_extract_int (y, &pos);
2827 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2829 result = gfc_copy_expr (x);
2831 convert_mpz_to_unsigned (result->value.integer,
2832 gfc_integer_kinds[k].bit_size);
2834 mpz_clrbit (result->value.integer, pos);
2836 gfc_convert_mpz_to_signed (result->value.integer,
2837 gfc_integer_kinds[k].bit_size);
2839 return result;
2843 gfc_expr *
2844 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2846 gfc_expr *result;
2847 int pos, len;
2848 int i, k, bitsize;
2849 int *bits;
2851 if (x->expr_type != EXPR_CONSTANT
2852 || y->expr_type != EXPR_CONSTANT
2853 || z->expr_type != EXPR_CONSTANT)
2854 return NULL;
2856 gfc_extract_int (y, &pos);
2857 gfc_extract_int (z, &len);
2859 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2861 bitsize = gfc_integer_kinds[k].bit_size;
2863 if (pos + len > bitsize)
2865 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2866 "bit size at %L", &y->where);
2867 return &gfc_bad_expr;
2870 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2871 convert_mpz_to_unsigned (result->value.integer,
2872 gfc_integer_kinds[k].bit_size);
2874 bits = XCNEWVEC (int, bitsize);
2876 for (i = 0; i < bitsize; i++)
2877 bits[i] = 0;
2879 for (i = 0; i < len; i++)
2880 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2882 for (i = 0; i < bitsize; i++)
2884 if (bits[i] == 0)
2885 mpz_clrbit (result->value.integer, i);
2886 else if (bits[i] == 1)
2887 mpz_setbit (result->value.integer, i);
2888 else
2889 gfc_internal_error ("IBITS: Bad bit");
2892 free (bits);
2894 gfc_convert_mpz_to_signed (result->value.integer,
2895 gfc_integer_kinds[k].bit_size);
2897 return result;
2901 gfc_expr *
2902 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2904 gfc_expr *result;
2905 int k, pos;
2907 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2908 return NULL;
2910 gfc_extract_int (y, &pos);
2912 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2914 result = gfc_copy_expr (x);
2916 convert_mpz_to_unsigned (result->value.integer,
2917 gfc_integer_kinds[k].bit_size);
2919 mpz_setbit (result->value.integer, pos);
2921 gfc_convert_mpz_to_signed (result->value.integer,
2922 gfc_integer_kinds[k].bit_size);
2924 return result;
2928 gfc_expr *
2929 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2931 gfc_expr *result;
2932 gfc_char_t index;
2933 int k;
2935 if (e->expr_type != EXPR_CONSTANT)
2936 return NULL;
2938 if (e->value.character.length != 1)
2940 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2941 return &gfc_bad_expr;
2944 index = e->value.character.string[0];
2946 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
2947 if (k == -1)
2948 return &gfc_bad_expr;
2950 result = gfc_get_int_expr (k, &e->where, index);
2952 return range_check (result, "ICHAR");
2956 gfc_expr *
2957 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2959 gfc_expr *result;
2961 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2962 return NULL;
2964 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2965 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2967 return range_check (result, "IEOR");
2971 gfc_expr *
2972 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2974 gfc_expr *result;
2975 int back, len, lensub;
2976 int i, j, k, count, index = 0, start;
2978 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2979 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2980 return NULL;
2982 if (b != NULL && b->value.logical != 0)
2983 back = 1;
2984 else
2985 back = 0;
2987 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2988 if (k == -1)
2989 return &gfc_bad_expr;
2991 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
2993 len = x->value.character.length;
2994 lensub = y->value.character.length;
2996 if (len < lensub)
2998 mpz_set_si (result->value.integer, 0);
2999 return result;
3002 if (back == 0)
3004 if (lensub == 0)
3006 mpz_set_si (result->value.integer, 1);
3007 return result;
3009 else if (lensub == 1)
3011 for (i = 0; i < len; i++)
3013 for (j = 0; j < lensub; j++)
3015 if (y->value.character.string[j]
3016 == x->value.character.string[i])
3018 index = i + 1;
3019 goto done;
3024 else
3026 for (i = 0; i < len; i++)
3028 for (j = 0; j < lensub; j++)
3030 if (y->value.character.string[j]
3031 == x->value.character.string[i])
3033 start = i;
3034 count = 0;
3036 for (k = 0; k < lensub; k++)
3038 if (y->value.character.string[k]
3039 == x->value.character.string[k + start])
3040 count++;
3043 if (count == lensub)
3045 index = start + 1;
3046 goto done;
3054 else
3056 if (lensub == 0)
3058 mpz_set_si (result->value.integer, len + 1);
3059 return result;
3061 else if (lensub == 1)
3063 for (i = 0; i < len; i++)
3065 for (j = 0; j < lensub; j++)
3067 if (y->value.character.string[j]
3068 == x->value.character.string[len - i])
3070 index = len - i + 1;
3071 goto done;
3076 else
3078 for (i = 0; i < len; i++)
3080 for (j = 0; j < lensub; j++)
3082 if (y->value.character.string[j]
3083 == x->value.character.string[len - i])
3085 start = len - i;
3086 if (start <= len - lensub)
3088 count = 0;
3089 for (k = 0; k < lensub; k++)
3090 if (y->value.character.string[k]
3091 == x->value.character.string[k + start])
3092 count++;
3094 if (count == lensub)
3096 index = start + 1;
3097 goto done;
3100 else
3102 continue;
3110 done:
3111 mpz_set_si (result->value.integer, index);
3112 return range_check (result, "INDEX");
3116 static gfc_expr *
3117 simplify_intconv (gfc_expr *e, int kind, const char *name)
3119 gfc_expr *result = NULL;
3121 if (e->expr_type != EXPR_CONSTANT)
3122 return NULL;
3124 result = gfc_convert_constant (e, BT_INTEGER, kind);
3125 if (result == &gfc_bad_expr)
3126 return &gfc_bad_expr;
3128 return range_check (result, name);
3132 gfc_expr *
3133 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
3135 int kind;
3137 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
3138 if (kind == -1)
3139 return &gfc_bad_expr;
3141 return simplify_intconv (e, kind, "INT");
3144 gfc_expr *
3145 gfc_simplify_int2 (gfc_expr *e)
3147 return simplify_intconv (e, 2, "INT2");
3151 gfc_expr *
3152 gfc_simplify_int8 (gfc_expr *e)
3154 return simplify_intconv (e, 8, "INT8");
3158 gfc_expr *
3159 gfc_simplify_long (gfc_expr *e)
3161 return simplify_intconv (e, 4, "LONG");
3165 gfc_expr *
3166 gfc_simplify_ifix (gfc_expr *e)
3168 gfc_expr *rtrunc, *result;
3170 if (e->expr_type != EXPR_CONSTANT)
3171 return NULL;
3173 rtrunc = gfc_copy_expr (e);
3174 mpfr_trunc (rtrunc->value.real, e->value.real);
3176 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
3177 &e->where);
3178 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
3180 gfc_free_expr (rtrunc);
3182 return range_check (result, "IFIX");
3186 gfc_expr *
3187 gfc_simplify_idint (gfc_expr *e)
3189 gfc_expr *rtrunc, *result;
3191 if (e->expr_type != EXPR_CONSTANT)
3192 return NULL;
3194 rtrunc = gfc_copy_expr (e);
3195 mpfr_trunc (rtrunc->value.real, e->value.real);
3197 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
3198 &e->where);
3199 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
3201 gfc_free_expr (rtrunc);
3203 return range_check (result, "IDINT");
3207 gfc_expr *
3208 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
3210 gfc_expr *result;
3212 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3213 return NULL;
3215 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
3216 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
3218 return range_check (result, "IOR");
3222 static gfc_expr *
3223 do_bit_xor (gfc_expr *result, gfc_expr *e)
3225 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
3226 gcc_assert (result->ts.type == BT_INTEGER
3227 && result->expr_type == EXPR_CONSTANT);
3229 mpz_xor (result->value.integer, result->value.integer, e->value.integer);
3230 return result;
3234 gfc_expr *
3235 gfc_simplify_iparity (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
3237 return simplify_transformation (array, dim, mask, 0, do_bit_xor);
3241 gfc_expr *
3242 gfc_simplify_is_iostat_end (gfc_expr *x)
3244 if (x->expr_type != EXPR_CONSTANT)
3245 return NULL;
3247 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3248 mpz_cmp_si (x->value.integer,
3249 LIBERROR_END) == 0);
3253 gfc_expr *
3254 gfc_simplify_is_iostat_eor (gfc_expr *x)
3256 if (x->expr_type != EXPR_CONSTANT)
3257 return NULL;
3259 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3260 mpz_cmp_si (x->value.integer,
3261 LIBERROR_EOR) == 0);
3265 gfc_expr *
3266 gfc_simplify_isnan (gfc_expr *x)
3268 if (x->expr_type != EXPR_CONSTANT)
3269 return NULL;
3271 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3272 mpfr_nan_p (x->value.real));
3276 /* Performs a shift on its first argument. Depending on the last
3277 argument, the shift can be arithmetic, i.e. with filling from the
3278 left like in the SHIFTA intrinsic. */
3279 static gfc_expr *
3280 simplify_shift (gfc_expr *e, gfc_expr *s, const char *name,
3281 bool arithmetic, int direction)
3283 gfc_expr *result;
3284 int ashift, *bits, i, k, bitsize, shift;
3286 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3287 return NULL;
3289 gfc_extract_int (s, &shift);
3291 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
3292 bitsize = gfc_integer_kinds[k].bit_size;
3294 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3296 if (shift == 0)
3298 mpz_set (result->value.integer, e->value.integer);
3299 return result;
3302 if (direction > 0 && shift < 0)
3304 /* Left shift, as in SHIFTL. */
3305 gfc_error ("Second argument of %s is negative at %L", name, &e->where);
3306 return &gfc_bad_expr;
3308 else if (direction < 0)
3310 /* Right shift, as in SHIFTR or SHIFTA. */
3311 if (shift < 0)
3313 gfc_error ("Second argument of %s is negative at %L",
3314 name, &e->where);
3315 return &gfc_bad_expr;
3318 shift = -shift;
3321 ashift = (shift >= 0 ? shift : -shift);
3323 if (ashift > bitsize)
3325 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3326 "at %L", name, &e->where);
3327 return &gfc_bad_expr;
3330 bits = XCNEWVEC (int, bitsize);
3332 for (i = 0; i < bitsize; i++)
3333 bits[i] = mpz_tstbit (e->value.integer, i);
3335 if (shift > 0)
3337 /* Left shift. */
3338 for (i = 0; i < shift; i++)
3339 mpz_clrbit (result->value.integer, i);
3341 for (i = 0; i < bitsize - shift; i++)
3343 if (bits[i] == 0)
3344 mpz_clrbit (result->value.integer, i + shift);
3345 else
3346 mpz_setbit (result->value.integer, i + shift);
3349 else
3351 /* Right shift. */
3352 if (arithmetic && bits[bitsize - 1])
3353 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3354 mpz_setbit (result->value.integer, i);
3355 else
3356 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3357 mpz_clrbit (result->value.integer, i);
3359 for (i = bitsize - 1; i >= ashift; i--)
3361 if (bits[i] == 0)
3362 mpz_clrbit (result->value.integer, i - ashift);
3363 else
3364 mpz_setbit (result->value.integer, i - ashift);
3368 gfc_convert_mpz_to_signed (result->value.integer, bitsize);
3369 free (bits);
3371 return result;
3375 gfc_expr *
3376 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
3378 return simplify_shift (e, s, "ISHFT", false, 0);
3382 gfc_expr *
3383 gfc_simplify_lshift (gfc_expr *e, gfc_expr *s)
3385 return simplify_shift (e, s, "LSHIFT", false, 1);
3389 gfc_expr *
3390 gfc_simplify_rshift (gfc_expr *e, gfc_expr *s)
3392 return simplify_shift (e, s, "RSHIFT", true, -1);
3396 gfc_expr *
3397 gfc_simplify_shifta (gfc_expr *e, gfc_expr *s)
3399 return simplify_shift (e, s, "SHIFTA", true, -1);
3403 gfc_expr *
3404 gfc_simplify_shiftl (gfc_expr *e, gfc_expr *s)
3406 return simplify_shift (e, s, "SHIFTL", false, 1);
3410 gfc_expr *
3411 gfc_simplify_shiftr (gfc_expr *e, gfc_expr *s)
3413 return simplify_shift (e, s, "SHIFTR", false, -1);
3417 gfc_expr *
3418 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
3420 gfc_expr *result;
3421 int shift, ashift, isize, ssize, delta, k;
3422 int i, *bits;
3424 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3425 return NULL;
3427 gfc_extract_int (s, &shift);
3429 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3430 isize = gfc_integer_kinds[k].bit_size;
3432 if (sz != NULL)
3434 if (sz->expr_type != EXPR_CONSTANT)
3435 return NULL;
3437 gfc_extract_int (sz, &ssize);
3439 else
3440 ssize = isize;
3442 if (shift >= 0)
3443 ashift = shift;
3444 else
3445 ashift = -shift;
3447 if (ashift > ssize)
3449 if (sz == NULL)
3450 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3451 "BIT_SIZE of first argument at %C");
3452 else
3453 gfc_error ("Absolute value of SHIFT shall be less than or equal "
3454 "to SIZE at %C");
3455 return &gfc_bad_expr;
3458 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3460 mpz_set (result->value.integer, e->value.integer);
3462 if (shift == 0)
3463 return result;
3465 convert_mpz_to_unsigned (result->value.integer, isize);
3467 bits = XCNEWVEC (int, ssize);
3469 for (i = 0; i < ssize; i++)
3470 bits[i] = mpz_tstbit (e->value.integer, i);
3472 delta = ssize - ashift;
3474 if (shift > 0)
3476 for (i = 0; i < delta; i++)
3478 if (bits[i] == 0)
3479 mpz_clrbit (result->value.integer, i + shift);
3480 else
3481 mpz_setbit (result->value.integer, i + shift);
3484 for (i = delta; i < ssize; i++)
3486 if (bits[i] == 0)
3487 mpz_clrbit (result->value.integer, i - delta);
3488 else
3489 mpz_setbit (result->value.integer, i - delta);
3492 else
3494 for (i = 0; i < ashift; i++)
3496 if (bits[i] == 0)
3497 mpz_clrbit (result->value.integer, i + delta);
3498 else
3499 mpz_setbit (result->value.integer, i + delta);
3502 for (i = ashift; i < ssize; i++)
3504 if (bits[i] == 0)
3505 mpz_clrbit (result->value.integer, i + shift);
3506 else
3507 mpz_setbit (result->value.integer, i + shift);
3511 gfc_convert_mpz_to_signed (result->value.integer, isize);
3513 free (bits);
3514 return result;
3518 gfc_expr *
3519 gfc_simplify_kind (gfc_expr *e)
3521 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
3525 static gfc_expr *
3526 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
3527 gfc_array_spec *as, gfc_ref *ref, bool coarray)
3529 gfc_expr *l, *u, *result;
3530 int k;
3532 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3533 gfc_default_integer_kind);
3534 if (k == -1)
3535 return &gfc_bad_expr;
3537 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3539 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3540 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3541 if (!coarray && array->expr_type != EXPR_VARIABLE)
3543 if (upper)
3545 gfc_expr* dim = result;
3546 mpz_set_si (dim->value.integer, d);
3548 result = simplify_size (array, dim, k);
3549 gfc_free_expr (dim);
3550 if (!result)
3551 goto returnNull;
3553 else
3554 mpz_set_si (result->value.integer, 1);
3556 goto done;
3559 /* Otherwise, we have a variable expression. */
3560 gcc_assert (array->expr_type == EXPR_VARIABLE);
3561 gcc_assert (as);
3563 if (!gfc_resolve_array_spec (as, 0))
3564 return NULL;
3566 /* The last dimension of an assumed-size array is special. */
3567 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
3568 || (coarray && d == as->rank + as->corank
3569 && (!upper || flag_coarray == GFC_FCOARRAY_SINGLE)))
3571 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
3573 gfc_free_expr (result);
3574 return gfc_copy_expr (as->lower[d-1]);
3577 goto returnNull;
3580 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3582 /* Then, we need to know the extent of the given dimension. */
3583 if (coarray || (ref->u.ar.type == AR_FULL && !ref->next))
3585 gfc_expr *declared_bound;
3586 int empty_bound;
3587 bool constant_lbound, constant_ubound;
3589 l = as->lower[d-1];
3590 u = as->upper[d-1];
3592 gcc_assert (l != NULL);
3594 constant_lbound = l->expr_type == EXPR_CONSTANT;
3595 constant_ubound = u && u->expr_type == EXPR_CONSTANT;
3597 empty_bound = upper ? 0 : 1;
3598 declared_bound = upper ? u : l;
3600 if ((!upper && !constant_lbound)
3601 || (upper && !constant_ubound))
3602 goto returnNull;
3604 if (!coarray)
3606 /* For {L,U}BOUND, the value depends on whether the array
3607 is empty. We can nevertheless simplify if the declared bound
3608 has the same value as that of an empty array, in which case
3609 the result isn't dependent on the array emptyness. */
3610 if (mpz_cmp_si (declared_bound->value.integer, empty_bound) == 0)
3611 mpz_set_si (result->value.integer, empty_bound);
3612 else if (!constant_lbound || !constant_ubound)
3613 /* Array emptyness can't be determined, we can't simplify. */
3614 goto returnNull;
3615 else if (mpz_cmp (l->value.integer, u->value.integer) > 0)
3616 mpz_set_si (result->value.integer, empty_bound);
3617 else
3618 mpz_set (result->value.integer, declared_bound->value.integer);
3620 else
3621 mpz_set (result->value.integer, declared_bound->value.integer);
3623 else
3625 if (upper)
3627 if (!gfc_ref_dimen_size (&ref->u.ar, d - 1, &result->value.integer, NULL))
3628 goto returnNull;
3630 else
3631 mpz_set_si (result->value.integer, (long int) 1);
3634 done:
3635 return range_check (result, upper ? "UBOUND" : "LBOUND");
3637 returnNull:
3638 gfc_free_expr (result);
3639 return NULL;
3643 static gfc_expr *
3644 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3646 gfc_ref *ref;
3647 gfc_array_spec *as;
3648 int d;
3650 if (array->ts.type == BT_CLASS)
3651 return NULL;
3653 if (array->expr_type != EXPR_VARIABLE)
3655 as = NULL;
3656 ref = NULL;
3657 goto done;
3660 /* Follow any component references. */
3661 as = array->symtree->n.sym->as;
3662 for (ref = array->ref; ref; ref = ref->next)
3664 switch (ref->type)
3666 case REF_ARRAY:
3667 switch (ref->u.ar.type)
3669 case AR_ELEMENT:
3670 as = NULL;
3671 continue;
3673 case AR_FULL:
3674 /* We're done because 'as' has already been set in the
3675 previous iteration. */
3676 goto done;
3678 case AR_UNKNOWN:
3679 return NULL;
3681 case AR_SECTION:
3682 as = ref->u.ar.as;
3683 goto done;
3686 gcc_unreachable ();
3688 case REF_COMPONENT:
3689 as = ref->u.c.component->as;
3690 continue;
3692 case REF_SUBSTRING:
3693 continue;
3697 gcc_unreachable ();
3699 done:
3701 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_RANK
3702 || (as->type == AS_ASSUMED_SHAPE && upper)))
3703 return NULL;
3705 gcc_assert (!as
3706 || (as->type != AS_DEFERRED
3707 && array->expr_type == EXPR_VARIABLE
3708 && !gfc_expr_attr (array).allocatable
3709 && !gfc_expr_attr (array).pointer));
3711 if (dim == NULL)
3713 /* Multi-dimensional bounds. */
3714 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3715 gfc_expr *e;
3716 int k;
3718 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3719 if (upper && as && as->type == AS_ASSUMED_SIZE)
3721 /* An error message will be emitted in
3722 check_assumed_size_reference (resolve.c). */
3723 return &gfc_bad_expr;
3726 /* Simplify the bounds for each dimension. */
3727 for (d = 0; d < array->rank; d++)
3729 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
3730 false);
3731 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3733 int j;
3735 for (j = 0; j < d; j++)
3736 gfc_free_expr (bounds[j]);
3737 return bounds[d];
3741 /* Allocate the result expression. */
3742 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3743 gfc_default_integer_kind);
3744 if (k == -1)
3745 return &gfc_bad_expr;
3747 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
3749 /* The result is a rank 1 array; its size is the rank of the first
3750 argument to {L,U}BOUND. */
3751 e->rank = 1;
3752 e->shape = gfc_get_shape (1);
3753 mpz_init_set_ui (e->shape[0], array->rank);
3755 /* Create the constructor for this array. */
3756 for (d = 0; d < array->rank; d++)
3757 gfc_constructor_append_expr (&e->value.constructor,
3758 bounds[d], &e->where);
3760 return e;
3762 else
3764 /* A DIM argument is specified. */
3765 if (dim->expr_type != EXPR_CONSTANT)
3766 return NULL;
3768 d = mpz_get_si (dim->value.integer);
3770 if ((d < 1 || d > array->rank)
3771 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
3773 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3774 return &gfc_bad_expr;
3777 if (as && as->type == AS_ASSUMED_RANK)
3778 return NULL;
3780 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3785 static gfc_expr *
3786 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3788 gfc_ref *ref;
3789 gfc_array_spec *as;
3790 int d;
3792 if (array->expr_type != EXPR_VARIABLE)
3793 return NULL;
3795 /* Follow any component references. */
3796 as = (array->ts.type == BT_CLASS && array->ts.u.derived->components)
3797 ? array->ts.u.derived->components->as
3798 : array->symtree->n.sym->as;
3799 for (ref = array->ref; ref; ref = ref->next)
3801 switch (ref->type)
3803 case REF_ARRAY:
3804 switch (ref->u.ar.type)
3806 case AR_ELEMENT:
3807 if (ref->u.ar.as->corank > 0)
3809 gcc_assert (as == ref->u.ar.as);
3810 goto done;
3812 as = NULL;
3813 continue;
3815 case AR_FULL:
3816 /* We're done because 'as' has already been set in the
3817 previous iteration. */
3818 goto done;
3820 case AR_UNKNOWN:
3821 return NULL;
3823 case AR_SECTION:
3824 as = ref->u.ar.as;
3825 goto done;
3828 gcc_unreachable ();
3830 case REF_COMPONENT:
3831 as = ref->u.c.component->as;
3832 continue;
3834 case REF_SUBSTRING:
3835 continue;
3839 if (!as)
3840 gcc_unreachable ();
3842 done:
3844 if (as->cotype == AS_DEFERRED || as->cotype == AS_ASSUMED_SHAPE)
3845 return NULL;
3847 if (dim == NULL)
3849 /* Multi-dimensional cobounds. */
3850 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3851 gfc_expr *e;
3852 int k;
3854 /* Simplify the cobounds for each dimension. */
3855 for (d = 0; d < as->corank; d++)
3857 bounds[d] = simplify_bound_dim (array, kind, d + 1 + as->rank,
3858 upper, as, ref, true);
3859 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3861 int j;
3863 for (j = 0; j < d; j++)
3864 gfc_free_expr (bounds[j]);
3865 return bounds[d];
3869 /* Allocate the result expression. */
3870 e = gfc_get_expr ();
3871 e->where = array->where;
3872 e->expr_type = EXPR_ARRAY;
3873 e->ts.type = BT_INTEGER;
3874 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3875 gfc_default_integer_kind);
3876 if (k == -1)
3878 gfc_free_expr (e);
3879 return &gfc_bad_expr;
3881 e->ts.kind = k;
3883 /* The result is a rank 1 array; its size is the rank of the first
3884 argument to {L,U}COBOUND. */
3885 e->rank = 1;
3886 e->shape = gfc_get_shape (1);
3887 mpz_init_set_ui (e->shape[0], as->corank);
3889 /* Create the constructor for this array. */
3890 for (d = 0; d < as->corank; d++)
3891 gfc_constructor_append_expr (&e->value.constructor,
3892 bounds[d], &e->where);
3893 return e;
3895 else
3897 /* A DIM argument is specified. */
3898 if (dim->expr_type != EXPR_CONSTANT)
3899 return NULL;
3901 d = mpz_get_si (dim->value.integer);
3903 if (d < 1 || d > as->corank)
3905 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3906 return &gfc_bad_expr;
3909 return simplify_bound_dim (array, kind, d+as->rank, upper, as, ref, true);
3914 gfc_expr *
3915 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3917 return simplify_bound (array, dim, kind, 0);
3921 gfc_expr *
3922 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3924 return simplify_cobound (array, dim, kind, 0);
3927 gfc_expr *
3928 gfc_simplify_leadz (gfc_expr *e)
3930 unsigned long lz, bs;
3931 int i;
3933 if (e->expr_type != EXPR_CONSTANT)
3934 return NULL;
3936 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3937 bs = gfc_integer_kinds[i].bit_size;
3938 if (mpz_cmp_si (e->value.integer, 0) == 0)
3939 lz = bs;
3940 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3941 lz = 0;
3942 else
3943 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3945 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3949 gfc_expr *
3950 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3952 gfc_expr *result;
3953 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3955 if (k == -1)
3956 return &gfc_bad_expr;
3958 if (e->expr_type == EXPR_CONSTANT)
3960 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3961 mpz_set_si (result->value.integer, e->value.character.length);
3962 return range_check (result, "LEN");
3964 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3965 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3966 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3968 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3969 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3970 return range_check (result, "LEN");
3972 else if (e->expr_type == EXPR_VARIABLE && e->ts.type == BT_CHARACTER
3973 && e->symtree->n.sym
3974 && e->symtree->n.sym->ts.type != BT_DERIVED
3975 && e->symtree->n.sym->assoc && e->symtree->n.sym->assoc->target
3976 && e->symtree->n.sym->assoc->target->ts.type == BT_DERIVED
3977 && e->symtree->n.sym->assoc->target->symtree->n.sym
3978 && UNLIMITED_POLY (e->symtree->n.sym->assoc->target->symtree->n.sym))
3980 /* The expression in assoc->target points to a ref to the _data component
3981 of the unlimited polymorphic entity. To get the _len component the last
3982 _data ref needs to be stripped and a ref to the _len component added. */
3983 return gfc_get_len_component (e->symtree->n.sym->assoc->target);
3984 else
3985 return NULL;
3989 gfc_expr *
3990 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3992 gfc_expr *result;
3993 int count, len, i;
3994 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3996 if (k == -1)
3997 return &gfc_bad_expr;
3999 if (e->expr_type != EXPR_CONSTANT)
4000 return NULL;
4002 len = e->value.character.length;
4003 for (count = 0, i = 1; i <= len; i++)
4004 if (e->value.character.string[len - i] == ' ')
4005 count++;
4006 else
4007 break;
4009 result = gfc_get_int_expr (k, &e->where, len - count);
4010 return range_check (result, "LEN_TRIM");
4013 gfc_expr *
4014 gfc_simplify_lgamma (gfc_expr *x)
4016 gfc_expr *result;
4017 int sg;
4019 if (x->expr_type != EXPR_CONSTANT)
4020 return NULL;
4022 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4023 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
4025 return range_check (result, "LGAMMA");
4029 gfc_expr *
4030 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
4032 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4033 return NULL;
4035 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4036 gfc_compare_string (a, b) >= 0);
4040 gfc_expr *
4041 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
4043 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4044 return NULL;
4046 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4047 gfc_compare_string (a, b) > 0);
4051 gfc_expr *
4052 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
4054 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4055 return NULL;
4057 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4058 gfc_compare_string (a, b) <= 0);
4062 gfc_expr *
4063 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
4065 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4066 return NULL;
4068 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4069 gfc_compare_string (a, b) < 0);
4073 gfc_expr *
4074 gfc_simplify_log (gfc_expr *x)
4076 gfc_expr *result;
4078 if (x->expr_type != EXPR_CONSTANT)
4079 return NULL;
4081 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4083 switch (x->ts.type)
4085 case BT_REAL:
4086 if (mpfr_sgn (x->value.real) <= 0)
4088 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4089 "to zero", &x->where);
4090 gfc_free_expr (result);
4091 return &gfc_bad_expr;
4094 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
4095 break;
4097 case BT_COMPLEX:
4098 if (mpfr_zero_p (mpc_realref (x->value.complex))
4099 && mpfr_zero_p (mpc_imagref (x->value.complex)))
4101 gfc_error ("Complex argument of LOG at %L cannot be zero",
4102 &x->where);
4103 gfc_free_expr (result);
4104 return &gfc_bad_expr;
4107 gfc_set_model_kind (x->ts.kind);
4108 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
4109 break;
4111 default:
4112 gfc_internal_error ("gfc_simplify_log: bad type");
4115 return range_check (result, "LOG");
4119 gfc_expr *
4120 gfc_simplify_log10 (gfc_expr *x)
4122 gfc_expr *result;
4124 if (x->expr_type != EXPR_CONSTANT)
4125 return NULL;
4127 if (mpfr_sgn (x->value.real) <= 0)
4129 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4130 "to zero", &x->where);
4131 return &gfc_bad_expr;
4134 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4135 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
4137 return range_check (result, "LOG10");
4141 gfc_expr *
4142 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
4144 int kind;
4146 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
4147 if (kind < 0)
4148 return &gfc_bad_expr;
4150 if (e->expr_type != EXPR_CONSTANT)
4151 return NULL;
4153 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
4157 gfc_expr*
4158 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
4160 gfc_expr *result;
4161 int row, result_rows, col, result_columns;
4162 int stride_a, offset_a, stride_b, offset_b;
4164 if (!is_constant_array_expr (matrix_a)
4165 || !is_constant_array_expr (matrix_b))
4166 return NULL;
4168 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
4169 result = gfc_get_array_expr (matrix_a->ts.type,
4170 matrix_a->ts.kind,
4171 &matrix_a->where);
4173 if (matrix_a->rank == 1 && matrix_b->rank == 2)
4175 result_rows = 1;
4176 result_columns = mpz_get_si (matrix_b->shape[1]);
4177 stride_a = 1;
4178 stride_b = mpz_get_si (matrix_b->shape[0]);
4180 result->rank = 1;
4181 result->shape = gfc_get_shape (result->rank);
4182 mpz_init_set_si (result->shape[0], result_columns);
4184 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
4186 result_rows = mpz_get_si (matrix_a->shape[0]);
4187 result_columns = 1;
4188 stride_a = mpz_get_si (matrix_a->shape[0]);
4189 stride_b = 1;
4191 result->rank = 1;
4192 result->shape = gfc_get_shape (result->rank);
4193 mpz_init_set_si (result->shape[0], result_rows);
4195 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
4197 result_rows = mpz_get_si (matrix_a->shape[0]);
4198 result_columns = mpz_get_si (matrix_b->shape[1]);
4199 stride_a = mpz_get_si (matrix_a->shape[0]);
4200 stride_b = mpz_get_si (matrix_b->shape[0]);
4202 result->rank = 2;
4203 result->shape = gfc_get_shape (result->rank);
4204 mpz_init_set_si (result->shape[0], result_rows);
4205 mpz_init_set_si (result->shape[1], result_columns);
4207 else
4208 gcc_unreachable();
4210 offset_a = offset_b = 0;
4211 for (col = 0; col < result_columns; ++col)
4213 offset_a = 0;
4215 for (row = 0; row < result_rows; ++row)
4217 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
4218 matrix_b, 1, offset_b, false);
4219 gfc_constructor_append_expr (&result->value.constructor,
4220 e, NULL);
4222 offset_a += 1;
4225 offset_b += stride_b;
4228 return result;
4232 gfc_expr *
4233 gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
4235 gfc_expr *result;
4236 int kind, arg, k;
4237 const char *s;
4239 if (i->expr_type != EXPR_CONSTANT)
4240 return NULL;
4242 kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind);
4243 if (kind == -1)
4244 return &gfc_bad_expr;
4245 k = gfc_validate_kind (BT_INTEGER, kind, false);
4247 s = gfc_extract_int (i, &arg);
4248 gcc_assert (!s);
4250 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
4252 /* MASKR(n) = 2^n - 1 */
4253 mpz_set_ui (result->value.integer, 1);
4254 mpz_mul_2exp (result->value.integer, result->value.integer, arg);
4255 mpz_sub_ui (result->value.integer, result->value.integer, 1);
4257 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
4259 return result;
4263 gfc_expr *
4264 gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
4266 gfc_expr *result;
4267 int kind, arg, k;
4268 const char *s;
4269 mpz_t z;
4271 if (i->expr_type != EXPR_CONSTANT)
4272 return NULL;
4274 kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind);
4275 if (kind == -1)
4276 return &gfc_bad_expr;
4277 k = gfc_validate_kind (BT_INTEGER, kind, false);
4279 s = gfc_extract_int (i, &arg);
4280 gcc_assert (!s);
4282 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
4284 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4285 mpz_init_set_ui (z, 1);
4286 mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size);
4287 mpz_set_ui (result->value.integer, 1);
4288 mpz_mul_2exp (result->value.integer, result->value.integer,
4289 gfc_integer_kinds[k].bit_size - arg);
4290 mpz_sub (result->value.integer, z, result->value.integer);
4291 mpz_clear (z);
4293 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
4295 return result;
4299 gfc_expr *
4300 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
4302 gfc_expr * result;
4303 gfc_constructor *tsource_ctor, *fsource_ctor, *mask_ctor;
4305 if (mask->expr_type == EXPR_CONSTANT)
4306 return gfc_get_parentheses (gfc_copy_expr (mask->value.logical
4307 ? tsource : fsource));
4309 if (!mask->rank || !is_constant_array_expr (mask)
4310 || !is_constant_array_expr (tsource) || !is_constant_array_expr (fsource))
4311 return NULL;
4313 result = gfc_get_array_expr (tsource->ts.type, tsource->ts.kind,
4314 &tsource->where);
4315 if (tsource->ts.type == BT_DERIVED)
4316 result->ts.u.derived = tsource->ts.u.derived;
4317 else if (tsource->ts.type == BT_CHARACTER)
4318 result->ts.u.cl = tsource->ts.u.cl;
4320 tsource_ctor = gfc_constructor_first (tsource->value.constructor);
4321 fsource_ctor = gfc_constructor_first (fsource->value.constructor);
4322 mask_ctor = gfc_constructor_first (mask->value.constructor);
4324 while (mask_ctor)
4326 if (mask_ctor->expr->value.logical)
4327 gfc_constructor_append_expr (&result->value.constructor,
4328 gfc_copy_expr (tsource_ctor->expr),
4329 NULL);
4330 else
4331 gfc_constructor_append_expr (&result->value.constructor,
4332 gfc_copy_expr (fsource_ctor->expr),
4333 NULL);
4334 tsource_ctor = gfc_constructor_next (tsource_ctor);
4335 fsource_ctor = gfc_constructor_next (fsource_ctor);
4336 mask_ctor = gfc_constructor_next (mask_ctor);
4339 result->shape = gfc_get_shape (1);
4340 gfc_array_size (result, &result->shape[0]);
4342 return result;
4346 gfc_expr *
4347 gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr)
4349 mpz_t arg1, arg2, mask;
4350 gfc_expr *result;
4352 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT
4353 || mask_expr->expr_type != EXPR_CONSTANT)
4354 return NULL;
4356 result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where);
4358 /* Convert all argument to unsigned. */
4359 mpz_init_set (arg1, i->value.integer);
4360 mpz_init_set (arg2, j->value.integer);
4361 mpz_init_set (mask, mask_expr->value.integer);
4363 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4364 mpz_and (arg1, arg1, mask);
4365 mpz_com (mask, mask);
4366 mpz_and (arg2, arg2, mask);
4367 mpz_ior (result->value.integer, arg1, arg2);
4369 mpz_clear (arg1);
4370 mpz_clear (arg2);
4371 mpz_clear (mask);
4373 return result;
4377 /* Selects between current value and extremum for simplify_min_max
4378 and simplify_minval_maxval. */
4379 static void
4380 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
4382 switch (arg->ts.type)
4384 case BT_INTEGER:
4385 if (mpz_cmp (arg->value.integer,
4386 extremum->value.integer) * sign > 0)
4387 mpz_set (extremum->value.integer, arg->value.integer);
4388 break;
4390 case BT_REAL:
4391 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4392 if (sign > 0)
4393 mpfr_max (extremum->value.real, extremum->value.real,
4394 arg->value.real, GFC_RND_MODE);
4395 else
4396 mpfr_min (extremum->value.real, extremum->value.real,
4397 arg->value.real, GFC_RND_MODE);
4398 break;
4400 case BT_CHARACTER:
4401 #define LENGTH(x) ((x)->value.character.length)
4402 #define STRING(x) ((x)->value.character.string)
4403 if (LENGTH (extremum) < LENGTH(arg))
4405 gfc_char_t *tmp = STRING(extremum);
4407 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
4408 memcpy (STRING(extremum), tmp,
4409 LENGTH(extremum) * sizeof (gfc_char_t));
4410 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
4411 LENGTH(arg) - LENGTH(extremum));
4412 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
4413 LENGTH(extremum) = LENGTH(arg);
4414 free (tmp);
4417 if (gfc_compare_string (arg, extremum) * sign > 0)
4419 free (STRING(extremum));
4420 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
4421 memcpy (STRING(extremum), STRING(arg),
4422 LENGTH(arg) * sizeof (gfc_char_t));
4423 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
4424 LENGTH(extremum) - LENGTH(arg));
4425 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
4427 #undef LENGTH
4428 #undef STRING
4429 break;
4431 default:
4432 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4437 /* This function is special since MAX() can take any number of
4438 arguments. The simplified expression is a rewritten version of the
4439 argument list containing at most one constant element. Other
4440 constant elements are deleted. Because the argument list has
4441 already been checked, this function always succeeds. sign is 1 for
4442 MAX(), -1 for MIN(). */
4444 static gfc_expr *
4445 simplify_min_max (gfc_expr *expr, int sign)
4447 gfc_actual_arglist *arg, *last, *extremum;
4448 gfc_intrinsic_sym * specific;
4450 last = NULL;
4451 extremum = NULL;
4452 specific = expr->value.function.isym;
4454 arg = expr->value.function.actual;
4456 for (; arg; last = arg, arg = arg->next)
4458 if (arg->expr->expr_type != EXPR_CONSTANT)
4459 continue;
4461 if (extremum == NULL)
4463 extremum = arg;
4464 continue;
4467 min_max_choose (arg->expr, extremum->expr, sign);
4469 /* Delete the extra constant argument. */
4470 last->next = arg->next;
4472 arg->next = NULL;
4473 gfc_free_actual_arglist (arg);
4474 arg = last;
4477 /* If there is one value left, replace the function call with the
4478 expression. */
4479 if (expr->value.function.actual->next != NULL)
4480 return NULL;
4482 /* Convert to the correct type and kind. */
4483 if (expr->ts.type != BT_UNKNOWN)
4484 return gfc_convert_constant (expr->value.function.actual->expr,
4485 expr->ts.type, expr->ts.kind);
4487 if (specific->ts.type != BT_UNKNOWN)
4488 return gfc_convert_constant (expr->value.function.actual->expr,
4489 specific->ts.type, specific->ts.kind);
4491 return gfc_copy_expr (expr->value.function.actual->expr);
4495 gfc_expr *
4496 gfc_simplify_min (gfc_expr *e)
4498 return simplify_min_max (e, -1);
4502 gfc_expr *
4503 gfc_simplify_max (gfc_expr *e)
4505 return simplify_min_max (e, 1);
4509 /* This is a simplified version of simplify_min_max to provide
4510 simplification of minval and maxval for a vector. */
4512 static gfc_expr *
4513 simplify_minval_maxval (gfc_expr *expr, int sign)
4515 gfc_constructor *c, *extremum;
4516 gfc_intrinsic_sym * specific;
4518 extremum = NULL;
4519 specific = expr->value.function.isym;
4521 for (c = gfc_constructor_first (expr->value.constructor);
4522 c; c = gfc_constructor_next (c))
4524 if (c->expr->expr_type != EXPR_CONSTANT)
4525 return NULL;
4527 if (extremum == NULL)
4529 extremum = c;
4530 continue;
4533 min_max_choose (c->expr, extremum->expr, sign);
4536 if (extremum == NULL)
4537 return NULL;
4539 /* Convert to the correct type and kind. */
4540 if (expr->ts.type != BT_UNKNOWN)
4541 return gfc_convert_constant (extremum->expr,
4542 expr->ts.type, expr->ts.kind);
4544 if (specific->ts.type != BT_UNKNOWN)
4545 return gfc_convert_constant (extremum->expr,
4546 specific->ts.type, specific->ts.kind);
4548 return gfc_copy_expr (extremum->expr);
4552 gfc_expr *
4553 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4555 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4556 return NULL;
4558 return simplify_minval_maxval (array, -1);
4562 gfc_expr *
4563 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4565 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4566 return NULL;
4568 return simplify_minval_maxval (array, 1);
4572 gfc_expr *
4573 gfc_simplify_maxexponent (gfc_expr *x)
4575 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4576 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4577 gfc_real_kinds[i].max_exponent);
4581 gfc_expr *
4582 gfc_simplify_minexponent (gfc_expr *x)
4584 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4585 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4586 gfc_real_kinds[i].min_exponent);
4590 gfc_expr *
4591 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
4593 gfc_expr *result;
4594 int kind;
4596 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4597 return NULL;
4599 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4600 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4602 switch (a->ts.type)
4604 case BT_INTEGER:
4605 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4607 /* Result is processor-dependent. */
4608 gfc_error ("Second argument MOD at %L is zero", &a->where);
4609 gfc_free_expr (result);
4610 return &gfc_bad_expr;
4612 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
4613 break;
4615 case BT_REAL:
4616 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4618 /* Result is processor-dependent. */
4619 gfc_error ("Second argument of MOD at %L is zero", &p->where);
4620 gfc_free_expr (result);
4621 return &gfc_bad_expr;
4624 gfc_set_model_kind (kind);
4625 mpfr_fmod (result->value.real, a->value.real, p->value.real,
4626 GFC_RND_MODE);
4627 break;
4629 default:
4630 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4633 return range_check (result, "MOD");
4637 gfc_expr *
4638 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
4640 gfc_expr *result;
4641 int kind;
4643 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4644 return NULL;
4646 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4647 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4649 switch (a->ts.type)
4651 case BT_INTEGER:
4652 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4654 /* Result is processor-dependent. This processor just opts
4655 to not handle it at all. */
4656 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
4657 gfc_free_expr (result);
4658 return &gfc_bad_expr;
4660 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
4662 break;
4664 case BT_REAL:
4665 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4667 /* Result is processor-dependent. */
4668 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
4669 gfc_free_expr (result);
4670 return &gfc_bad_expr;
4673 gfc_set_model_kind (kind);
4674 mpfr_fmod (result->value.real, a->value.real, p->value.real,
4675 GFC_RND_MODE);
4676 if (mpfr_cmp_ui (result->value.real, 0) != 0)
4678 if (mpfr_signbit (a->value.real) != mpfr_signbit (p->value.real))
4679 mpfr_add (result->value.real, result->value.real, p->value.real,
4680 GFC_RND_MODE);
4682 else
4683 mpfr_copysign (result->value.real, result->value.real,
4684 p->value.real, GFC_RND_MODE);
4685 break;
4687 default:
4688 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4691 return range_check (result, "MODULO");
4695 gfc_expr *
4696 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
4698 gfc_expr *result;
4699 mp_exp_t emin, emax;
4700 int kind;
4702 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
4703 return NULL;
4705 result = gfc_copy_expr (x);
4707 /* Save current values of emin and emax. */
4708 emin = mpfr_get_emin ();
4709 emax = mpfr_get_emax ();
4711 /* Set emin and emax for the current model number. */
4712 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
4713 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
4714 mpfr_get_prec(result->value.real) + 1);
4715 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
4716 mpfr_check_range (result->value.real, 0, GMP_RNDU);
4718 if (mpfr_sgn (s->value.real) > 0)
4720 mpfr_nextabove (result->value.real);
4721 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
4723 else
4725 mpfr_nextbelow (result->value.real);
4726 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
4729 mpfr_set_emin (emin);
4730 mpfr_set_emax (emax);
4732 /* Only NaN can occur. Do not use range check as it gives an
4733 error for denormal numbers. */
4734 if (mpfr_nan_p (result->value.real) && flag_range_check)
4736 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
4737 gfc_free_expr (result);
4738 return &gfc_bad_expr;
4741 return result;
4745 static gfc_expr *
4746 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
4748 gfc_expr *itrunc, *result;
4749 int kind;
4751 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4752 if (kind == -1)
4753 return &gfc_bad_expr;
4755 if (e->expr_type != EXPR_CONSTANT)
4756 return NULL;
4758 itrunc = gfc_copy_expr (e);
4759 mpfr_round (itrunc->value.real, e->value.real);
4761 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4762 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4764 gfc_free_expr (itrunc);
4766 return range_check (result, name);
4770 gfc_expr *
4771 gfc_simplify_new_line (gfc_expr *e)
4773 gfc_expr *result;
4775 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4776 result->value.character.string[0] = '\n';
4778 return result;
4782 gfc_expr *
4783 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4785 return simplify_nint ("NINT", e, k);
4789 gfc_expr *
4790 gfc_simplify_idnint (gfc_expr *e)
4792 return simplify_nint ("IDNINT", e, NULL);
4796 static gfc_expr *
4797 add_squared (gfc_expr *result, gfc_expr *e)
4799 mpfr_t tmp;
4801 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4802 gcc_assert (result->ts.type == BT_REAL
4803 && result->expr_type == EXPR_CONSTANT);
4805 gfc_set_model_kind (result->ts.kind);
4806 mpfr_init (tmp);
4807 mpfr_pow_ui (tmp, e->value.real, 2, GFC_RND_MODE);
4808 mpfr_add (result->value.real, result->value.real, tmp,
4809 GFC_RND_MODE);
4810 mpfr_clear (tmp);
4812 return result;
4816 static gfc_expr *
4817 do_sqrt (gfc_expr *result, gfc_expr *e)
4819 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4820 gcc_assert (result->ts.type == BT_REAL
4821 && result->expr_type == EXPR_CONSTANT);
4823 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
4824 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4825 return result;
4829 gfc_expr *
4830 gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
4832 gfc_expr *result;
4834 if (!is_constant_array_expr (e)
4835 || (dim != NULL && !gfc_is_constant_expr (dim)))
4836 return NULL;
4838 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
4839 init_result_expr (result, 0, NULL);
4841 if (!dim || e->rank == 1)
4843 result = simplify_transformation_to_scalar (result, e, NULL,
4844 add_squared);
4845 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4847 else
4848 result = simplify_transformation_to_array (result, e, dim, NULL,
4849 add_squared, &do_sqrt);
4851 return result;
4855 gfc_expr *
4856 gfc_simplify_not (gfc_expr *e)
4858 gfc_expr *result;
4860 if (e->expr_type != EXPR_CONSTANT)
4861 return NULL;
4863 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4864 mpz_com (result->value.integer, e->value.integer);
4866 return range_check (result, "NOT");
4870 gfc_expr *
4871 gfc_simplify_null (gfc_expr *mold)
4873 gfc_expr *result;
4875 if (mold)
4877 result = gfc_copy_expr (mold);
4878 result->expr_type = EXPR_NULL;
4880 else
4881 result = gfc_get_null_expr (NULL);
4883 return result;
4887 gfc_expr *
4888 gfc_simplify_num_images (gfc_expr *distance ATTRIBUTE_UNUSED, gfc_expr *failed)
4890 gfc_expr *result;
4892 if (flag_coarray == GFC_FCOARRAY_NONE)
4894 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
4895 return &gfc_bad_expr;
4898 if (flag_coarray != GFC_FCOARRAY_SINGLE)
4899 return NULL;
4901 if (failed && failed->expr_type != EXPR_CONSTANT)
4902 return NULL;
4904 /* FIXME: gfc_current_locus is wrong. */
4905 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4906 &gfc_current_locus);
4908 if (failed && failed->value.logical != 0)
4909 mpz_set_si (result->value.integer, 0);
4910 else
4911 mpz_set_si (result->value.integer, 1);
4913 return result;
4917 gfc_expr *
4918 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4920 gfc_expr *result;
4921 int kind;
4923 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4924 return NULL;
4926 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4928 switch (x->ts.type)
4930 case BT_INTEGER:
4931 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4932 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4933 return range_check (result, "OR");
4935 case BT_LOGICAL:
4936 return gfc_get_logical_expr (kind, &x->where,
4937 x->value.logical || y->value.logical);
4938 default:
4939 gcc_unreachable();
4944 gfc_expr *
4945 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4947 gfc_expr *result;
4948 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4950 if (!is_constant_array_expr (array)
4951 || !is_constant_array_expr (vector)
4952 || (!gfc_is_constant_expr (mask)
4953 && !is_constant_array_expr (mask)))
4954 return NULL;
4956 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4957 if (array->ts.type == BT_DERIVED)
4958 result->ts.u.derived = array->ts.u.derived;
4960 array_ctor = gfc_constructor_first (array->value.constructor);
4961 vector_ctor = vector
4962 ? gfc_constructor_first (vector->value.constructor)
4963 : NULL;
4965 if (mask->expr_type == EXPR_CONSTANT
4966 && mask->value.logical)
4968 /* Copy all elements of ARRAY to RESULT. */
4969 while (array_ctor)
4971 gfc_constructor_append_expr (&result->value.constructor,
4972 gfc_copy_expr (array_ctor->expr),
4973 NULL);
4975 array_ctor = gfc_constructor_next (array_ctor);
4976 vector_ctor = gfc_constructor_next (vector_ctor);
4979 else if (mask->expr_type == EXPR_ARRAY)
4981 /* Copy only those elements of ARRAY to RESULT whose
4982 MASK equals .TRUE.. */
4983 mask_ctor = gfc_constructor_first (mask->value.constructor);
4984 while (mask_ctor)
4986 if (mask_ctor->expr->value.logical)
4988 gfc_constructor_append_expr (&result->value.constructor,
4989 gfc_copy_expr (array_ctor->expr),
4990 NULL);
4991 vector_ctor = gfc_constructor_next (vector_ctor);
4994 array_ctor = gfc_constructor_next (array_ctor);
4995 mask_ctor = gfc_constructor_next (mask_ctor);
4999 /* Append any left-over elements from VECTOR to RESULT. */
5000 while (vector_ctor)
5002 gfc_constructor_append_expr (&result->value.constructor,
5003 gfc_copy_expr (vector_ctor->expr),
5004 NULL);
5005 vector_ctor = gfc_constructor_next (vector_ctor);
5008 result->shape = gfc_get_shape (1);
5009 gfc_array_size (result, &result->shape[0]);
5011 if (array->ts.type == BT_CHARACTER)
5012 result->ts.u.cl = array->ts.u.cl;
5014 return result;
5018 static gfc_expr *
5019 do_xor (gfc_expr *result, gfc_expr *e)
5021 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
5022 gcc_assert (result->ts.type == BT_LOGICAL
5023 && result->expr_type == EXPR_CONSTANT);
5025 result->value.logical = result->value.logical != e->value.logical;
5026 return result;
5031 gfc_expr *
5032 gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
5034 return simplify_transformation (e, dim, NULL, 0, do_xor);
5038 gfc_expr *
5039 gfc_simplify_popcnt (gfc_expr *e)
5041 int res, k;
5042 mpz_t x;
5044 if (e->expr_type != EXPR_CONSTANT)
5045 return NULL;
5047 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5049 /* Convert argument to unsigned, then count the '1' bits. */
5050 mpz_init_set (x, e->value.integer);
5051 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
5052 res = mpz_popcount (x);
5053 mpz_clear (x);
5055 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res);
5059 gfc_expr *
5060 gfc_simplify_poppar (gfc_expr *e)
5062 gfc_expr *popcnt;
5063 const char *s;
5064 int i;
5066 if (e->expr_type != EXPR_CONSTANT)
5067 return NULL;
5069 popcnt = gfc_simplify_popcnt (e);
5070 gcc_assert (popcnt);
5072 s = gfc_extract_int (popcnt, &i);
5073 gcc_assert (!s);
5075 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2);
5079 gfc_expr *
5080 gfc_simplify_precision (gfc_expr *e)
5082 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5083 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
5084 gfc_real_kinds[i].precision);
5088 gfc_expr *
5089 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5091 return simplify_transformation (array, dim, mask, 1, gfc_multiply);
5095 gfc_expr *
5096 gfc_simplify_radix (gfc_expr *e)
5098 int i;
5099 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5101 switch (e->ts.type)
5103 case BT_INTEGER:
5104 i = gfc_integer_kinds[i].radix;
5105 break;
5107 case BT_REAL:
5108 i = gfc_real_kinds[i].radix;
5109 break;
5111 default:
5112 gcc_unreachable ();
5115 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
5119 gfc_expr *
5120 gfc_simplify_range (gfc_expr *e)
5122 int i;
5123 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5125 switch (e->ts.type)
5127 case BT_INTEGER:
5128 i = gfc_integer_kinds[i].range;
5129 break;
5131 case BT_REAL:
5132 case BT_COMPLEX:
5133 i = gfc_real_kinds[i].range;
5134 break;
5136 default:
5137 gcc_unreachable ();
5140 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
5144 gfc_expr *
5145 gfc_simplify_rank (gfc_expr *e)
5147 /* Assumed rank. */
5148 if (e->rank == -1)
5149 return NULL;
5151 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, e->rank);
5155 gfc_expr *
5156 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
5158 gfc_expr *result = NULL;
5159 int kind;
5161 if (e->ts.type == BT_COMPLEX)
5162 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
5163 else
5164 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
5166 if (kind == -1)
5167 return &gfc_bad_expr;
5169 if (e->expr_type != EXPR_CONSTANT)
5170 return NULL;
5172 if (convert_boz (e, kind) == &gfc_bad_expr)
5173 return &gfc_bad_expr;
5175 result = gfc_convert_constant (e, BT_REAL, kind);
5176 if (result == &gfc_bad_expr)
5177 return &gfc_bad_expr;
5179 return range_check (result, "REAL");
5183 gfc_expr *
5184 gfc_simplify_realpart (gfc_expr *e)
5186 gfc_expr *result;
5188 if (e->expr_type != EXPR_CONSTANT)
5189 return NULL;
5191 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
5192 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
5194 return range_check (result, "REALPART");
5197 gfc_expr *
5198 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
5200 gfc_expr *result;
5201 gfc_charlen_t len;
5202 mpz_t ncopies;
5203 bool have_length = false;
5205 /* If NCOPIES isn't a constant, there's nothing we can do. */
5206 if (n->expr_type != EXPR_CONSTANT)
5207 return NULL;
5209 /* If NCOPIES is negative, it's an error. */
5210 if (mpz_sgn (n->value.integer) < 0)
5212 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
5213 &n->where);
5214 return &gfc_bad_expr;
5217 /* If we don't know the character length, we can do no more. */
5218 if (e->ts.u.cl && e->ts.u.cl->length
5219 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
5221 len = gfc_mpz_get_hwi (e->ts.u.cl->length->value.integer);
5222 have_length = true;
5224 else if (e->expr_type == EXPR_CONSTANT
5225 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
5227 len = e->value.character.length;
5229 else
5230 return NULL;
5232 /* If the source length is 0, any value of NCOPIES is valid
5233 and everything behaves as if NCOPIES == 0. */
5234 mpz_init (ncopies);
5235 if (len == 0)
5236 mpz_set_ui (ncopies, 0);
5237 else
5238 mpz_set (ncopies, n->value.integer);
5240 /* Check that NCOPIES isn't too large. */
5241 if (len)
5243 mpz_t max, mlen;
5244 int i;
5246 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
5247 mpz_init (max);
5248 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
5250 if (have_length)
5252 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
5253 e->ts.u.cl->length->value.integer);
5255 else
5257 mpz_init (mlen);
5258 gfc_mpz_set_hwi (mlen, len);
5259 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
5260 mpz_clear (mlen);
5263 /* The check itself. */
5264 if (mpz_cmp (ncopies, max) > 0)
5266 mpz_clear (max);
5267 mpz_clear (ncopies);
5268 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
5269 &n->where);
5270 return &gfc_bad_expr;
5273 mpz_clear (max);
5275 mpz_clear (ncopies);
5277 /* For further simplification, we need the character string to be
5278 constant. */
5279 if (e->expr_type != EXPR_CONSTANT)
5280 return NULL;
5282 HOST_WIDE_INT ncop;
5283 if (len ||
5284 (e->ts.u.cl->length &&
5285 mpz_sgn (e->ts.u.cl->length->value.integer) != 0))
5287 const char *res = gfc_extract_hwi (n, &ncop);
5288 gcc_assert (res == NULL);
5290 else
5291 ncop = 0;
5293 if (ncop == 0)
5294 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
5296 len = e->value.character.length;
5297 gfc_charlen_t nlen = ncop * len;
5299 /* Here's a semi-arbitrary limit. If the string is longer than 32 MB
5300 (8 * 2**20 elements * 4 bytes (wide chars) per element) defer to
5301 runtime instead of consuming (unbounded) memory and CPU at
5302 compile time. */
5303 if (nlen > 8388608)
5304 return NULL;
5306 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
5307 for (size_t i = 0; i < (size_t) ncop; i++)
5308 for (size_t j = 0; j < (size_t) len; j++)
5309 result->value.character.string[j+i*len]= e->value.character.string[j];
5311 result->value.character.string[nlen] = '\0'; /* For debugger */
5312 return result;
5316 /* This one is a bear, but mainly has to do with shuffling elements. */
5318 gfc_expr *
5319 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
5320 gfc_expr *pad, gfc_expr *order_exp)
5322 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
5323 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
5324 mpz_t index, size;
5325 unsigned long j;
5326 size_t nsource;
5327 gfc_expr *e, *result;
5329 /* Check that argument expression types are OK. */
5330 if (!is_constant_array_expr (source)
5331 || !is_constant_array_expr (shape_exp)
5332 || !is_constant_array_expr (pad)
5333 || !is_constant_array_expr (order_exp))
5334 return NULL;
5336 if (source->shape == NULL)
5337 return NULL;
5339 /* Proceed with simplification, unpacking the array. */
5341 mpz_init (index);
5342 rank = 0;
5344 for (;;)
5346 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
5347 if (e == NULL)
5348 break;
5350 gfc_extract_int (e, &shape[rank]);
5352 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
5353 gcc_assert (shape[rank] >= 0);
5355 rank++;
5358 gcc_assert (rank > 0);
5360 /* Now unpack the order array if present. */
5361 if (order_exp == NULL)
5363 for (i = 0; i < rank; i++)
5364 order[i] = i;
5366 else
5368 for (i = 0; i < rank; i++)
5369 x[i] = 0;
5371 for (i = 0; i < rank; i++)
5373 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
5374 gcc_assert (e);
5376 gfc_extract_int (e, &order[i]);
5378 gcc_assert (order[i] >= 1 && order[i] <= rank);
5379 order[i]--;
5380 gcc_assert (x[order[i]] == 0);
5381 x[order[i]] = 1;
5385 /* Count the elements in the source and padding arrays. */
5387 npad = 0;
5388 if (pad != NULL)
5390 gfc_array_size (pad, &size);
5391 npad = mpz_get_ui (size);
5392 mpz_clear (size);
5395 gfc_array_size (source, &size);
5396 nsource = mpz_get_ui (size);
5397 mpz_clear (size);
5399 /* If it weren't for that pesky permutation we could just loop
5400 through the source and round out any shortage with pad elements.
5401 But no, someone just had to have the compiler do something the
5402 user should be doing. */
5404 for (i = 0; i < rank; i++)
5405 x[i] = 0;
5407 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5408 &source->where);
5409 if (source->ts.type == BT_DERIVED)
5410 result->ts.u.derived = source->ts.u.derived;
5411 result->rank = rank;
5412 result->shape = gfc_get_shape (rank);
5413 for (i = 0; i < rank; i++)
5414 mpz_init_set_ui (result->shape[i], shape[i]);
5416 while (nsource > 0 || npad > 0)
5418 /* Figure out which element to extract. */
5419 mpz_set_ui (index, 0);
5421 for (i = rank - 1; i >= 0; i--)
5423 mpz_add_ui (index, index, x[order[i]]);
5424 if (i != 0)
5425 mpz_mul_ui (index, index, shape[order[i - 1]]);
5428 if (mpz_cmp_ui (index, INT_MAX) > 0)
5429 gfc_internal_error ("Reshaped array too large at %C");
5431 j = mpz_get_ui (index);
5433 if (j < nsource)
5434 e = gfc_constructor_lookup_expr (source->value.constructor, j);
5435 else
5437 if (npad <= 0)
5439 mpz_clear (index);
5440 return NULL;
5442 j = j - nsource;
5443 j = j % npad;
5444 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
5446 gcc_assert (e);
5448 gfc_constructor_append_expr (&result->value.constructor,
5449 gfc_copy_expr (e), &e->where);
5451 /* Calculate the next element. */
5452 i = 0;
5454 inc:
5455 if (++x[i] < shape[i])
5456 continue;
5457 x[i++] = 0;
5458 if (i < rank)
5459 goto inc;
5461 break;
5464 mpz_clear (index);
5466 return result;
5470 gfc_expr *
5471 gfc_simplify_rrspacing (gfc_expr *x)
5473 gfc_expr *result;
5474 int i;
5475 long int e, p;
5477 if (x->expr_type != EXPR_CONSTANT)
5478 return NULL;
5480 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5482 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5484 /* RRSPACING(+/- 0.0) = 0.0 */
5485 if (mpfr_zero_p (x->value.real))
5487 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5488 return result;
5491 /* RRSPACING(inf) = NaN */
5492 if (mpfr_inf_p (x->value.real))
5494 mpfr_set_nan (result->value.real);
5495 return result;
5498 /* RRSPACING(NaN) = same NaN */
5499 if (mpfr_nan_p (x->value.real))
5501 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
5502 return result;
5505 /* | x * 2**(-e) | * 2**p. */
5506 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5507 e = - (long int) mpfr_get_exp (x->value.real);
5508 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
5510 p = (long int) gfc_real_kinds[i].digits;
5511 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
5513 return range_check (result, "RRSPACING");
5517 gfc_expr *
5518 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
5520 int k, neg_flag, power, exp_range;
5521 mpfr_t scale, radix;
5522 gfc_expr *result;
5524 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5525 return NULL;
5527 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5529 if (mpfr_zero_p (x->value.real))
5531 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5532 return result;
5535 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
5537 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
5539 /* This check filters out values of i that would overflow an int. */
5540 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
5541 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
5543 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
5544 gfc_free_expr (result);
5545 return &gfc_bad_expr;
5548 /* Compute scale = radix ** power. */
5549 power = mpz_get_si (i->value.integer);
5551 if (power >= 0)
5552 neg_flag = 0;
5553 else
5555 neg_flag = 1;
5556 power = -power;
5559 gfc_set_model_kind (x->ts.kind);
5560 mpfr_init (scale);
5561 mpfr_init (radix);
5562 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
5563 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
5565 if (neg_flag)
5566 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
5567 else
5568 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
5570 mpfr_clears (scale, radix, NULL);
5572 return range_check (result, "SCALE");
5576 /* Variants of strspn and strcspn that operate on wide characters. */
5578 static size_t
5579 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
5581 size_t i = 0;
5582 const gfc_char_t *c;
5584 while (s1[i])
5586 for (c = s2; *c; c++)
5588 if (s1[i] == *c)
5589 break;
5591 if (*c == '\0')
5592 break;
5593 i++;
5596 return i;
5599 static size_t
5600 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
5602 size_t i = 0;
5603 const gfc_char_t *c;
5605 while (s1[i])
5607 for (c = s2; *c; c++)
5609 if (s1[i] == *c)
5610 break;
5612 if (*c)
5613 break;
5614 i++;
5617 return i;
5621 gfc_expr *
5622 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
5624 gfc_expr *result;
5625 int back;
5626 size_t i;
5627 size_t indx, len, lenc;
5628 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
5630 if (k == -1)
5631 return &gfc_bad_expr;
5633 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT
5634 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
5635 return NULL;
5637 if (b != NULL && b->value.logical != 0)
5638 back = 1;
5639 else
5640 back = 0;
5642 len = e->value.character.length;
5643 lenc = c->value.character.length;
5645 if (len == 0 || lenc == 0)
5647 indx = 0;
5649 else
5651 if (back == 0)
5653 indx = wide_strcspn (e->value.character.string,
5654 c->value.character.string) + 1;
5655 if (indx > len)
5656 indx = 0;
5658 else
5660 i = 0;
5661 for (indx = len; indx > 0; indx--)
5663 for (i = 0; i < lenc; i++)
5665 if (c->value.character.string[i]
5666 == e->value.character.string[indx - 1])
5667 break;
5669 if (i < lenc)
5670 break;
5675 result = gfc_get_int_expr (k, &e->where, indx);
5676 return range_check (result, "SCAN");
5680 gfc_expr *
5681 gfc_simplify_selected_char_kind (gfc_expr *e)
5683 int kind;
5685 if (e->expr_type != EXPR_CONSTANT)
5686 return NULL;
5688 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
5689 || gfc_compare_with_Cstring (e, "default", false) == 0)
5690 kind = 1;
5691 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
5692 kind = 4;
5693 else
5694 kind = -1;
5696 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5700 gfc_expr *
5701 gfc_simplify_selected_int_kind (gfc_expr *e)
5703 int i, kind, range;
5705 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
5706 return NULL;
5708 kind = INT_MAX;
5710 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
5711 if (gfc_integer_kinds[i].range >= range
5712 && gfc_integer_kinds[i].kind < kind)
5713 kind = gfc_integer_kinds[i].kind;
5715 if (kind == INT_MAX)
5716 kind = -1;
5718 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5722 gfc_expr *
5723 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
5725 int range, precision, radix, i, kind, found_precision, found_range,
5726 found_radix;
5727 locus *loc = &gfc_current_locus;
5729 if (p == NULL)
5730 precision = 0;
5731 else
5733 if (p->expr_type != EXPR_CONSTANT
5734 || gfc_extract_int (p, &precision) != NULL)
5735 return NULL;
5736 loc = &p->where;
5739 if (q == NULL)
5740 range = 0;
5741 else
5743 if (q->expr_type != EXPR_CONSTANT
5744 || gfc_extract_int (q, &range) != NULL)
5745 return NULL;
5747 if (!loc)
5748 loc = &q->where;
5751 if (rdx == NULL)
5752 radix = 0;
5753 else
5755 if (rdx->expr_type != EXPR_CONSTANT
5756 || gfc_extract_int (rdx, &radix) != NULL)
5757 return NULL;
5759 if (!loc)
5760 loc = &rdx->where;
5763 kind = INT_MAX;
5764 found_precision = 0;
5765 found_range = 0;
5766 found_radix = 0;
5768 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
5770 if (gfc_real_kinds[i].precision >= precision)
5771 found_precision = 1;
5773 if (gfc_real_kinds[i].range >= range)
5774 found_range = 1;
5776 if (radix == 0 || gfc_real_kinds[i].radix == radix)
5777 found_radix = 1;
5779 if (gfc_real_kinds[i].precision >= precision
5780 && gfc_real_kinds[i].range >= range
5781 && (radix == 0 || gfc_real_kinds[i].radix == radix)
5782 && gfc_real_kinds[i].kind < kind)
5783 kind = gfc_real_kinds[i].kind;
5786 if (kind == INT_MAX)
5788 if (found_radix && found_range && !found_precision)
5789 kind = -1;
5790 else if (found_radix && found_precision && !found_range)
5791 kind = -2;
5792 else if (found_radix && !found_precision && !found_range)
5793 kind = -3;
5794 else if (found_radix)
5795 kind = -4;
5796 else
5797 kind = -5;
5800 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
5804 gfc_expr *
5805 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
5807 gfc_expr *result;
5808 mpfr_t exp, absv, log2, pow2, frac;
5809 unsigned long exp2;
5811 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5812 return NULL;
5814 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5816 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
5817 SET_EXPONENT (NaN) = same NaN */
5818 if (mpfr_zero_p (x->value.real) || mpfr_nan_p (x->value.real))
5820 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
5821 return result;
5824 /* SET_EXPONENT (inf) = NaN */
5825 if (mpfr_inf_p (x->value.real))
5827 mpfr_set_nan (result->value.real);
5828 return result;
5831 gfc_set_model_kind (x->ts.kind);
5832 mpfr_init (absv);
5833 mpfr_init (log2);
5834 mpfr_init (exp);
5835 mpfr_init (pow2);
5836 mpfr_init (frac);
5838 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
5839 mpfr_log2 (log2, absv, GFC_RND_MODE);
5841 mpfr_trunc (log2, log2);
5842 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
5844 /* Old exponent value, and fraction. */
5845 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
5847 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
5849 /* New exponent. */
5850 exp2 = (unsigned long) mpz_get_d (i->value.integer);
5851 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
5853 mpfr_clears (absv, log2, pow2, frac, NULL);
5855 return range_check (result, "SET_EXPONENT");
5859 gfc_expr *
5860 gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
5862 mpz_t shape[GFC_MAX_DIMENSIONS];
5863 gfc_expr *result, *e, *f;
5864 gfc_array_ref *ar;
5865 int n;
5866 bool t;
5867 int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind);
5869 if (source->rank == -1)
5870 return NULL;
5872 result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
5874 if (source->rank == 0)
5875 return result;
5877 if (source->expr_type == EXPR_VARIABLE)
5879 ar = gfc_find_array_ref (source);
5880 t = gfc_array_ref_shape (ar, shape);
5882 else if (source->shape)
5884 t = true;
5885 for (n = 0; n < source->rank; n++)
5887 mpz_init (shape[n]);
5888 mpz_set (shape[n], source->shape[n]);
5891 else
5892 t = false;
5894 for (n = 0; n < source->rank; n++)
5896 e = gfc_get_constant_expr (BT_INTEGER, k, &source->where);
5898 if (t)
5899 mpz_set (e->value.integer, shape[n]);
5900 else
5902 mpz_set_ui (e->value.integer, n + 1);
5904 f = simplify_size (source, e, k);
5905 gfc_free_expr (e);
5906 if (f == NULL)
5908 gfc_free_expr (result);
5909 return NULL;
5911 else
5912 e = f;
5915 if (e == &gfc_bad_expr || range_check (e, "SHAPE") == &gfc_bad_expr)
5917 gfc_free_expr (result);
5918 if (t)
5919 gfc_clear_shape (shape, source->rank);
5920 return &gfc_bad_expr;
5923 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5926 if (t)
5927 gfc_clear_shape (shape, source->rank);
5929 return result;
5933 static gfc_expr *
5934 simplify_size (gfc_expr *array, gfc_expr *dim, int k)
5936 mpz_t size;
5937 gfc_expr *return_value;
5938 int d;
5940 /* For unary operations, the size of the result is given by the size
5941 of the operand. For binary ones, it's the size of the first operand
5942 unless it is scalar, then it is the size of the second. */
5943 if (array->expr_type == EXPR_OP && !array->value.op.uop)
5945 gfc_expr* replacement;
5946 gfc_expr* simplified;
5948 switch (array->value.op.op)
5950 /* Unary operations. */
5951 case INTRINSIC_NOT:
5952 case INTRINSIC_UPLUS:
5953 case INTRINSIC_UMINUS:
5954 case INTRINSIC_PARENTHESES:
5955 replacement = array->value.op.op1;
5956 break;
5958 /* Binary operations. If any one of the operands is scalar, take
5959 the other one's size. If both of them are arrays, it does not
5960 matter -- try to find one with known shape, if possible. */
5961 default:
5962 if (array->value.op.op1->rank == 0)
5963 replacement = array->value.op.op2;
5964 else if (array->value.op.op2->rank == 0)
5965 replacement = array->value.op.op1;
5966 else
5968 simplified = simplify_size (array->value.op.op1, dim, k);
5969 if (simplified)
5970 return simplified;
5972 replacement = array->value.op.op2;
5974 break;
5977 /* Try to reduce it directly if possible. */
5978 simplified = simplify_size (replacement, dim, k);
5980 /* Otherwise, we build a new SIZE call. This is hopefully at least
5981 simpler than the original one. */
5982 if (!simplified)
5984 gfc_expr *kind = gfc_get_int_expr (gfc_default_integer_kind, NULL, k);
5985 simplified = gfc_build_intrinsic_call (gfc_current_ns,
5986 GFC_ISYM_SIZE, "size",
5987 array->where, 3,
5988 gfc_copy_expr (replacement),
5989 gfc_copy_expr (dim),
5990 kind);
5992 return simplified;
5995 if (dim == NULL)
5997 if (!gfc_array_size (array, &size))
5998 return NULL;
6000 else
6002 if (dim->expr_type != EXPR_CONSTANT)
6003 return NULL;
6005 d = mpz_get_ui (dim->value.integer) - 1;
6006 if (!gfc_array_dimen_size (array, d, &size))
6007 return NULL;
6010 return_value = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
6011 mpz_set (return_value->value.integer, size);
6012 mpz_clear (size);
6014 return return_value;
6018 gfc_expr *
6019 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6021 gfc_expr *result;
6022 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
6024 if (k == -1)
6025 return &gfc_bad_expr;
6027 result = simplify_size (array, dim, k);
6028 if (result == NULL || result == &gfc_bad_expr)
6029 return result;
6031 return range_check (result, "SIZE");
6035 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
6036 multiplied by the array size. */
6038 gfc_expr *
6039 gfc_simplify_sizeof (gfc_expr *x)
6041 gfc_expr *result = NULL;
6042 mpz_t array_size;
6044 if (x->ts.type == BT_CLASS || x->ts.deferred)
6045 return NULL;
6047 if (x->ts.type == BT_CHARACTER
6048 && (!x->ts.u.cl || !x->ts.u.cl->length
6049 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
6050 return NULL;
6052 if (x->rank && x->expr_type != EXPR_ARRAY
6053 && !gfc_array_size (x, &array_size))
6054 return NULL;
6056 result = gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
6057 &x->where);
6058 mpz_set_si (result->value.integer, gfc_target_expr_size (x));
6060 return result;
6064 /* STORAGE_SIZE returns the size in bits of a single array element. */
6066 gfc_expr *
6067 gfc_simplify_storage_size (gfc_expr *x,
6068 gfc_expr *kind)
6070 gfc_expr *result = NULL;
6071 int k;
6073 if (x->ts.type == BT_CLASS || x->ts.deferred)
6074 return NULL;
6076 if (x->ts.type == BT_CHARACTER && x->expr_type != EXPR_CONSTANT
6077 && (!x->ts.u.cl || !x->ts.u.cl->length
6078 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
6079 return NULL;
6081 k = get_kind (BT_INTEGER, kind, "STORAGE_SIZE", gfc_default_integer_kind);
6082 if (k == -1)
6083 return &gfc_bad_expr;
6085 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
6087 mpz_set_si (result->value.integer, gfc_element_size (x));
6088 mpz_mul_ui (result->value.integer, result->value.integer, BITS_PER_UNIT);
6090 return range_check (result, "STORAGE_SIZE");
6094 gfc_expr *
6095 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
6097 gfc_expr *result;
6099 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6100 return NULL;
6102 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6104 switch (x->ts.type)
6106 case BT_INTEGER:
6107 mpz_abs (result->value.integer, x->value.integer);
6108 if (mpz_sgn (y->value.integer) < 0)
6109 mpz_neg (result->value.integer, result->value.integer);
6110 break;
6112 case BT_REAL:
6113 if (flag_sign_zero)
6114 mpfr_copysign (result->value.real, x->value.real, y->value.real,
6115 GFC_RND_MODE);
6116 else
6117 mpfr_setsign (result->value.real, x->value.real,
6118 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
6119 break;
6121 default:
6122 gfc_internal_error ("Bad type in gfc_simplify_sign");
6125 return result;
6129 gfc_expr *
6130 gfc_simplify_sin (gfc_expr *x)
6132 gfc_expr *result;
6134 if (x->expr_type != EXPR_CONSTANT)
6135 return NULL;
6137 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6139 switch (x->ts.type)
6141 case BT_REAL:
6142 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
6143 break;
6145 case BT_COMPLEX:
6146 gfc_set_model (x->value.real);
6147 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6148 break;
6150 default:
6151 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
6154 return range_check (result, "SIN");
6158 gfc_expr *
6159 gfc_simplify_sinh (gfc_expr *x)
6161 gfc_expr *result;
6163 if (x->expr_type != EXPR_CONSTANT)
6164 return NULL;
6166 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6168 switch (x->ts.type)
6170 case BT_REAL:
6171 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
6172 break;
6174 case BT_COMPLEX:
6175 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6176 break;
6178 default:
6179 gcc_unreachable ();
6182 return range_check (result, "SINH");
6186 /* The argument is always a double precision real that is converted to
6187 single precision. TODO: Rounding! */
6189 gfc_expr *
6190 gfc_simplify_sngl (gfc_expr *a)
6192 gfc_expr *result;
6194 if (a->expr_type != EXPR_CONSTANT)
6195 return NULL;
6197 result = gfc_real2real (a, gfc_default_real_kind);
6198 return range_check (result, "SNGL");
6202 gfc_expr *
6203 gfc_simplify_spacing (gfc_expr *x)
6205 gfc_expr *result;
6206 int i;
6207 long int en, ep;
6209 if (x->expr_type != EXPR_CONSTANT)
6210 return NULL;
6212 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
6213 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
6215 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
6216 if (mpfr_zero_p (x->value.real))
6218 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
6219 return result;
6222 /* SPACING(inf) = NaN */
6223 if (mpfr_inf_p (x->value.real))
6225 mpfr_set_nan (result->value.real);
6226 return result;
6229 /* SPACING(NaN) = same NaN */
6230 if (mpfr_nan_p (x->value.real))
6232 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
6233 return result;
6236 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
6237 are the radix, exponent of x, and precision. This excludes the
6238 possibility of subnormal numbers. Fortran 2003 states the result is
6239 b**max(e - p, emin - 1). */
6241 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
6242 en = (long int) gfc_real_kinds[i].min_exponent - 1;
6243 en = en > ep ? en : ep;
6245 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
6246 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
6248 return range_check (result, "SPACING");
6252 gfc_expr *
6253 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
6255 gfc_expr *result = NULL;
6256 int nelem, i, j, dim, ncopies;
6257 mpz_t size;
6259 if ((!gfc_is_constant_expr (source)
6260 && !is_constant_array_expr (source))
6261 || !gfc_is_constant_expr (dim_expr)
6262 || !gfc_is_constant_expr (ncopies_expr))
6263 return NULL;
6265 gcc_assert (dim_expr->ts.type == BT_INTEGER);
6266 gfc_extract_int (dim_expr, &dim);
6267 dim -= 1; /* zero-base DIM */
6269 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
6270 gfc_extract_int (ncopies_expr, &ncopies);
6271 ncopies = MAX (ncopies, 0);
6273 /* Do not allow the array size to exceed the limit for an array
6274 constructor. */
6275 if (source->expr_type == EXPR_ARRAY)
6277 if (!gfc_array_size (source, &size))
6278 gfc_internal_error ("Failure getting length of a constant array.");
6280 else
6281 mpz_init_set_ui (size, 1);
6283 nelem = mpz_get_si (size) * ncopies;
6284 if (nelem > flag_max_array_constructor)
6286 if (gfc_current_ns->sym_root->n.sym->attr.flavor == FL_PARAMETER)
6288 gfc_error ("The number of elements (%d) in the array constructor "
6289 "at %L requires an increase of the allowed %d upper "
6290 "limit. See %<-fmax-array-constructor%> option.",
6291 nelem, &source->where, flag_max_array_constructor);
6292 return &gfc_bad_expr;
6294 else
6295 return NULL;
6298 if (source->expr_type == EXPR_CONSTANT)
6300 gcc_assert (dim == 0);
6302 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
6303 &source->where);
6304 if (source->ts.type == BT_DERIVED)
6305 result->ts.u.derived = source->ts.u.derived;
6306 result->rank = 1;
6307 result->shape = gfc_get_shape (result->rank);
6308 mpz_init_set_si (result->shape[0], ncopies);
6310 for (i = 0; i < ncopies; ++i)
6311 gfc_constructor_append_expr (&result->value.constructor,
6312 gfc_copy_expr (source), NULL);
6314 else if (source->expr_type == EXPR_ARRAY)
6316 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
6317 gfc_constructor *source_ctor;
6319 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
6320 gcc_assert (dim >= 0 && dim <= source->rank);
6322 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
6323 &source->where);
6324 if (source->ts.type == BT_DERIVED)
6325 result->ts.u.derived = source->ts.u.derived;
6326 result->rank = source->rank + 1;
6327 result->shape = gfc_get_shape (result->rank);
6329 for (i = 0, j = 0; i < result->rank; ++i)
6331 if (i != dim)
6332 mpz_init_set (result->shape[i], source->shape[j++]);
6333 else
6334 mpz_init_set_si (result->shape[i], ncopies);
6336 extent[i] = mpz_get_si (result->shape[i]);
6337 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
6340 offset = 0;
6341 for (source_ctor = gfc_constructor_first (source->value.constructor);
6342 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
6344 for (i = 0; i < ncopies; ++i)
6345 gfc_constructor_insert_expr (&result->value.constructor,
6346 gfc_copy_expr (source_ctor->expr),
6347 NULL, offset + i * rstride[dim]);
6349 offset += (dim == 0 ? ncopies : 1);
6352 else
6354 gfc_error ("Simplification of SPREAD at %C not yet implemented");
6355 return &gfc_bad_expr;
6358 if (source->ts.type == BT_CHARACTER)
6359 result->ts.u.cl = source->ts.u.cl;
6361 return result;
6365 gfc_expr *
6366 gfc_simplify_sqrt (gfc_expr *e)
6368 gfc_expr *result = NULL;
6370 if (e->expr_type != EXPR_CONSTANT)
6371 return NULL;
6373 switch (e->ts.type)
6375 case BT_REAL:
6376 if (mpfr_cmp_si (e->value.real, 0) < 0)
6378 gfc_error ("Argument of SQRT at %L has a negative value",
6379 &e->where);
6380 return &gfc_bad_expr;
6382 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
6383 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
6384 break;
6386 case BT_COMPLEX:
6387 gfc_set_model (e->value.real);
6389 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
6390 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
6391 break;
6393 default:
6394 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
6397 return range_check (result, "SQRT");
6401 gfc_expr *
6402 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
6404 return simplify_transformation (array, dim, mask, 0, gfc_add);
6408 gfc_expr *
6409 gfc_simplify_cotan (gfc_expr *x)
6411 gfc_expr *result;
6412 mpc_t swp, *val;
6414 if (x->expr_type != EXPR_CONSTANT)
6415 return NULL;
6417 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6419 switch (x->ts.type)
6421 case BT_REAL:
6422 mpfr_cot (result->value.real, x->value.real, GFC_RND_MODE);
6423 break;
6425 case BT_COMPLEX:
6426 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
6427 val = &result->value.complex;
6428 mpc_init2 (swp, mpfr_get_default_prec ());
6429 mpc_cos (swp, x->value.complex, GFC_MPC_RND_MODE);
6430 mpc_sin (*val, x->value.complex, GFC_MPC_RND_MODE);
6431 mpc_div (*val, swp, *val, GFC_MPC_RND_MODE);
6432 mpc_clear (swp);
6433 break;
6435 default:
6436 gcc_unreachable ();
6439 return range_check (result, "COTAN");
6443 gfc_expr *
6444 gfc_simplify_tan (gfc_expr *x)
6446 gfc_expr *result;
6448 if (x->expr_type != EXPR_CONSTANT)
6449 return NULL;
6451 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6453 switch (x->ts.type)
6455 case BT_REAL:
6456 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
6457 break;
6459 case BT_COMPLEX:
6460 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6461 break;
6463 default:
6464 gcc_unreachable ();
6467 return range_check (result, "TAN");
6471 gfc_expr *
6472 gfc_simplify_tanh (gfc_expr *x)
6474 gfc_expr *result;
6476 if (x->expr_type != EXPR_CONSTANT)
6477 return NULL;
6479 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6481 switch (x->ts.type)
6483 case BT_REAL:
6484 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
6485 break;
6487 case BT_COMPLEX:
6488 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6489 break;
6491 default:
6492 gcc_unreachable ();
6495 return range_check (result, "TANH");
6499 gfc_expr *
6500 gfc_simplify_tiny (gfc_expr *e)
6502 gfc_expr *result;
6503 int i;
6505 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
6507 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
6508 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
6510 return result;
6514 gfc_expr *
6515 gfc_simplify_trailz (gfc_expr *e)
6517 unsigned long tz, bs;
6518 int i;
6520 if (e->expr_type != EXPR_CONSTANT)
6521 return NULL;
6523 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
6524 bs = gfc_integer_kinds[i].bit_size;
6525 tz = mpz_scan1 (e->value.integer, 0);
6527 return gfc_get_int_expr (gfc_default_integer_kind,
6528 &e->where, MIN (tz, bs));
6532 gfc_expr *
6533 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
6535 gfc_expr *result;
6536 gfc_expr *mold_element;
6537 size_t source_size;
6538 size_t result_size;
6539 size_t buffer_size;
6540 mpz_t tmp;
6541 unsigned char *buffer;
6542 size_t result_length;
6545 if (!gfc_is_constant_expr (source)
6546 || (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
6547 || !gfc_is_constant_expr (size))
6548 return NULL;
6550 if (!gfc_calculate_transfer_sizes (source, mold, size, &source_size,
6551 &result_size, &result_length))
6552 return NULL;
6554 /* Calculate the size of the source. */
6555 if (source->expr_type == EXPR_ARRAY
6556 && !gfc_array_size (source, &tmp))
6557 gfc_internal_error ("Failure getting length of a constant array.");
6559 /* Create an empty new expression with the appropriate characteristics. */
6560 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
6561 &source->where);
6562 result->ts = mold->ts;
6564 mold_element = mold->expr_type == EXPR_ARRAY
6565 ? gfc_constructor_first (mold->value.constructor)->expr
6566 : mold;
6568 /* Set result character length, if needed. Note that this needs to be
6569 set even for array expressions, in order to pass this information into
6570 gfc_target_interpret_expr. */
6571 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
6572 result->value.character.length = mold_element->value.character.length;
6574 /* Set the number of elements in the result, and determine its size. */
6576 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
6578 result->expr_type = EXPR_ARRAY;
6579 result->rank = 1;
6580 result->shape = gfc_get_shape (1);
6581 mpz_init_set_ui (result->shape[0], result_length);
6583 else
6584 result->rank = 0;
6586 /* Allocate the buffer to store the binary version of the source. */
6587 buffer_size = MAX (source_size, result_size);
6588 buffer = (unsigned char*)alloca (buffer_size);
6589 memset (buffer, 0, buffer_size);
6591 /* Now write source to the buffer. */
6592 gfc_target_encode_expr (source, buffer, buffer_size);
6594 /* And read the buffer back into the new expression. */
6595 gfc_target_interpret_expr (buffer, buffer_size, result, false);
6597 return result;
6601 gfc_expr *
6602 gfc_simplify_transpose (gfc_expr *matrix)
6604 int row, matrix_rows, col, matrix_cols;
6605 gfc_expr *result;
6607 if (!is_constant_array_expr (matrix))
6608 return NULL;
6610 gcc_assert (matrix->rank == 2);
6612 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
6613 &matrix->where);
6614 result->rank = 2;
6615 result->shape = gfc_get_shape (result->rank);
6616 mpz_set (result->shape[0], matrix->shape[1]);
6617 mpz_set (result->shape[1], matrix->shape[0]);
6619 if (matrix->ts.type == BT_CHARACTER)
6620 result->ts.u.cl = matrix->ts.u.cl;
6621 else if (matrix->ts.type == BT_DERIVED)
6622 result->ts.u.derived = matrix->ts.u.derived;
6624 matrix_rows = mpz_get_si (matrix->shape[0]);
6625 matrix_cols = mpz_get_si (matrix->shape[1]);
6626 for (row = 0; row < matrix_rows; ++row)
6627 for (col = 0; col < matrix_cols; ++col)
6629 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
6630 col * matrix_rows + row);
6631 gfc_constructor_insert_expr (&result->value.constructor,
6632 gfc_copy_expr (e), &matrix->where,
6633 row * matrix_cols + col);
6636 return result;
6640 gfc_expr *
6641 gfc_simplify_trim (gfc_expr *e)
6643 gfc_expr *result;
6644 int count, i, len, lentrim;
6646 if (e->expr_type != EXPR_CONSTANT)
6647 return NULL;
6649 len = e->value.character.length;
6650 for (count = 0, i = 1; i <= len; ++i)
6652 if (e->value.character.string[len - i] == ' ')
6653 count++;
6654 else
6655 break;
6658 lentrim = len - count;
6660 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
6661 for (i = 0; i < lentrim; i++)
6662 result->value.character.string[i] = e->value.character.string[i];
6664 return result;
6668 gfc_expr *
6669 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
6671 gfc_expr *result;
6672 gfc_ref *ref;
6673 gfc_array_spec *as;
6674 gfc_constructor *sub_cons;
6675 bool first_image;
6676 int d;
6678 if (!is_constant_array_expr (sub))
6679 return NULL;
6681 /* Follow any component references. */
6682 as = coarray->symtree->n.sym->as;
6683 for (ref = coarray->ref; ref; ref = ref->next)
6684 if (ref->type == REF_COMPONENT)
6685 as = ref->u.ar.as;
6687 if (as->type == AS_DEFERRED)
6688 return NULL;
6690 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6691 the cosubscript addresses the first image. */
6693 sub_cons = gfc_constructor_first (sub->value.constructor);
6694 first_image = true;
6696 for (d = 1; d <= as->corank; d++)
6698 gfc_expr *ca_bound;
6699 int cmp;
6701 gcc_assert (sub_cons != NULL);
6703 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
6704 NULL, true);
6705 if (ca_bound == NULL)
6706 return NULL;
6708 if (ca_bound == &gfc_bad_expr)
6709 return ca_bound;
6711 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
6713 if (cmp == 0)
6715 gfc_free_expr (ca_bound);
6716 sub_cons = gfc_constructor_next (sub_cons);
6717 continue;
6720 first_image = false;
6722 if (cmp > 0)
6724 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6725 "SUB has %ld and COARRAY lower bound is %ld)",
6726 &coarray->where, d,
6727 mpz_get_si (sub_cons->expr->value.integer),
6728 mpz_get_si (ca_bound->value.integer));
6729 gfc_free_expr (ca_bound);
6730 return &gfc_bad_expr;
6733 gfc_free_expr (ca_bound);
6735 /* Check whether upperbound is valid for the multi-images case. */
6736 if (d < as->corank)
6738 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
6739 NULL, true);
6740 if (ca_bound == &gfc_bad_expr)
6741 return ca_bound;
6743 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
6744 && mpz_cmp (ca_bound->value.integer,
6745 sub_cons->expr->value.integer) < 0)
6747 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6748 "SUB has %ld and COARRAY upper bound is %ld)",
6749 &coarray->where, d,
6750 mpz_get_si (sub_cons->expr->value.integer),
6751 mpz_get_si (ca_bound->value.integer));
6752 gfc_free_expr (ca_bound);
6753 return &gfc_bad_expr;
6756 if (ca_bound)
6757 gfc_free_expr (ca_bound);
6760 sub_cons = gfc_constructor_next (sub_cons);
6763 gcc_assert (sub_cons == NULL);
6765 if (flag_coarray != GFC_FCOARRAY_SINGLE && !first_image)
6766 return NULL;
6768 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6769 &gfc_current_locus);
6770 if (first_image)
6771 mpz_set_si (result->value.integer, 1);
6772 else
6773 mpz_set_si (result->value.integer, 0);
6775 return result;
6779 gfc_expr *
6780 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim,
6781 gfc_expr *distance ATTRIBUTE_UNUSED)
6783 if (flag_coarray != GFC_FCOARRAY_SINGLE)
6784 return NULL;
6786 /* If no coarray argument has been passed or when the first argument
6787 is actually a distance argment. */
6788 if (coarray == NULL || !gfc_is_coarray (coarray))
6790 gfc_expr *result;
6791 /* FIXME: gfc_current_locus is wrong. */
6792 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6793 &gfc_current_locus);
6794 mpz_set_si (result->value.integer, 1);
6795 return result;
6798 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6799 return simplify_cobound (coarray, dim, NULL, 0);
6803 gfc_expr *
6804 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6806 return simplify_bound (array, dim, kind, 1);
6809 gfc_expr *
6810 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6812 return simplify_cobound (array, dim, kind, 1);
6816 gfc_expr *
6817 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
6819 gfc_expr *result, *e;
6820 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
6822 if (!is_constant_array_expr (vector)
6823 || !is_constant_array_expr (mask)
6824 || (!gfc_is_constant_expr (field)
6825 && !is_constant_array_expr (field)))
6826 return NULL;
6828 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
6829 &vector->where);
6830 if (vector->ts.type == BT_DERIVED)
6831 result->ts.u.derived = vector->ts.u.derived;
6832 result->rank = mask->rank;
6833 result->shape = gfc_copy_shape (mask->shape, mask->rank);
6835 if (vector->ts.type == BT_CHARACTER)
6836 result->ts.u.cl = vector->ts.u.cl;
6838 vector_ctor = gfc_constructor_first (vector->value.constructor);
6839 mask_ctor = gfc_constructor_first (mask->value.constructor);
6840 field_ctor
6841 = field->expr_type == EXPR_ARRAY
6842 ? gfc_constructor_first (field->value.constructor)
6843 : NULL;
6845 while (mask_ctor)
6847 if (mask_ctor->expr->value.logical)
6849 gcc_assert (vector_ctor);
6850 e = gfc_copy_expr (vector_ctor->expr);
6851 vector_ctor = gfc_constructor_next (vector_ctor);
6853 else if (field->expr_type == EXPR_ARRAY)
6854 e = gfc_copy_expr (field_ctor->expr);
6855 else
6856 e = gfc_copy_expr (field);
6858 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
6860 mask_ctor = gfc_constructor_next (mask_ctor);
6861 field_ctor = gfc_constructor_next (field_ctor);
6864 return result;
6868 gfc_expr *
6869 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
6871 gfc_expr *result;
6872 int back;
6873 size_t index, len, lenset;
6874 size_t i;
6875 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
6877 if (k == -1)
6878 return &gfc_bad_expr;
6880 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT
6881 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
6882 return NULL;
6884 if (b != NULL && b->value.logical != 0)
6885 back = 1;
6886 else
6887 back = 0;
6889 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
6891 len = s->value.character.length;
6892 lenset = set->value.character.length;
6894 if (len == 0)
6896 mpz_set_ui (result->value.integer, 0);
6897 return result;
6900 if (back == 0)
6902 if (lenset == 0)
6904 mpz_set_ui (result->value.integer, 1);
6905 return result;
6908 index = wide_strspn (s->value.character.string,
6909 set->value.character.string) + 1;
6910 if (index > len)
6911 index = 0;
6914 else
6916 if (lenset == 0)
6918 mpz_set_ui (result->value.integer, len);
6919 return result;
6921 for (index = len; index > 0; index --)
6923 for (i = 0; i < lenset; i++)
6925 if (s->value.character.string[index - 1]
6926 == set->value.character.string[i])
6927 break;
6929 if (i == lenset)
6930 break;
6934 mpz_set_ui (result->value.integer, index);
6935 return result;
6939 gfc_expr *
6940 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
6942 gfc_expr *result;
6943 int kind;
6945 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6946 return NULL;
6948 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
6950 switch (x->ts.type)
6952 case BT_INTEGER:
6953 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
6954 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
6955 return range_check (result, "XOR");
6957 case BT_LOGICAL:
6958 return gfc_get_logical_expr (kind, &x->where,
6959 (x->value.logical && !y->value.logical)
6960 || (!x->value.logical && y->value.logical));
6962 default:
6963 gcc_unreachable ();
6968 /****************** Constant simplification *****************/
6970 /* Master function to convert one constant to another. While this is
6971 used as a simplification function, it requires the destination type
6972 and kind information which is supplied by a special case in
6973 do_simplify(). */
6975 gfc_expr *
6976 gfc_convert_constant (gfc_expr *e, bt type, int kind)
6978 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
6979 gfc_constructor *c;
6981 switch (e->ts.type)
6983 case BT_INTEGER:
6984 switch (type)
6986 case BT_INTEGER:
6987 f = gfc_int2int;
6988 break;
6989 case BT_REAL:
6990 f = gfc_int2real;
6991 break;
6992 case BT_COMPLEX:
6993 f = gfc_int2complex;
6994 break;
6995 case BT_LOGICAL:
6996 f = gfc_int2log;
6997 break;
6998 default:
6999 goto oops;
7001 break;
7003 case BT_REAL:
7004 switch (type)
7006 case BT_INTEGER:
7007 f = gfc_real2int;
7008 break;
7009 case BT_REAL:
7010 f = gfc_real2real;
7011 break;
7012 case BT_COMPLEX:
7013 f = gfc_real2complex;
7014 break;
7015 default:
7016 goto oops;
7018 break;
7020 case BT_COMPLEX:
7021 switch (type)
7023 case BT_INTEGER:
7024 f = gfc_complex2int;
7025 break;
7026 case BT_REAL:
7027 f = gfc_complex2real;
7028 break;
7029 case BT_COMPLEX:
7030 f = gfc_complex2complex;
7031 break;
7033 default:
7034 goto oops;
7036 break;
7038 case BT_LOGICAL:
7039 switch (type)
7041 case BT_INTEGER:
7042 f = gfc_log2int;
7043 break;
7044 case BT_LOGICAL:
7045 f = gfc_log2log;
7046 break;
7047 default:
7048 goto oops;
7050 break;
7052 case BT_HOLLERITH:
7053 switch (type)
7055 case BT_INTEGER:
7056 f = gfc_hollerith2int;
7057 break;
7059 case BT_REAL:
7060 f = gfc_hollerith2real;
7061 break;
7063 case BT_COMPLEX:
7064 f = gfc_hollerith2complex;
7065 break;
7067 case BT_CHARACTER:
7068 f = gfc_hollerith2character;
7069 break;
7071 case BT_LOGICAL:
7072 f = gfc_hollerith2logical;
7073 break;
7075 default:
7076 goto oops;
7078 break;
7080 default:
7081 oops:
7082 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
7085 result = NULL;
7087 switch (e->expr_type)
7089 case EXPR_CONSTANT:
7090 result = f (e, kind);
7091 if (result == NULL)
7092 return &gfc_bad_expr;
7093 break;
7095 case EXPR_ARRAY:
7096 if (!gfc_is_constant_expr (e))
7097 break;
7099 result = gfc_get_array_expr (type, kind, &e->where);
7100 result->shape = gfc_copy_shape (e->shape, e->rank);
7101 result->rank = e->rank;
7103 for (c = gfc_constructor_first (e->value.constructor);
7104 c; c = gfc_constructor_next (c))
7106 gfc_expr *tmp;
7107 if (c->iterator == NULL)
7108 tmp = f (c->expr, kind);
7109 else
7111 g = gfc_convert_constant (c->expr, type, kind);
7112 if (g == &gfc_bad_expr)
7114 gfc_free_expr (result);
7115 return g;
7117 tmp = g;
7120 if (tmp == NULL)
7122 gfc_free_expr (result);
7123 return NULL;
7126 gfc_constructor_append_expr (&result->value.constructor,
7127 tmp, &c->where);
7130 break;
7132 default:
7133 break;
7136 return result;
7140 /* Function for converting character constants. */
7141 gfc_expr *
7142 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
7144 gfc_expr *result;
7145 int i;
7147 if (!gfc_is_constant_expr (e))
7148 return NULL;
7150 if (e->expr_type == EXPR_CONSTANT)
7152 /* Simple case of a scalar. */
7153 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
7154 if (result == NULL)
7155 return &gfc_bad_expr;
7157 result->value.character.length = e->value.character.length;
7158 result->value.character.string
7159 = gfc_get_wide_string (e->value.character.length + 1);
7160 memcpy (result->value.character.string, e->value.character.string,
7161 (e->value.character.length + 1) * sizeof (gfc_char_t));
7163 /* Check we only have values representable in the destination kind. */
7164 for (i = 0; i < result->value.character.length; i++)
7165 if (!gfc_check_character_range (result->value.character.string[i],
7166 kind))
7168 gfc_error ("Character %qs in string at %L cannot be converted "
7169 "into character kind %d",
7170 gfc_print_wide_char (result->value.character.string[i]),
7171 &e->where, kind);
7172 gfc_free_expr (result);
7173 return &gfc_bad_expr;
7176 return result;
7178 else if (e->expr_type == EXPR_ARRAY)
7180 /* For an array constructor, we convert each constructor element. */
7181 gfc_constructor *c;
7183 result = gfc_get_array_expr (type, kind, &e->where);
7184 result->shape = gfc_copy_shape (e->shape, e->rank);
7185 result->rank = e->rank;
7186 result->ts.u.cl = e->ts.u.cl;
7188 for (c = gfc_constructor_first (e->value.constructor);
7189 c; c = gfc_constructor_next (c))
7191 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
7192 if (tmp == &gfc_bad_expr)
7194 gfc_free_expr (result);
7195 return &gfc_bad_expr;
7198 if (tmp == NULL)
7200 gfc_free_expr (result);
7201 return NULL;
7204 gfc_constructor_append_expr (&result->value.constructor,
7205 tmp, &c->where);
7208 return result;
7210 else
7211 return NULL;
7215 gfc_expr *
7216 gfc_simplify_compiler_options (void)
7218 char *str;
7219 gfc_expr *result;
7221 str = gfc_get_option_string ();
7222 result = gfc_get_character_expr (gfc_default_character_kind,
7223 &gfc_current_locus, str, strlen (str));
7224 free (str);
7225 return result;
7229 gfc_expr *
7230 gfc_simplify_compiler_version (void)
7232 char *buffer;
7233 size_t len;
7235 len = strlen ("GCC version ") + strlen (version_string);
7236 buffer = XALLOCAVEC (char, len + 1);
7237 snprintf (buffer, len + 1, "GCC version %s", version_string);
7238 return gfc_get_character_expr (gfc_default_character_kind,
7239 &gfc_current_locus, buffer, len);
7242 /* Simplification routines for intrinsics of IEEE modules. */
7244 gfc_expr *
7245 simplify_ieee_selected_real_kind (gfc_expr *expr)
7247 gfc_actual_arglist *arg;
7248 gfc_expr *p = NULL, *q = NULL, *rdx = NULL;
7250 arg = expr->value.function.actual;
7251 p = arg->expr;
7252 if (arg->next)
7254 q = arg->next->expr;
7255 if (arg->next->next)
7256 rdx = arg->next->next->expr;
7259 /* Currently, if IEEE is supported and this module is built, it means
7260 all our floating-point types conform to IEEE. Hence, we simply handle
7261 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
7262 return gfc_simplify_selected_real_kind (p, q, rdx);
7265 gfc_expr *
7266 simplify_ieee_support (gfc_expr *expr)
7268 /* We consider that if the IEEE modules are loaded, we have full support
7269 for flags, halting and rounding, which are the three functions
7270 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
7271 expressions. One day, we will need libgfortran to detect support and
7272 communicate it back to us, allowing for partial support. */
7274 return gfc_get_logical_expr (gfc_default_logical_kind, &expr->where,
7275 true);
7278 bool
7279 matches_ieee_function_name (gfc_symbol *sym, const char *name)
7281 int n = strlen(name);
7283 if (!strncmp(sym->name, name, n))
7284 return true;
7286 /* If a generic was used and renamed, we need more work to find out.
7287 Compare the specific name. */
7288 if (sym->generic && !strncmp(sym->generic->sym->name, name, n))
7289 return true;
7291 return false;
7294 gfc_expr *
7295 gfc_simplify_ieee_functions (gfc_expr *expr)
7297 gfc_symbol* sym = expr->symtree->n.sym;
7299 if (matches_ieee_function_name(sym, "ieee_selected_real_kind"))
7300 return simplify_ieee_selected_real_kind (expr);
7301 else if (matches_ieee_function_name(sym, "ieee_support_flag")
7302 || matches_ieee_function_name(sym, "ieee_support_halting")
7303 || matches_ieee_function_name(sym, "ieee_support_rounding"))
7304 return simplify_ieee_support (expr);
7305 else
7306 return NULL;