Limit the number of parameters per SCoP.
[official-gcc/constexpr.git] / gcc / fortran / simplify.c
blob8768cb64de2894b6e0900da3fa781447b5eeaf75
1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught & Katherine Holcomb
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "flags.h"
25 #include "gfortran.h"
26 #include "arith.h"
27 #include "intrinsic.h"
28 #include "target-memory.h"
30 /* Savely advance an array constructor by 'n' elements.
31 Mainly used by simplifiers of transformational intrinsics. */
32 #define ADVANCE(ctor, n) do { int i; for (i = 0; i < n && ctor; ++i) ctor = ctor->next; } while (0)
34 gfc_expr gfc_bad_expr;
37 /* Note that 'simplification' is not just transforming expressions.
38 For functions that are not simplified at compile time, range
39 checking is done if possible.
41 The return convention is that each simplification function returns:
43 A new expression node corresponding to the simplified arguments.
44 The original arguments are destroyed by the caller, and must not
45 be a part of the new expression.
47 NULL pointer indicating that no simplification was possible and
48 the original expression should remain intact. If the
49 simplification function sets the type and/or the function name
50 via the pointer gfc_simple_expression, then this type is
51 retained.
53 An expression pointer to gfc_bad_expr (a static placeholder)
54 indicating that some error has prevented simplification. For
55 example, sqrt(-1.0). The error is generated within the function
56 and should be propagated upwards
58 By the time a simplification function gets control, it has been
59 decided that the function call is really supposed to be the
60 intrinsic. No type checking is strictly necessary, since only
61 valid types will be passed on. On the other hand, a simplification
62 subroutine may have to look at the type of an argument as part of
63 its processing.
65 Array arguments are never passed to these subroutines.
67 The functions in this file don't have much comment with them, but
68 everything is reasonably straight-forward. The Standard, chapter 13
69 is the best comment you'll find for this file anyway. */
71 /* Range checks an expression node. If all goes well, returns the
72 node, otherwise returns &gfc_bad_expr and frees the node. */
74 static gfc_expr *
75 range_check (gfc_expr *result, const char *name)
77 if (result == NULL)
78 return &gfc_bad_expr;
80 switch (gfc_range_check (result))
82 case ARITH_OK:
83 return result;
85 case ARITH_OVERFLOW:
86 gfc_error ("Result of %s overflows its kind at %L", name,
87 &result->where);
88 break;
90 case ARITH_UNDERFLOW:
91 gfc_error ("Result of %s underflows its kind at %L", name,
92 &result->where);
93 break;
95 case ARITH_NAN:
96 gfc_error ("Result of %s is NaN at %L", name, &result->where);
97 break;
99 default:
100 gfc_error ("Result of %s gives range error for its kind at %L", name,
101 &result->where);
102 break;
105 gfc_free_expr (result);
106 return &gfc_bad_expr;
110 /* A helper function that gets an optional and possibly missing
111 kind parameter. Returns the kind, -1 if something went wrong. */
113 static int
114 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
116 int kind;
118 if (k == NULL)
119 return default_kind;
121 if (k->expr_type != EXPR_CONSTANT)
123 gfc_error ("KIND parameter of %s at %L must be an initialization "
124 "expression", name, &k->where);
125 return -1;
128 if (gfc_extract_int (k, &kind) != NULL
129 || gfc_validate_kind (type, kind, true) < 0)
131 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
132 return -1;
135 return kind;
139 /* Helper function to get an integer constant with a kind number given
140 by an integer constant expression. */
141 static gfc_expr *
142 int_expr_with_kind (int i, gfc_expr *kind, const char *name)
144 gfc_expr *res = gfc_int_expr (i);
145 res->ts.kind = get_kind (BT_INTEGER, kind, name, gfc_default_integer_kind);
146 if (res->ts.kind == -1)
147 return NULL;
148 else
149 return res;
153 /* Converts an mpz_t signed variable into an unsigned one, assuming
154 two's complement representations and a binary width of bitsize.
155 The conversion is a no-op unless x is negative; otherwise, it can
156 be accomplished by masking out the high bits. */
158 static void
159 convert_mpz_to_unsigned (mpz_t x, int bitsize)
161 mpz_t mask;
163 if (mpz_sgn (x) < 0)
165 /* Confirm that no bits above the signed range are unset. */
166 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
168 mpz_init_set_ui (mask, 1);
169 mpz_mul_2exp (mask, mask, bitsize);
170 mpz_sub_ui (mask, mask, 1);
172 mpz_and (x, x, mask);
174 mpz_clear (mask);
176 else
178 /* Confirm that no bits above the signed range are set. */
179 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
184 /* Converts an mpz_t unsigned variable into a signed one, assuming
185 two's complement representations and a binary width of bitsize.
186 If the bitsize-1 bit is set, this is taken as a sign bit and
187 the number is converted to the corresponding negative number. */
189 static void
190 convert_mpz_to_signed (mpz_t x, int bitsize)
192 mpz_t mask;
194 /* Confirm that no bits above the unsigned range are set. */
195 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
197 if (mpz_tstbit (x, bitsize - 1) == 1)
199 mpz_init_set_ui (mask, 1);
200 mpz_mul_2exp (mask, mask, bitsize);
201 mpz_sub_ui (mask, mask, 1);
203 /* We negate the number by hand, zeroing the high bits, that is
204 make it the corresponding positive number, and then have it
205 negated by GMP, giving the correct representation of the
206 negative number. */
207 mpz_com (x, x);
208 mpz_add_ui (x, x, 1);
209 mpz_and (x, x, mask);
211 mpz_neg (x, x);
213 mpz_clear (mask);
217 /* Test that the expression is an constant array. */
219 static bool
220 is_constant_array_expr (gfc_expr *e)
222 gfc_constructor *c;
224 if (e == NULL)
225 return true;
227 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
228 return false;
230 for (c = e->value.constructor; c; c = c->next)
231 if (c->expr->expr_type != EXPR_CONSTANT)
232 return false;
234 return true;
238 /* Initialize a transformational result expression with a given value. */
240 static void
241 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
243 if (e && e->expr_type == EXPR_ARRAY)
245 gfc_constructor *ctor = e->value.constructor;
246 while (ctor)
248 init_result_expr (ctor->expr, init, array);
249 ctor = ctor->next;
252 else if (e && e->expr_type == EXPR_CONSTANT)
254 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
255 int length;
256 gfc_char_t *string;
258 switch (e->ts.type)
260 case BT_LOGICAL:
261 e->value.logical = (init ? 1 : 0);
262 break;
264 case BT_INTEGER:
265 if (init == INT_MIN)
266 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
267 else if (init == INT_MAX)
268 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
269 else
270 mpz_set_si (e->value.integer, init);
271 break;
273 case BT_REAL:
274 if (init == INT_MIN)
276 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
277 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
279 else if (init == INT_MAX)
280 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
281 else
282 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
283 break;
285 case BT_COMPLEX:
286 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
287 break;
289 case BT_CHARACTER:
290 if (init == INT_MIN)
292 gfc_expr *len = gfc_simplify_len (array, NULL);
293 gfc_extract_int (len, &length);
294 string = gfc_get_wide_string (length + 1);
295 gfc_wide_memset (string, 0, length);
297 else if (init == INT_MAX)
299 gfc_expr *len = gfc_simplify_len (array, NULL);
300 gfc_extract_int (len, &length);
301 string = gfc_get_wide_string (length + 1);
302 gfc_wide_memset (string, 255, length);
304 else
306 length = 0;
307 string = gfc_get_wide_string (1);
310 string[length] = '\0';
311 e->value.character.length = length;
312 e->value.character.string = string;
313 break;
315 default:
316 gcc_unreachable();
319 else
320 gcc_unreachable();
324 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul. */
326 static gfc_expr *
327 compute_dot_product (gfc_constructor *ctor_a, int stride_a,
328 gfc_constructor *ctor_b, int stride_b)
330 gfc_expr *result;
331 gfc_expr *a = ctor_a->expr, *b = ctor_b->expr;
333 gcc_assert (gfc_compare_types (&a->ts, &b->ts));
335 result = gfc_constant_result (a->ts.type, a->ts.kind, &a->where);
336 init_result_expr (result, 0, NULL);
338 while (ctor_a && ctor_b)
340 /* Copying of expressions is required as operands are free'd
341 by the gfc_arith routines. */
342 switch (result->ts.type)
344 case BT_LOGICAL:
345 result = gfc_or (result,
346 gfc_and (gfc_copy_expr (ctor_a->expr),
347 gfc_copy_expr (ctor_b->expr)));
348 break;
350 case BT_INTEGER:
351 case BT_REAL:
352 case BT_COMPLEX:
353 result = gfc_add (result,
354 gfc_multiply (gfc_copy_expr (ctor_a->expr),
355 gfc_copy_expr (ctor_b->expr)));
356 break;
358 default:
359 gcc_unreachable();
362 ADVANCE (ctor_a, stride_a);
363 ADVANCE (ctor_b, stride_b);
366 return result;
370 /* Build a result expression for transformational intrinsics,
371 depending on DIM. */
373 static gfc_expr *
374 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
375 int kind, locus* where)
377 gfc_expr *result;
378 int i, nelem;
380 if (!dim || array->rank == 1)
381 return gfc_constant_result (type, kind, where);
383 result = gfc_start_constructor (type, kind, where);
384 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
385 result->rank = array->rank - 1;
387 /* gfc_array_size() would count the number of elements in the constructor,
388 we have not built those yet. */
389 nelem = 1;
390 for (i = 0; i < result->rank; ++i)
391 nelem *= mpz_get_ui (result->shape[i]);
393 for (i = 0; i < nelem; ++i)
395 gfc_expr *e = gfc_constant_result (type, kind, where);
396 gfc_append_constructor (result, e);
399 return result;
403 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
405 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
406 of COUNT intrinsic is .TRUE..
408 Interface and implimentation mimics arith functions as
409 gfc_add, gfc_multiply, etc. */
411 static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
413 gfc_expr *result;
415 gcc_assert (op1->ts.type == BT_INTEGER);
416 gcc_assert (op2->ts.type == BT_LOGICAL);
417 gcc_assert (op2->value.logical);
419 result = gfc_copy_expr (op1);
420 mpz_add_ui (result->value.integer, result->value.integer, 1);
422 gfc_free_expr (op1);
423 gfc_free_expr (op2);
424 return result;
428 /* Transforms an ARRAY with operation OP, according to MASK, to a
429 scalar RESULT. E.g. called if
431 REAL, PARAMETER :: array(n, m) = ...
432 REAL, PARAMETER :: s = SUM(array)
434 where OP == gfc_add(). */
436 static gfc_expr *
437 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
438 transformational_op op)
440 gfc_expr *a, *m;
441 gfc_constructor *array_ctor, *mask_ctor;
443 /* Shortcut for constant .FALSE. MASK. */
444 if (mask
445 && mask->expr_type == EXPR_CONSTANT
446 && !mask->value.logical)
447 return result;
449 array_ctor = array->value.constructor;
450 mask_ctor = NULL;
451 if (mask && mask->expr_type == EXPR_ARRAY)
452 mask_ctor = mask->value.constructor;
454 while (array_ctor)
456 a = array_ctor->expr;
457 array_ctor = array_ctor->next;
459 /* A constant MASK equals .TRUE. here and can be ignored. */
460 if (mask_ctor)
462 m = mask_ctor->expr;
463 mask_ctor = mask_ctor->next;
464 if (!m->value.logical)
465 continue;
468 result = op (result, gfc_copy_expr (a));
471 return result;
474 /* Transforms an ARRAY with operation OP, according to MASK, to an
475 array RESULT. E.g. called if
477 REAL, PARAMETER :: array(n, m) = ...
478 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
480 where OP == gfc_multiply(). */
482 static gfc_expr *
483 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
484 gfc_expr *mask, transformational_op op)
486 mpz_t size;
487 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
488 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
489 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
491 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
492 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
493 tmpstride[GFC_MAX_DIMENSIONS];
495 /* Shortcut for constant .FALSE. MASK. */
496 if (mask
497 && mask->expr_type == EXPR_CONSTANT
498 && !mask->value.logical)
499 return result;
501 /* Build an indexed table for array element expressions to minimize
502 linked-list traversal. Masked elements are set to NULL. */
503 gfc_array_size (array, &size);
504 arraysize = mpz_get_ui (size);
506 arrayvec = (gfc_expr**) gfc_getmem (sizeof (gfc_expr*) * arraysize);
508 array_ctor = array->value.constructor;
509 mask_ctor = NULL;
510 if (mask && mask->expr_type == EXPR_ARRAY)
511 mask_ctor = mask->value.constructor;
513 for (i = 0; i < arraysize; ++i)
515 arrayvec[i] = array_ctor->expr;
516 array_ctor = array_ctor->next;
518 if (mask_ctor)
520 if (!mask_ctor->expr->value.logical)
521 arrayvec[i] = NULL;
523 mask_ctor = mask_ctor->next;
527 /* Same for the result expression. */
528 gfc_array_size (result, &size);
529 resultsize = mpz_get_ui (size);
530 mpz_clear (size);
532 resultvec = (gfc_expr**) gfc_getmem (sizeof (gfc_expr*) * resultsize);
533 result_ctor = result->value.constructor;
534 for (i = 0; i < resultsize; ++i)
536 resultvec[i] = result_ctor->expr;
537 result_ctor = result_ctor->next;
540 gfc_extract_int (dim, &dim_index);
541 dim_index -= 1; /* zero-base index */
542 dim_extent = 0;
543 dim_stride = 0;
545 for (i = 0, n = 0; i < array->rank; ++i)
547 count[i] = 0;
548 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
549 if (i == dim_index)
551 dim_extent = mpz_get_si (array->shape[i]);
552 dim_stride = tmpstride[i];
553 continue;
556 extent[n] = mpz_get_si (array->shape[i]);
557 sstride[n] = tmpstride[i];
558 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
559 n += 1;
562 done = false;
563 base = arrayvec;
564 dest = resultvec;
565 while (!done)
567 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
568 if (*src)
569 *dest = op (*dest, gfc_copy_expr (*src));
571 count[0]++;
572 base += sstride[0];
573 dest += dstride[0];
575 n = 0;
576 while (!done && count[n] == extent[n])
578 count[n] = 0;
579 base -= sstride[n] * extent[n];
580 dest -= dstride[n] * extent[n];
582 n++;
583 if (n < result->rank)
585 count [n]++;
586 base += sstride[n];
587 dest += dstride[n];
589 else
590 done = true;
594 /* Place updated expression in result constructor. */
595 result_ctor = result->value.constructor;
596 for (i = 0; i < resultsize; ++i)
598 result_ctor->expr = resultvec[i];
599 result_ctor = result_ctor->next;
602 gfc_free (arrayvec);
603 gfc_free (resultvec);
604 return result;
609 /********************** Simplification functions *****************************/
611 gfc_expr *
612 gfc_simplify_abs (gfc_expr *e)
614 gfc_expr *result;
616 if (e->expr_type != EXPR_CONSTANT)
617 return NULL;
619 switch (e->ts.type)
621 case BT_INTEGER:
622 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
624 mpz_abs (result->value.integer, e->value.integer);
626 result = range_check (result, "IABS");
627 break;
629 case BT_REAL:
630 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
632 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
634 result = range_check (result, "ABS");
635 break;
637 case BT_COMPLEX:
638 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
640 gfc_set_model_kind (e->ts.kind);
642 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
643 result = range_check (result, "CABS");
644 break;
646 default:
647 gfc_internal_error ("gfc_simplify_abs(): Bad type");
650 return result;
654 static gfc_expr *
655 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
657 gfc_expr *result;
658 int kind;
659 bool too_large = false;
661 if (e->expr_type != EXPR_CONSTANT)
662 return NULL;
664 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
665 if (kind == -1)
666 return &gfc_bad_expr;
668 if (mpz_cmp_si (e->value.integer, 0) < 0)
670 gfc_error ("Argument of %s function at %L is negative", name,
671 &e->where);
672 return &gfc_bad_expr;
675 if (ascii && gfc_option.warn_surprising
676 && mpz_cmp_si (e->value.integer, 127) > 0)
677 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
678 name, &e->where);
680 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
681 too_large = true;
682 else if (kind == 4)
684 mpz_t t;
685 mpz_init_set_ui (t, 2);
686 mpz_pow_ui (t, t, 32);
687 mpz_sub_ui (t, t, 1);
688 if (mpz_cmp (e->value.integer, t) > 0)
689 too_large = true;
690 mpz_clear (t);
693 if (too_large)
695 gfc_error ("Argument of %s function at %L is too large for the "
696 "collating sequence of kind %d", name, &e->where, kind);
697 return &gfc_bad_expr;
700 result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
701 result->value.character.string = gfc_get_wide_string (2);
702 result->value.character.length = 1;
703 result->value.character.string[0] = mpz_get_ui (e->value.integer);
704 result->value.character.string[1] = '\0'; /* For debugger */
705 return result;
710 /* We use the processor's collating sequence, because all
711 systems that gfortran currently works on are ASCII. */
713 gfc_expr *
714 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
716 return simplify_achar_char (e, k, "ACHAR", true);
720 gfc_expr *
721 gfc_simplify_acos (gfc_expr *x)
723 gfc_expr *result;
725 if (x->expr_type != EXPR_CONSTANT)
726 return NULL;
728 switch (x->ts.type)
730 case BT_REAL:
731 if (mpfr_cmp_si (x->value.real, 1) > 0
732 || mpfr_cmp_si (x->value.real, -1) < 0)
734 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
735 &x->where);
736 return &gfc_bad_expr;
738 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
739 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
740 break;
741 case BT_COMPLEX:
742 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
743 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
744 break;
745 default:
746 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
750 return range_check (result, "ACOS");
753 gfc_expr *
754 gfc_simplify_acosh (gfc_expr *x)
756 gfc_expr *result;
758 if (x->expr_type != EXPR_CONSTANT)
759 return NULL;
761 switch (x->ts.type)
763 case BT_REAL:
764 if (mpfr_cmp_si (x->value.real, 1) < 0)
766 gfc_error ("Argument of ACOSH at %L must not be less than 1",
767 &x->where);
768 return &gfc_bad_expr;
771 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
772 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
773 break;
774 case BT_COMPLEX:
775 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
776 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
777 break;
778 default:
779 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
782 return range_check (result, "ACOSH");
785 gfc_expr *
786 gfc_simplify_adjustl (gfc_expr *e)
788 gfc_expr *result;
789 int count, i, len;
790 gfc_char_t ch;
792 if (e->expr_type != EXPR_CONSTANT)
793 return NULL;
795 len = e->value.character.length;
797 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
799 result->value.character.length = len;
800 result->value.character.string = gfc_get_wide_string (len + 1);
802 for (count = 0, i = 0; i < len; ++i)
804 ch = e->value.character.string[i];
805 if (ch != ' ')
806 break;
807 ++count;
810 for (i = 0; i < len - count; ++i)
811 result->value.character.string[i] = e->value.character.string[count + i];
813 for (i = len - count; i < len; ++i)
814 result->value.character.string[i] = ' ';
816 result->value.character.string[len] = '\0'; /* For debugger */
818 return result;
822 gfc_expr *
823 gfc_simplify_adjustr (gfc_expr *e)
825 gfc_expr *result;
826 int count, i, len;
827 gfc_char_t ch;
829 if (e->expr_type != EXPR_CONSTANT)
830 return NULL;
832 len = e->value.character.length;
834 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
836 result->value.character.length = len;
837 result->value.character.string = gfc_get_wide_string (len + 1);
839 for (count = 0, i = len - 1; i >= 0; --i)
841 ch = e->value.character.string[i];
842 if (ch != ' ')
843 break;
844 ++count;
847 for (i = 0; i < count; ++i)
848 result->value.character.string[i] = ' ';
850 for (i = count; i < len; ++i)
851 result->value.character.string[i] = e->value.character.string[i - count];
853 result->value.character.string[len] = '\0'; /* For debugger */
855 return result;
859 gfc_expr *
860 gfc_simplify_aimag (gfc_expr *e)
862 gfc_expr *result;
864 if (e->expr_type != EXPR_CONSTANT)
865 return NULL;
867 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
868 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
870 return range_check (result, "AIMAG");
874 gfc_expr *
875 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
877 gfc_expr *rtrunc, *result;
878 int kind;
880 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
881 if (kind == -1)
882 return &gfc_bad_expr;
884 if (e->expr_type != EXPR_CONSTANT)
885 return NULL;
887 rtrunc = gfc_copy_expr (e);
889 mpfr_trunc (rtrunc->value.real, e->value.real);
891 result = gfc_real2real (rtrunc, kind);
892 gfc_free_expr (rtrunc);
894 return range_check (result, "AINT");
898 gfc_expr *
899 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
901 gfc_expr *result;
903 if (!is_constant_array_expr (mask)
904 || !gfc_is_constant_expr (dim))
905 return NULL;
907 result = transformational_result (mask, dim, mask->ts.type,
908 mask->ts.kind, &mask->where);
909 init_result_expr (result, true, NULL);
911 return !dim || mask->rank == 1 ?
912 simplify_transformation_to_scalar (result, mask, NULL, gfc_and) :
913 simplify_transformation_to_array (result, mask, dim, NULL, gfc_and);
917 gfc_expr *
918 gfc_simplify_dint (gfc_expr *e)
920 gfc_expr *rtrunc, *result;
922 if (e->expr_type != EXPR_CONSTANT)
923 return NULL;
925 rtrunc = gfc_copy_expr (e);
927 mpfr_trunc (rtrunc->value.real, e->value.real);
929 result = gfc_real2real (rtrunc, gfc_default_double_kind);
930 gfc_free_expr (rtrunc);
932 return range_check (result, "DINT");
936 gfc_expr *
937 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
939 gfc_expr *result;
940 int kind;
942 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
943 if (kind == -1)
944 return &gfc_bad_expr;
946 if (e->expr_type != EXPR_CONSTANT)
947 return NULL;
949 result = gfc_constant_result (e->ts.type, kind, &e->where);
951 mpfr_round (result->value.real, e->value.real);
953 return range_check (result, "ANINT");
957 gfc_expr *
958 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
960 gfc_expr *result;
961 int kind;
963 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
964 return NULL;
966 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
967 if (x->ts.type == BT_INTEGER)
969 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
970 mpz_and (result->value.integer, x->value.integer, y->value.integer);
971 return range_check (result, "AND");
973 else /* BT_LOGICAL */
975 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
976 result->value.logical = x->value.logical && y->value.logical;
977 return result;
982 gfc_expr *
983 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
985 gfc_expr *result;
987 if (!is_constant_array_expr (mask)
988 || !gfc_is_constant_expr (dim))
989 return NULL;
991 result = transformational_result (mask, dim, mask->ts.type,
992 mask->ts.kind, &mask->where);
993 init_result_expr (result, false, NULL);
995 return !dim || mask->rank == 1 ?
996 simplify_transformation_to_scalar (result, mask, NULL, gfc_or) :
997 simplify_transformation_to_array (result, mask, dim, NULL, gfc_or);
1001 gfc_expr *
1002 gfc_simplify_dnint (gfc_expr *e)
1004 gfc_expr *result;
1006 if (e->expr_type != EXPR_CONSTANT)
1007 return NULL;
1009 result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &e->where);
1011 mpfr_round (result->value.real, e->value.real);
1013 return range_check (result, "DNINT");
1017 gfc_expr *
1018 gfc_simplify_asin (gfc_expr *x)
1020 gfc_expr *result;
1022 if (x->expr_type != EXPR_CONSTANT)
1023 return NULL;
1025 switch (x->ts.type)
1027 case BT_REAL:
1028 if (mpfr_cmp_si (x->value.real, 1) > 0
1029 || mpfr_cmp_si (x->value.real, -1) < 0)
1031 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1032 &x->where);
1033 return &gfc_bad_expr;
1035 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1036 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1037 break;
1038 case BT_COMPLEX:
1039 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1040 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1041 break;
1042 default:
1043 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1046 return range_check (result, "ASIN");
1050 gfc_expr *
1051 gfc_simplify_asinh (gfc_expr *x)
1053 gfc_expr *result;
1055 if (x->expr_type != EXPR_CONSTANT)
1056 return NULL;
1058 switch (x->ts.type)
1060 case BT_REAL:
1061 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1062 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1063 break;
1064 case BT_COMPLEX:
1065 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1066 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1067 break;
1068 default:
1069 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1072 return range_check (result, "ASINH");
1076 gfc_expr *
1077 gfc_simplify_atan (gfc_expr *x)
1079 gfc_expr *result;
1081 if (x->expr_type != EXPR_CONSTANT)
1082 return NULL;
1084 switch (x->ts.type)
1086 case BT_REAL:
1087 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1088 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1089 break;
1090 case BT_COMPLEX:
1091 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1092 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1093 break;
1094 default:
1095 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1098 return range_check (result, "ATAN");
1102 gfc_expr *
1103 gfc_simplify_atanh (gfc_expr *x)
1105 gfc_expr *result;
1107 if (x->expr_type != EXPR_CONSTANT)
1108 return NULL;
1110 switch (x->ts.type)
1112 case BT_REAL:
1113 if (mpfr_cmp_si (x->value.real, 1) >= 0
1114 || mpfr_cmp_si (x->value.real, -1) <= 0)
1116 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1117 "to 1", &x->where);
1118 return &gfc_bad_expr;
1121 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1122 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1123 break;
1124 case BT_COMPLEX:
1125 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1126 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1127 break;
1128 default:
1129 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1132 return range_check (result, "ATANH");
1136 gfc_expr *
1137 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1139 gfc_expr *result;
1141 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1142 return NULL;
1144 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
1146 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1147 "second argument must not be zero", &x->where);
1148 return &gfc_bad_expr;
1151 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1153 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1155 return range_check (result, "ATAN2");
1159 gfc_expr *
1160 gfc_simplify_bessel_j0 (gfc_expr *x ATTRIBUTE_UNUSED)
1162 gfc_expr *result;
1164 if (x->expr_type != EXPR_CONSTANT)
1165 return NULL;
1167 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1168 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1170 return range_check (result, "BESSEL_J0");
1174 gfc_expr *
1175 gfc_simplify_bessel_j1 (gfc_expr *x ATTRIBUTE_UNUSED)
1177 gfc_expr *result;
1179 if (x->expr_type != EXPR_CONSTANT)
1180 return NULL;
1182 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1183 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1185 return range_check (result, "BESSEL_J1");
1189 gfc_expr *
1190 gfc_simplify_bessel_jn (gfc_expr *order ATTRIBUTE_UNUSED,
1191 gfc_expr *x ATTRIBUTE_UNUSED)
1193 gfc_expr *result;
1194 long n;
1196 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1197 return NULL;
1199 n = mpz_get_si (order->value.integer);
1200 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1201 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1203 return range_check (result, "BESSEL_JN");
1207 gfc_expr *
1208 gfc_simplify_bessel_y0 (gfc_expr *x ATTRIBUTE_UNUSED)
1210 gfc_expr *result;
1212 if (x->expr_type != EXPR_CONSTANT)
1213 return NULL;
1215 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1216 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1218 return range_check (result, "BESSEL_Y0");
1222 gfc_expr *
1223 gfc_simplify_bessel_y1 (gfc_expr *x ATTRIBUTE_UNUSED)
1225 gfc_expr *result;
1227 if (x->expr_type != EXPR_CONSTANT)
1228 return NULL;
1230 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1231 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1233 return range_check (result, "BESSEL_Y1");
1237 gfc_expr *
1238 gfc_simplify_bessel_yn (gfc_expr *order ATTRIBUTE_UNUSED,
1239 gfc_expr *x ATTRIBUTE_UNUSED)
1241 gfc_expr *result;
1242 long n;
1244 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1245 return NULL;
1247 n = mpz_get_si (order->value.integer);
1248 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1249 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1251 return range_check (result, "BESSEL_YN");
1255 gfc_expr *
1256 gfc_simplify_bit_size (gfc_expr *e)
1258 gfc_expr *result;
1259 int i;
1261 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1262 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
1263 mpz_set_ui (result->value.integer, gfc_integer_kinds[i].bit_size);
1265 return result;
1269 gfc_expr *
1270 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1272 int b;
1274 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1275 return NULL;
1277 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1278 return gfc_logical_expr (0, &e->where);
1280 return gfc_logical_expr (mpz_tstbit (e->value.integer, b), &e->where);
1284 gfc_expr *
1285 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1287 gfc_expr *ceil, *result;
1288 int kind;
1290 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1291 if (kind == -1)
1292 return &gfc_bad_expr;
1294 if (e->expr_type != EXPR_CONSTANT)
1295 return NULL;
1297 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1299 ceil = gfc_copy_expr (e);
1301 mpfr_ceil (ceil->value.real, e->value.real);
1302 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1304 gfc_free_expr (ceil);
1306 return range_check (result, "CEILING");
1310 gfc_expr *
1311 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1313 return simplify_achar_char (e, k, "CHAR", false);
1317 /* Common subroutine for simplifying CMPLX and DCMPLX. */
1319 static gfc_expr *
1320 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1322 gfc_expr *result;
1324 result = gfc_constant_result (BT_COMPLEX, kind, &x->where);
1326 switch (x->ts.type)
1328 case BT_INTEGER:
1329 if (!x->is_boz)
1330 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1331 break;
1333 case BT_REAL:
1334 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1335 break;
1337 case BT_COMPLEX:
1338 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1339 break;
1341 default:
1342 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1345 if (y != NULL)
1347 switch (y->ts.type)
1349 case BT_INTEGER:
1350 if (!y->is_boz)
1351 mpfr_set_z (mpc_imagref (result->value.complex),
1352 y->value.integer, GFC_RND_MODE);
1353 break;
1355 case BT_REAL:
1356 mpfr_set (mpc_imagref (result->value.complex),
1357 y->value.real, GFC_RND_MODE);
1358 break;
1360 default:
1361 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1365 /* Handle BOZ. */
1366 if (x->is_boz)
1368 gfc_typespec ts;
1369 gfc_clear_ts (&ts);
1370 ts.kind = result->ts.kind;
1371 ts.type = BT_REAL;
1372 if (!gfc_convert_boz (x, &ts))
1373 return &gfc_bad_expr;
1374 mpfr_set (mpc_realref (result->value.complex),
1375 x->value.real, GFC_RND_MODE);
1378 if (y && y->is_boz)
1380 gfc_typespec ts;
1381 gfc_clear_ts (&ts);
1382 ts.kind = result->ts.kind;
1383 ts.type = BT_REAL;
1384 if (!gfc_convert_boz (y, &ts))
1385 return &gfc_bad_expr;
1386 mpfr_set (mpc_imagref (result->value.complex),
1387 y->value.real, GFC_RND_MODE);
1390 return range_check (result, name);
1394 /* Function called when we won't simplify an expression like CMPLX (or
1395 COMPLEX or DCMPLX) but still want to convert BOZ arguments. */
1397 static gfc_expr *
1398 only_convert_cmplx_boz (gfc_expr *x, gfc_expr *y, int kind)
1400 gfc_typespec ts;
1401 gfc_clear_ts (&ts);
1402 ts.type = BT_REAL;
1403 ts.kind = kind;
1405 if (x->is_boz && !gfc_convert_boz (x, &ts))
1406 return &gfc_bad_expr;
1408 if (y && y->is_boz && !gfc_convert_boz (y, &ts))
1409 return &gfc_bad_expr;
1411 return NULL;
1415 gfc_expr *
1416 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1418 int kind;
1420 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_real_kind);
1421 if (kind == -1)
1422 return &gfc_bad_expr;
1424 if (x->expr_type != EXPR_CONSTANT
1425 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1426 return only_convert_cmplx_boz (x, y, kind);
1428 return simplify_cmplx ("CMPLX", x, y, kind);
1432 gfc_expr *
1433 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1435 int kind;
1437 if (x->ts.type == BT_INTEGER)
1439 if (y->ts.type == BT_INTEGER)
1440 kind = gfc_default_real_kind;
1441 else
1442 kind = y->ts.kind;
1444 else
1446 if (y->ts.type == BT_REAL)
1447 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1448 else
1449 kind = x->ts.kind;
1452 if (x->expr_type != EXPR_CONSTANT
1453 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1454 return only_convert_cmplx_boz (x, y, kind);
1456 return simplify_cmplx ("COMPLEX", x, y, kind);
1460 gfc_expr *
1461 gfc_simplify_conjg (gfc_expr *e)
1463 gfc_expr *result;
1465 if (e->expr_type != EXPR_CONSTANT)
1466 return NULL;
1468 result = gfc_copy_expr (e);
1469 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1470 return range_check (result, "CONJG");
1474 gfc_expr *
1475 gfc_simplify_cos (gfc_expr *x)
1477 gfc_expr *result;
1479 if (x->expr_type != EXPR_CONSTANT)
1480 return NULL;
1482 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1484 switch (x->ts.type)
1486 case BT_REAL:
1487 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1488 break;
1489 case BT_COMPLEX:
1490 gfc_set_model_kind (x->ts.kind);
1491 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1492 break;
1493 default:
1494 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1497 return range_check (result, "COS");
1502 gfc_expr *
1503 gfc_simplify_cosh (gfc_expr *x)
1505 gfc_expr *result;
1507 if (x->expr_type != EXPR_CONSTANT)
1508 return NULL;
1510 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1512 if (x->ts.type == BT_REAL)
1513 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1514 else if (x->ts.type == BT_COMPLEX)
1515 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1516 else
1517 gcc_unreachable ();
1519 return range_check (result, "COSH");
1523 gfc_expr *
1524 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1526 gfc_expr *result;
1528 if (!is_constant_array_expr (mask)
1529 || !gfc_is_constant_expr (dim)
1530 || !gfc_is_constant_expr (kind))
1531 return NULL;
1533 result = transformational_result (mask, dim,
1534 BT_INTEGER,
1535 get_kind (BT_INTEGER, kind, "COUNT",
1536 gfc_default_integer_kind),
1537 &mask->where);
1539 init_result_expr (result, 0, NULL);
1541 /* Passing MASK twice, once as data array, once as mask.
1542 Whenever gfc_count is called, '1' is added to the result. */
1543 return !dim || mask->rank == 1 ?
1544 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1545 simplify_transformation_to_array (result, mask, dim, mask, gfc_count);
1549 gfc_expr *
1550 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
1553 if (x->expr_type != EXPR_CONSTANT
1554 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1555 return only_convert_cmplx_boz (x, y, gfc_default_double_kind);
1557 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
1561 gfc_expr *
1562 gfc_simplify_dble (gfc_expr *e)
1564 gfc_expr *result = NULL;
1566 if (e->expr_type != EXPR_CONSTANT)
1567 return NULL;
1569 switch (e->ts.type)
1571 case BT_INTEGER:
1572 if (!e->is_boz)
1573 result = gfc_int2real (e, gfc_default_double_kind);
1574 break;
1576 case BT_REAL:
1577 result = gfc_real2real (e, gfc_default_double_kind);
1578 break;
1580 case BT_COMPLEX:
1581 result = gfc_complex2real (e, gfc_default_double_kind);
1582 break;
1584 default:
1585 gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e->where);
1588 if (e->ts.type == BT_INTEGER && e->is_boz)
1590 gfc_typespec ts;
1591 gfc_clear_ts (&ts);
1592 ts.type = BT_REAL;
1593 ts.kind = gfc_default_double_kind;
1594 result = gfc_copy_expr (e);
1595 if (!gfc_convert_boz (result, &ts))
1597 gfc_free_expr (result);
1598 return &gfc_bad_expr;
1602 return range_check (result, "DBLE");
1606 gfc_expr *
1607 gfc_simplify_digits (gfc_expr *x)
1609 int i, digits;
1611 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1612 switch (x->ts.type)
1614 case BT_INTEGER:
1615 digits = gfc_integer_kinds[i].digits;
1616 break;
1618 case BT_REAL:
1619 case BT_COMPLEX:
1620 digits = gfc_real_kinds[i].digits;
1621 break;
1623 default:
1624 gcc_unreachable ();
1627 return gfc_int_expr (digits);
1631 gfc_expr *
1632 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1634 gfc_expr *result;
1635 int kind;
1637 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1638 return NULL;
1640 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1641 result = gfc_constant_result (x->ts.type, kind, &x->where);
1643 switch (x->ts.type)
1645 case BT_INTEGER:
1646 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1647 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1648 else
1649 mpz_set_ui (result->value.integer, 0);
1651 break;
1653 case BT_REAL:
1654 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1655 mpfr_sub (result->value.real, x->value.real, y->value.real,
1656 GFC_RND_MODE);
1657 else
1658 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1660 break;
1662 default:
1663 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1666 return range_check (result, "DIM");
1670 gfc_expr*
1671 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
1673 gfc_expr *result;
1675 if (!is_constant_array_expr (vector_a)
1676 || !is_constant_array_expr (vector_b))
1677 return NULL;
1679 gcc_assert (vector_a->rank == 1);
1680 gcc_assert (vector_b->rank == 1);
1681 gcc_assert (gfc_compare_types (&vector_a->ts, &vector_b->ts));
1683 if (vector_a->value.constructor && vector_b->value.constructor)
1684 return compute_dot_product (vector_a->value.constructor, 1,
1685 vector_b->value.constructor, 1);
1687 /* Zero sized array ... */
1688 result = gfc_constant_result (vector_a->ts.type,
1689 vector_a->ts.kind,
1690 &vector_a->where);
1691 init_result_expr (result, 0, NULL);
1692 return result;
1696 gfc_expr *
1697 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1699 gfc_expr *a1, *a2, *result;
1701 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1702 return NULL;
1704 result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &x->where);
1706 a1 = gfc_real2real (x, gfc_default_double_kind);
1707 a2 = gfc_real2real (y, gfc_default_double_kind);
1709 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1711 gfc_free_expr (a1);
1712 gfc_free_expr (a2);
1714 return range_check (result, "DPROD");
1718 gfc_expr *
1719 gfc_simplify_erf (gfc_expr *x)
1721 gfc_expr *result;
1723 if (x->expr_type != EXPR_CONSTANT)
1724 return NULL;
1726 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1728 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1730 return range_check (result, "ERF");
1734 gfc_expr *
1735 gfc_simplify_erfc (gfc_expr *x)
1737 gfc_expr *result;
1739 if (x->expr_type != EXPR_CONSTANT)
1740 return NULL;
1742 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1744 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1746 return range_check (result, "ERFC");
1750 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
1752 #define MAX_ITER 200
1753 #define ARG_LIMIT 12
1755 /* Calculate ERFC_SCALED directly by its definition:
1757 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
1759 using a large precision for intermediate results. This is used for all
1760 but large values of the argument. */
1761 static void
1762 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
1764 mp_prec_t prec;
1765 mpfr_t a, b;
1767 prec = mpfr_get_default_prec ();
1768 mpfr_set_default_prec (10 * prec);
1770 mpfr_init (a);
1771 mpfr_init (b);
1773 mpfr_set (a, arg, GFC_RND_MODE);
1774 mpfr_sqr (b, a, GFC_RND_MODE);
1775 mpfr_exp (b, b, GFC_RND_MODE);
1776 mpfr_erfc (a, a, GFC_RND_MODE);
1777 mpfr_mul (a, a, b, GFC_RND_MODE);
1779 mpfr_set (res, a, GFC_RND_MODE);
1780 mpfr_set_default_prec (prec);
1782 mpfr_clear (a);
1783 mpfr_clear (b);
1786 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
1788 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
1789 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
1790 / (2 * x**2)**n)
1792 This is used for large values of the argument. Intermediate calculations
1793 are performed with twice the precision. We don't do a fixed number of
1794 iterations of the sum, but stop when it has converged to the required
1795 precision. */
1796 static void
1797 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
1799 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
1800 mpz_t num;
1801 mp_prec_t prec;
1802 unsigned i;
1804 prec = mpfr_get_default_prec ();
1805 mpfr_set_default_prec (2 * prec);
1807 mpfr_init (sum);
1808 mpfr_init (x);
1809 mpfr_init (u);
1810 mpfr_init (v);
1811 mpfr_init (w);
1812 mpz_init (num);
1814 mpfr_init (oldsum);
1815 mpfr_init (sumtrunc);
1816 mpfr_set_prec (oldsum, prec);
1817 mpfr_set_prec (sumtrunc, prec);
1819 mpfr_set (x, arg, GFC_RND_MODE);
1820 mpfr_set_ui (sum, 1, GFC_RND_MODE);
1821 mpz_set_ui (num, 1);
1823 mpfr_set (u, x, GFC_RND_MODE);
1824 mpfr_sqr (u, u, GFC_RND_MODE);
1825 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
1826 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
1828 for (i = 1; i < MAX_ITER; i++)
1830 mpfr_set (oldsum, sum, GFC_RND_MODE);
1832 mpz_mul_ui (num, num, 2 * i - 1);
1833 mpz_neg (num, num);
1835 mpfr_set (w, u, GFC_RND_MODE);
1836 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
1838 mpfr_set_z (v, num, GFC_RND_MODE);
1839 mpfr_mul (v, v, w, GFC_RND_MODE);
1841 mpfr_add (sum, sum, v, GFC_RND_MODE);
1843 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
1844 if (mpfr_cmp (sumtrunc, oldsum) == 0)
1845 break;
1848 /* We should have converged by now; otherwise, ARG_LIMIT is probably
1849 set too low. */
1850 gcc_assert (i < MAX_ITER);
1852 /* Divide by x * sqrt(Pi). */
1853 mpfr_const_pi (u, GFC_RND_MODE);
1854 mpfr_sqrt (u, u, GFC_RND_MODE);
1855 mpfr_mul (u, u, x, GFC_RND_MODE);
1856 mpfr_div (sum, sum, u, GFC_RND_MODE);
1858 mpfr_set (res, sum, GFC_RND_MODE);
1859 mpfr_set_default_prec (prec);
1861 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
1862 mpz_clear (num);
1866 gfc_expr *
1867 gfc_simplify_erfc_scaled (gfc_expr *x)
1869 gfc_expr *result;
1871 if (x->expr_type != EXPR_CONSTANT)
1872 return NULL;
1874 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1875 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
1876 asympt_erfc_scaled (result->value.real, x->value.real);
1877 else
1878 fullprec_erfc_scaled (result->value.real, x->value.real);
1880 return range_check (result, "ERFC_SCALED");
1883 #undef MAX_ITER
1884 #undef ARG_LIMIT
1887 gfc_expr *
1888 gfc_simplify_epsilon (gfc_expr *e)
1890 gfc_expr *result;
1891 int i;
1893 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1895 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
1897 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
1899 return range_check (result, "EPSILON");
1903 gfc_expr *
1904 gfc_simplify_exp (gfc_expr *x)
1906 gfc_expr *result;
1908 if (x->expr_type != EXPR_CONSTANT)
1909 return NULL;
1911 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1913 switch (x->ts.type)
1915 case BT_REAL:
1916 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
1917 break;
1919 case BT_COMPLEX:
1920 gfc_set_model_kind (x->ts.kind);
1921 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1922 break;
1924 default:
1925 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
1928 return range_check (result, "EXP");
1931 gfc_expr *
1932 gfc_simplify_exponent (gfc_expr *x)
1934 int i;
1935 gfc_expr *result;
1937 if (x->expr_type != EXPR_CONSTANT)
1938 return NULL;
1940 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1941 &x->where);
1943 gfc_set_model (x->value.real);
1945 if (mpfr_sgn (x->value.real) == 0)
1947 mpz_set_ui (result->value.integer, 0);
1948 return result;
1951 i = (int) mpfr_get_exp (x->value.real);
1952 mpz_set_si (result->value.integer, i);
1954 return range_check (result, "EXPONENT");
1958 gfc_expr *
1959 gfc_simplify_float (gfc_expr *a)
1961 gfc_expr *result;
1963 if (a->expr_type != EXPR_CONSTANT)
1964 return NULL;
1966 if (a->is_boz)
1968 gfc_typespec ts;
1969 gfc_clear_ts (&ts);
1971 ts.type = BT_REAL;
1972 ts.kind = gfc_default_real_kind;
1974 result = gfc_copy_expr (a);
1975 if (!gfc_convert_boz (result, &ts))
1977 gfc_free_expr (result);
1978 return &gfc_bad_expr;
1981 else
1982 result = gfc_int2real (a, gfc_default_real_kind);
1983 return range_check (result, "FLOAT");
1987 gfc_expr *
1988 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
1990 gfc_expr *result;
1991 mpfr_t floor;
1992 int kind;
1994 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
1995 if (kind == -1)
1996 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
1998 if (e->expr_type != EXPR_CONSTANT)
1999 return NULL;
2001 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
2003 gfc_set_model_kind (kind);
2004 mpfr_init (floor);
2005 mpfr_floor (floor, e->value.real);
2007 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2009 mpfr_clear (floor);
2011 return range_check (result, "FLOOR");
2015 gfc_expr *
2016 gfc_simplify_fraction (gfc_expr *x)
2018 gfc_expr *result;
2019 mpfr_t absv, exp, pow2;
2021 if (x->expr_type != EXPR_CONSTANT)
2022 return NULL;
2024 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
2026 if (mpfr_sgn (x->value.real) == 0)
2028 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2029 return result;
2032 gfc_set_model_kind (x->ts.kind);
2033 mpfr_init (exp);
2034 mpfr_init (absv);
2035 mpfr_init (pow2);
2037 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2038 mpfr_log2 (exp, absv, GFC_RND_MODE);
2040 mpfr_trunc (exp, exp);
2041 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2043 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2045 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
2047 mpfr_clears (exp, absv, pow2, NULL);
2049 return range_check (result, "FRACTION");
2053 gfc_expr *
2054 gfc_simplify_gamma (gfc_expr *x)
2056 gfc_expr *result;
2058 if (x->expr_type != EXPR_CONSTANT)
2059 return NULL;
2061 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2063 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2065 return range_check (result, "GAMMA");
2069 gfc_expr *
2070 gfc_simplify_huge (gfc_expr *e)
2072 gfc_expr *result;
2073 int i;
2075 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2077 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2079 switch (e->ts.type)
2081 case BT_INTEGER:
2082 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2083 break;
2085 case BT_REAL:
2086 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2087 break;
2089 default:
2090 gcc_unreachable ();
2093 return result;
2097 gfc_expr *
2098 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2100 gfc_expr *result;
2102 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2103 return NULL;
2105 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2106 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2107 return range_check (result, "HYPOT");
2111 /* We use the processor's collating sequence, because all
2112 systems that gfortran currently works on are ASCII. */
2114 gfc_expr *
2115 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2117 gfc_expr *result;
2118 gfc_char_t index;
2120 if (e->expr_type != EXPR_CONSTANT)
2121 return NULL;
2123 if (e->value.character.length != 1)
2125 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2126 return &gfc_bad_expr;
2129 index = e->value.character.string[0];
2131 if (gfc_option.warn_surprising && index > 127)
2132 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2133 &e->where);
2135 if ((result = int_expr_with_kind (index, kind, "IACHAR")) == NULL)
2136 return &gfc_bad_expr;
2138 result->where = e->where;
2140 return range_check (result, "IACHAR");
2144 gfc_expr *
2145 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2147 gfc_expr *result;
2149 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2150 return NULL;
2152 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
2154 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2156 return range_check (result, "IAND");
2160 gfc_expr *
2161 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2163 gfc_expr *result;
2164 int k, pos;
2166 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2167 return NULL;
2169 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2171 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
2172 return &gfc_bad_expr;
2175 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2177 if (pos >= gfc_integer_kinds[k].bit_size)
2179 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
2180 &y->where);
2181 return &gfc_bad_expr;
2184 result = gfc_copy_expr (x);
2186 convert_mpz_to_unsigned (result->value.integer,
2187 gfc_integer_kinds[k].bit_size);
2189 mpz_clrbit (result->value.integer, pos);
2191 convert_mpz_to_signed (result->value.integer,
2192 gfc_integer_kinds[k].bit_size);
2194 return result;
2198 gfc_expr *
2199 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2201 gfc_expr *result;
2202 int pos, len;
2203 int i, k, bitsize;
2204 int *bits;
2206 if (x->expr_type != EXPR_CONSTANT
2207 || y->expr_type != EXPR_CONSTANT
2208 || z->expr_type != EXPR_CONSTANT)
2209 return NULL;
2211 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2213 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
2214 return &gfc_bad_expr;
2217 if (gfc_extract_int (z, &len) != NULL || len < 0)
2219 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
2220 return &gfc_bad_expr;
2223 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2225 bitsize = gfc_integer_kinds[k].bit_size;
2227 if (pos + len > bitsize)
2229 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2230 "bit size at %L", &y->where);
2231 return &gfc_bad_expr;
2234 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2235 convert_mpz_to_unsigned (result->value.integer,
2236 gfc_integer_kinds[k].bit_size);
2238 bits = XCNEWVEC (int, bitsize);
2240 for (i = 0; i < bitsize; i++)
2241 bits[i] = 0;
2243 for (i = 0; i < len; i++)
2244 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2246 for (i = 0; i < bitsize; i++)
2248 if (bits[i] == 0)
2249 mpz_clrbit (result->value.integer, i);
2250 else if (bits[i] == 1)
2251 mpz_setbit (result->value.integer, i);
2252 else
2253 gfc_internal_error ("IBITS: Bad bit");
2256 gfc_free (bits);
2258 convert_mpz_to_signed (result->value.integer,
2259 gfc_integer_kinds[k].bit_size);
2261 return result;
2265 gfc_expr *
2266 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2268 gfc_expr *result;
2269 int k, pos;
2271 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2272 return NULL;
2274 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2276 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
2277 return &gfc_bad_expr;
2280 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2282 if (pos >= gfc_integer_kinds[k].bit_size)
2284 gfc_error ("Second argument of IBSET exceeds bit size at %L",
2285 &y->where);
2286 return &gfc_bad_expr;
2289 result = gfc_copy_expr (x);
2291 convert_mpz_to_unsigned (result->value.integer,
2292 gfc_integer_kinds[k].bit_size);
2294 mpz_setbit (result->value.integer, pos);
2296 convert_mpz_to_signed (result->value.integer,
2297 gfc_integer_kinds[k].bit_size);
2299 return result;
2303 gfc_expr *
2304 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2306 gfc_expr *result;
2307 gfc_char_t index;
2309 if (e->expr_type != EXPR_CONSTANT)
2310 return NULL;
2312 if (e->value.character.length != 1)
2314 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2315 return &gfc_bad_expr;
2318 index = e->value.character.string[0];
2320 if ((result = int_expr_with_kind (index, kind, "ICHAR")) == NULL)
2321 return &gfc_bad_expr;
2323 result->where = e->where;
2324 return range_check (result, "ICHAR");
2328 gfc_expr *
2329 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2331 gfc_expr *result;
2333 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2334 return NULL;
2336 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
2338 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2340 return range_check (result, "IEOR");
2344 gfc_expr *
2345 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2347 gfc_expr *result;
2348 int back, len, lensub;
2349 int i, j, k, count, index = 0, start;
2351 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2352 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2353 return NULL;
2355 if (b != NULL && b->value.logical != 0)
2356 back = 1;
2357 else
2358 back = 0;
2360 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2361 if (k == -1)
2362 return &gfc_bad_expr;
2364 result = gfc_constant_result (BT_INTEGER, k, &x->where);
2366 len = x->value.character.length;
2367 lensub = y->value.character.length;
2369 if (len < lensub)
2371 mpz_set_si (result->value.integer, 0);
2372 return result;
2375 if (back == 0)
2377 if (lensub == 0)
2379 mpz_set_si (result->value.integer, 1);
2380 return result;
2382 else if (lensub == 1)
2384 for (i = 0; i < len; i++)
2386 for (j = 0; j < lensub; j++)
2388 if (y->value.character.string[j]
2389 == x->value.character.string[i])
2391 index = i + 1;
2392 goto done;
2397 else
2399 for (i = 0; i < len; i++)
2401 for (j = 0; j < lensub; j++)
2403 if (y->value.character.string[j]
2404 == x->value.character.string[i])
2406 start = i;
2407 count = 0;
2409 for (k = 0; k < lensub; k++)
2411 if (y->value.character.string[k]
2412 == x->value.character.string[k + start])
2413 count++;
2416 if (count == lensub)
2418 index = start + 1;
2419 goto done;
2427 else
2429 if (lensub == 0)
2431 mpz_set_si (result->value.integer, len + 1);
2432 return result;
2434 else if (lensub == 1)
2436 for (i = 0; i < len; i++)
2438 for (j = 0; j < lensub; j++)
2440 if (y->value.character.string[j]
2441 == x->value.character.string[len - i])
2443 index = len - i + 1;
2444 goto done;
2449 else
2451 for (i = 0; i < len; i++)
2453 for (j = 0; j < lensub; j++)
2455 if (y->value.character.string[j]
2456 == x->value.character.string[len - i])
2458 start = len - i;
2459 if (start <= len - lensub)
2461 count = 0;
2462 for (k = 0; k < lensub; k++)
2463 if (y->value.character.string[k]
2464 == x->value.character.string[k + start])
2465 count++;
2467 if (count == lensub)
2469 index = start + 1;
2470 goto done;
2473 else
2475 continue;
2483 done:
2484 mpz_set_si (result->value.integer, index);
2485 return range_check (result, "INDEX");
2489 gfc_expr *
2490 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
2492 gfc_expr *result = NULL;
2493 int kind;
2495 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
2496 if (kind == -1)
2497 return &gfc_bad_expr;
2499 if (e->expr_type != EXPR_CONSTANT)
2500 return NULL;
2502 switch (e->ts.type)
2504 case BT_INTEGER:
2505 result = gfc_int2int (e, kind);
2506 break;
2508 case BT_REAL:
2509 result = gfc_real2int (e, kind);
2510 break;
2512 case BT_COMPLEX:
2513 result = gfc_complex2int (e, kind);
2514 break;
2516 default:
2517 gfc_error ("Argument of INT at %L is not a valid type", &e->where);
2518 return &gfc_bad_expr;
2521 return range_check (result, "INT");
2525 static gfc_expr *
2526 simplify_intconv (gfc_expr *e, int kind, const char *name)
2528 gfc_expr *result = NULL;
2530 if (e->expr_type != EXPR_CONSTANT)
2531 return NULL;
2533 switch (e->ts.type)
2535 case BT_INTEGER:
2536 result = gfc_int2int (e, kind);
2537 break;
2539 case BT_REAL:
2540 result = gfc_real2int (e, kind);
2541 break;
2543 case BT_COMPLEX:
2544 result = gfc_complex2int (e, kind);
2545 break;
2547 default:
2548 gfc_error ("Argument of %s at %L is not a valid type", name, &e->where);
2549 return &gfc_bad_expr;
2552 return range_check (result, name);
2556 gfc_expr *
2557 gfc_simplify_int2 (gfc_expr *e)
2559 return simplify_intconv (e, 2, "INT2");
2563 gfc_expr *
2564 gfc_simplify_int8 (gfc_expr *e)
2566 return simplify_intconv (e, 8, "INT8");
2570 gfc_expr *
2571 gfc_simplify_long (gfc_expr *e)
2573 return simplify_intconv (e, 4, "LONG");
2577 gfc_expr *
2578 gfc_simplify_ifix (gfc_expr *e)
2580 gfc_expr *rtrunc, *result;
2582 if (e->expr_type != EXPR_CONSTANT)
2583 return NULL;
2585 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
2586 &e->where);
2588 rtrunc = gfc_copy_expr (e);
2590 mpfr_trunc (rtrunc->value.real, e->value.real);
2591 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2593 gfc_free_expr (rtrunc);
2594 return range_check (result, "IFIX");
2598 gfc_expr *
2599 gfc_simplify_idint (gfc_expr *e)
2601 gfc_expr *rtrunc, *result;
2603 if (e->expr_type != EXPR_CONSTANT)
2604 return NULL;
2606 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
2607 &e->where);
2609 rtrunc = gfc_copy_expr (e);
2611 mpfr_trunc (rtrunc->value.real, e->value.real);
2612 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2614 gfc_free_expr (rtrunc);
2615 return range_check (result, "IDINT");
2619 gfc_expr *
2620 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
2622 gfc_expr *result;
2624 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2625 return NULL;
2627 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
2629 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2630 return range_check (result, "IOR");
2634 gfc_expr *
2635 gfc_simplify_is_iostat_end (gfc_expr *x)
2637 gfc_expr *result;
2639 if (x->expr_type != EXPR_CONSTANT)
2640 return NULL;
2642 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
2643 &x->where);
2644 result->value.logical = (mpz_cmp_si (x->value.integer, LIBERROR_END) == 0);
2646 return result;
2650 gfc_expr *
2651 gfc_simplify_is_iostat_eor (gfc_expr *x)
2653 gfc_expr *result;
2655 if (x->expr_type != EXPR_CONSTANT)
2656 return NULL;
2658 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
2659 &x->where);
2660 result->value.logical = (mpz_cmp_si (x->value.integer, LIBERROR_EOR) == 0);
2662 return result;
2666 gfc_expr *
2667 gfc_simplify_isnan (gfc_expr *x)
2669 gfc_expr *result;
2671 if (x->expr_type != EXPR_CONSTANT)
2672 return NULL;
2674 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
2675 &x->where);
2676 result->value.logical = mpfr_nan_p (x->value.real);
2678 return result;
2682 gfc_expr *
2683 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
2685 gfc_expr *result;
2686 int shift, ashift, isize, k, *bits, i;
2688 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2689 return NULL;
2691 if (gfc_extract_int (s, &shift) != NULL)
2693 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
2694 return &gfc_bad_expr;
2697 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2699 isize = gfc_integer_kinds[k].bit_size;
2701 if (shift >= 0)
2702 ashift = shift;
2703 else
2704 ashift = -shift;
2706 if (ashift > isize)
2708 gfc_error ("Magnitude of second argument of ISHFT exceeds bit size "
2709 "at %L", &s->where);
2710 return &gfc_bad_expr;
2713 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2715 if (shift == 0)
2717 mpz_set (result->value.integer, e->value.integer);
2718 return range_check (result, "ISHFT");
2721 bits = XCNEWVEC (int, isize);
2723 for (i = 0; i < isize; i++)
2724 bits[i] = mpz_tstbit (e->value.integer, i);
2726 if (shift > 0)
2728 for (i = 0; i < shift; i++)
2729 mpz_clrbit (result->value.integer, i);
2731 for (i = 0; i < isize - shift; i++)
2733 if (bits[i] == 0)
2734 mpz_clrbit (result->value.integer, i + shift);
2735 else
2736 mpz_setbit (result->value.integer, i + shift);
2739 else
2741 for (i = isize - 1; i >= isize - ashift; i--)
2742 mpz_clrbit (result->value.integer, i);
2744 for (i = isize - 1; i >= ashift; i--)
2746 if (bits[i] == 0)
2747 mpz_clrbit (result->value.integer, i - ashift);
2748 else
2749 mpz_setbit (result->value.integer, i - ashift);
2753 convert_mpz_to_signed (result->value.integer, isize);
2755 gfc_free (bits);
2756 return result;
2760 gfc_expr *
2761 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
2763 gfc_expr *result;
2764 int shift, ashift, isize, ssize, delta, k;
2765 int i, *bits;
2767 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2768 return NULL;
2770 if (gfc_extract_int (s, &shift) != NULL)
2772 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
2773 return &gfc_bad_expr;
2776 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2777 isize = gfc_integer_kinds[k].bit_size;
2779 if (sz != NULL)
2781 if (sz->expr_type != EXPR_CONSTANT)
2782 return NULL;
2784 if (gfc_extract_int (sz, &ssize) != NULL || ssize <= 0)
2786 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
2787 return &gfc_bad_expr;
2790 if (ssize > isize)
2792 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
2793 "BIT_SIZE of first argument at %L", &s->where);
2794 return &gfc_bad_expr;
2797 else
2798 ssize = isize;
2800 if (shift >= 0)
2801 ashift = shift;
2802 else
2803 ashift = -shift;
2805 if (ashift > ssize)
2807 if (sz != NULL)
2808 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2809 "third argument at %L", &s->where);
2810 else
2811 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2812 "BIT_SIZE of first argument at %L", &s->where);
2813 return &gfc_bad_expr;
2816 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2818 mpz_set (result->value.integer, e->value.integer);
2820 if (shift == 0)
2821 return result;
2823 convert_mpz_to_unsigned (result->value.integer, isize);
2825 bits = XCNEWVEC (int, ssize);
2827 for (i = 0; i < ssize; i++)
2828 bits[i] = mpz_tstbit (e->value.integer, i);
2830 delta = ssize - ashift;
2832 if (shift > 0)
2834 for (i = 0; i < delta; i++)
2836 if (bits[i] == 0)
2837 mpz_clrbit (result->value.integer, i + shift);
2838 else
2839 mpz_setbit (result->value.integer, i + shift);
2842 for (i = delta; i < ssize; i++)
2844 if (bits[i] == 0)
2845 mpz_clrbit (result->value.integer, i - delta);
2846 else
2847 mpz_setbit (result->value.integer, i - delta);
2850 else
2852 for (i = 0; i < ashift; i++)
2854 if (bits[i] == 0)
2855 mpz_clrbit (result->value.integer, i + delta);
2856 else
2857 mpz_setbit (result->value.integer, i + delta);
2860 for (i = ashift; i < ssize; i++)
2862 if (bits[i] == 0)
2863 mpz_clrbit (result->value.integer, i + shift);
2864 else
2865 mpz_setbit (result->value.integer, i + shift);
2869 convert_mpz_to_signed (result->value.integer, isize);
2871 gfc_free (bits);
2872 return result;
2876 gfc_expr *
2877 gfc_simplify_kind (gfc_expr *e)
2880 if (e->ts.type == BT_DERIVED)
2882 gfc_error ("Argument of KIND at %L is a DERIVED type", &e->where);
2883 return &gfc_bad_expr;
2886 return gfc_int_expr (e->ts.kind);
2890 static gfc_expr *
2891 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
2892 gfc_array_spec *as, gfc_ref *ref)
2894 gfc_expr *l, *u, *result;
2895 int k;
2897 /* The last dimension of an assumed-size array is special. */
2898 if (d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
2900 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
2901 return gfc_copy_expr (as->lower[d-1]);
2902 else
2903 return NULL;
2906 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2907 gfc_default_integer_kind);
2908 if (k == -1)
2909 return &gfc_bad_expr;
2911 result = gfc_constant_result (BT_INTEGER, k, &array->where);
2914 /* Then, we need to know the extent of the given dimension. */
2915 if (ref->u.ar.type == AR_FULL)
2917 l = as->lower[d-1];
2918 u = as->upper[d-1];
2920 if (l->expr_type != EXPR_CONSTANT || u->expr_type != EXPR_CONSTANT)
2921 return NULL;
2923 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
2925 /* Zero extent. */
2926 if (upper)
2927 mpz_set_si (result->value.integer, 0);
2928 else
2929 mpz_set_si (result->value.integer, 1);
2931 else
2933 /* Nonzero extent. */
2934 if (upper)
2935 mpz_set (result->value.integer, u->value.integer);
2936 else
2937 mpz_set (result->value.integer, l->value.integer);
2940 else
2942 if (upper)
2944 if (gfc_ref_dimen_size (&ref->u.ar, d-1, &result->value.integer)
2945 != SUCCESS)
2946 return NULL;
2948 else
2949 mpz_set_si (result->value.integer, (long int) 1);
2952 return range_check (result, upper ? "UBOUND" : "LBOUND");
2956 static gfc_expr *
2957 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
2959 gfc_ref *ref;
2960 gfc_array_spec *as;
2961 int d;
2963 if (array->expr_type != EXPR_VARIABLE)
2964 return NULL;
2966 /* Follow any component references. */
2967 as = array->symtree->n.sym->as;
2968 for (ref = array->ref; ref; ref = ref->next)
2970 switch (ref->type)
2972 case REF_ARRAY:
2973 switch (ref->u.ar.type)
2975 case AR_ELEMENT:
2976 as = NULL;
2977 continue;
2979 case AR_FULL:
2980 /* We're done because 'as' has already been set in the
2981 previous iteration. */
2982 if (!ref->next)
2983 goto done;
2985 /* Fall through. */
2987 case AR_UNKNOWN:
2988 return NULL;
2990 case AR_SECTION:
2991 as = ref->u.ar.as;
2992 goto done;
2995 gcc_unreachable ();
2997 case REF_COMPONENT:
2998 as = ref->u.c.component->as;
2999 continue;
3001 case REF_SUBSTRING:
3002 continue;
3006 gcc_unreachable ();
3008 done:
3010 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
3011 return NULL;
3013 if (dim == NULL)
3015 /* Multi-dimensional bounds. */
3016 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3017 gfc_expr *e;
3018 gfc_constructor *head, *tail;
3019 int k;
3021 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3022 if (upper && as->type == AS_ASSUMED_SIZE)
3024 /* An error message will be emitted in
3025 check_assumed_size_reference (resolve.c). */
3026 return &gfc_bad_expr;
3029 /* Simplify the bounds for each dimension. */
3030 for (d = 0; d < array->rank; d++)
3032 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref);
3033 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3035 int j;
3037 for (j = 0; j < d; j++)
3038 gfc_free_expr (bounds[j]);
3039 return bounds[d];
3043 /* Allocate the result expression. */
3044 e = gfc_get_expr ();
3045 e->where = array->where;
3046 e->expr_type = EXPR_ARRAY;
3047 e->ts.type = BT_INTEGER;
3048 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3049 gfc_default_integer_kind);
3050 if (k == -1)
3052 gfc_free_expr (e);
3053 return &gfc_bad_expr;
3055 e->ts.kind = k;
3057 /* The result is a rank 1 array; its size is the rank of the first
3058 argument to {L,U}BOUND. */
3059 e->rank = 1;
3060 e->shape = gfc_get_shape (1);
3061 mpz_init_set_ui (e->shape[0], array->rank);
3063 /* Create the constructor for this array. */
3064 head = tail = NULL;
3065 for (d = 0; d < array->rank; d++)
3067 /* Get a new constructor element. */
3068 if (head == NULL)
3069 head = tail = gfc_get_constructor ();
3070 else
3072 tail->next = gfc_get_constructor ();
3073 tail = tail->next;
3076 tail->where = e->where;
3077 tail->expr = bounds[d];
3079 e->value.constructor = head;
3081 return e;
3083 else
3085 /* A DIM argument is specified. */
3086 if (dim->expr_type != EXPR_CONSTANT)
3087 return NULL;
3089 d = mpz_get_si (dim->value.integer);
3091 if (d < 1 || d > as->rank
3092 || (d == as->rank && as->type == AS_ASSUMED_SIZE && upper))
3094 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3095 return &gfc_bad_expr;
3098 return simplify_bound_dim (array, kind, d, upper, as, ref);
3103 gfc_expr *
3104 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3106 return simplify_bound (array, dim, kind, 0);
3110 gfc_expr *
3111 gfc_simplify_leadz (gfc_expr *e)
3113 gfc_expr *result;
3114 unsigned long lz, bs;
3115 int i;
3117 if (e->expr_type != EXPR_CONSTANT)
3118 return NULL;
3120 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3121 bs = gfc_integer_kinds[i].bit_size;
3122 if (mpz_cmp_si (e->value.integer, 0) == 0)
3123 lz = bs;
3124 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3125 lz = 0;
3126 else
3127 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3129 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3130 &e->where);
3131 mpz_set_ui (result->value.integer, lz);
3133 return result;
3137 gfc_expr *
3138 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3140 gfc_expr *result;
3141 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3143 if (k == -1)
3144 return &gfc_bad_expr;
3146 if (e->expr_type == EXPR_CONSTANT)
3148 result = gfc_constant_result (BT_INTEGER, k, &e->where);
3149 mpz_set_si (result->value.integer, e->value.character.length);
3150 if (gfc_range_check (result) == ARITH_OK)
3151 return result;
3152 else
3154 gfc_free_expr (result);
3155 return NULL;
3159 if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3160 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3161 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3163 result = gfc_constant_result (BT_INTEGER, k, &e->where);
3164 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3165 if (gfc_range_check (result) == ARITH_OK)
3166 return result;
3167 else
3169 gfc_free_expr (result);
3170 return NULL;
3174 return NULL;
3178 gfc_expr *
3179 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3181 gfc_expr *result;
3182 int count, len, lentrim, i;
3183 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3185 if (k == -1)
3186 return &gfc_bad_expr;
3188 if (e->expr_type != EXPR_CONSTANT)
3189 return NULL;
3191 result = gfc_constant_result (BT_INTEGER, k, &e->where);
3192 len = e->value.character.length;
3194 for (count = 0, i = 1; i <= len; i++)
3195 if (e->value.character.string[len - i] == ' ')
3196 count++;
3197 else
3198 break;
3200 lentrim = len - count;
3202 mpz_set_si (result->value.integer, lentrim);
3203 return range_check (result, "LEN_TRIM");
3206 gfc_expr *
3207 gfc_simplify_lgamma (gfc_expr *x ATTRIBUTE_UNUSED)
3209 gfc_expr *result;
3210 int sg;
3212 if (x->expr_type != EXPR_CONSTANT)
3213 return NULL;
3215 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3217 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
3219 return range_check (result, "LGAMMA");
3223 gfc_expr *
3224 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
3226 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3227 return NULL;
3229 return gfc_logical_expr (gfc_compare_string (a, b) >= 0, &a->where);
3233 gfc_expr *
3234 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
3236 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3237 return NULL;
3239 return gfc_logical_expr (gfc_compare_string (a, b) > 0,
3240 &a->where);
3244 gfc_expr *
3245 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
3247 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3248 return NULL;
3250 return gfc_logical_expr (gfc_compare_string (a, b) <= 0, &a->where);
3254 gfc_expr *
3255 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
3257 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3258 return NULL;
3260 return gfc_logical_expr (gfc_compare_string (a, b) < 0, &a->where);
3264 gfc_expr *
3265 gfc_simplify_log (gfc_expr *x)
3267 gfc_expr *result;
3269 if (x->expr_type != EXPR_CONSTANT)
3270 return NULL;
3272 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3275 switch (x->ts.type)
3277 case BT_REAL:
3278 if (mpfr_sgn (x->value.real) <= 0)
3280 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3281 "to zero", &x->where);
3282 gfc_free_expr (result);
3283 return &gfc_bad_expr;
3286 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
3287 break;
3289 case BT_COMPLEX:
3290 if ((mpfr_sgn (mpc_realref (x->value.complex)) == 0)
3291 && (mpfr_sgn (mpc_imagref (x->value.complex)) == 0))
3293 gfc_error ("Complex argument of LOG at %L cannot be zero",
3294 &x->where);
3295 gfc_free_expr (result);
3296 return &gfc_bad_expr;
3299 gfc_set_model_kind (x->ts.kind);
3300 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
3301 break;
3303 default:
3304 gfc_internal_error ("gfc_simplify_log: bad type");
3307 return range_check (result, "LOG");
3311 gfc_expr *
3312 gfc_simplify_log10 (gfc_expr *x)
3314 gfc_expr *result;
3316 if (x->expr_type != EXPR_CONSTANT)
3317 return NULL;
3319 if (mpfr_sgn (x->value.real) <= 0)
3321 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3322 "to zero", &x->where);
3323 return &gfc_bad_expr;
3326 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3328 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
3330 return range_check (result, "LOG10");
3334 gfc_expr *
3335 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
3337 gfc_expr *result;
3338 int kind;
3340 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
3341 if (kind < 0)
3342 return &gfc_bad_expr;
3344 if (e->expr_type != EXPR_CONSTANT)
3345 return NULL;
3347 result = gfc_constant_result (BT_LOGICAL, kind, &e->where);
3349 result->value.logical = e->value.logical;
3351 return result;
3355 gfc_expr*
3356 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
3358 gfc_expr *result;
3359 gfc_constructor *ma_ctor, *mb_ctor;
3360 int row, result_rows, col, result_columns, stride_a, stride_b;
3362 if (!is_constant_array_expr (matrix_a)
3363 || !is_constant_array_expr (matrix_b))
3364 return NULL;
3366 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
3367 result = gfc_start_constructor (matrix_a->ts.type,
3368 matrix_a->ts.kind,
3369 &matrix_a->where);
3371 if (matrix_a->rank == 1 && matrix_b->rank == 2)
3373 result_rows = 1;
3374 result_columns = mpz_get_si (matrix_b->shape[0]);
3375 stride_a = 1;
3376 stride_b = mpz_get_si (matrix_b->shape[0]);
3378 result->rank = 1;
3379 result->shape = gfc_get_shape (result->rank);
3380 mpz_init_set_si (result->shape[0], result_columns);
3382 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
3384 result_rows = mpz_get_si (matrix_b->shape[0]);
3385 result_columns = 1;
3386 stride_a = mpz_get_si (matrix_a->shape[0]);
3387 stride_b = 1;
3389 result->rank = 1;
3390 result->shape = gfc_get_shape (result->rank);
3391 mpz_init_set_si (result->shape[0], result_rows);
3393 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
3395 result_rows = mpz_get_si (matrix_a->shape[0]);
3396 result_columns = mpz_get_si (matrix_b->shape[1]);
3397 stride_a = mpz_get_si (matrix_a->shape[1]);
3398 stride_b = mpz_get_si (matrix_b->shape[0]);
3400 result->rank = 2;
3401 result->shape = gfc_get_shape (result->rank);
3402 mpz_init_set_si (result->shape[0], result_rows);
3403 mpz_init_set_si (result->shape[1], result_columns);
3405 else
3406 gcc_unreachable();
3408 ma_ctor = matrix_a->value.constructor;
3409 mb_ctor = matrix_b->value.constructor;
3411 for (col = 0; col < result_columns; ++col)
3413 ma_ctor = matrix_a->value.constructor;
3415 for (row = 0; row < result_rows; ++row)
3417 gfc_expr *e;
3418 e = compute_dot_product (ma_ctor, stride_a,
3419 mb_ctor, 1);
3421 gfc_append_constructor (result, e);
3423 ADVANCE (ma_ctor, 1);
3426 ADVANCE (mb_ctor, stride_b);
3429 return result;
3433 gfc_expr *
3434 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
3436 if (tsource->expr_type != EXPR_CONSTANT
3437 || fsource->expr_type != EXPR_CONSTANT
3438 || mask->expr_type != EXPR_CONSTANT)
3439 return NULL;
3441 return gfc_copy_expr (mask->value.logical ? tsource : fsource);
3445 /* Selects bewteen current value and extremum for simplify_min_max
3446 and simplify_minval_maxval. */
3447 static void
3448 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
3450 switch (arg->ts.type)
3452 case BT_INTEGER:
3453 if (mpz_cmp (arg->value.integer,
3454 extremum->value.integer) * sign > 0)
3455 mpz_set (extremum->value.integer, arg->value.integer);
3456 break;
3458 case BT_REAL:
3459 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
3460 if (sign > 0)
3461 mpfr_max (extremum->value.real, extremum->value.real,
3462 arg->value.real, GFC_RND_MODE);
3463 else
3464 mpfr_min (extremum->value.real, extremum->value.real,
3465 arg->value.real, GFC_RND_MODE);
3466 break;
3468 case BT_CHARACTER:
3469 #define LENGTH(x) ((x)->value.character.length)
3470 #define STRING(x) ((x)->value.character.string)
3471 if (LENGTH(extremum) < LENGTH(arg))
3473 gfc_char_t *tmp = STRING(extremum);
3475 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
3476 memcpy (STRING(extremum), tmp,
3477 LENGTH(extremum) * sizeof (gfc_char_t));
3478 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
3479 LENGTH(arg) - LENGTH(extremum));
3480 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
3481 LENGTH(extremum) = LENGTH(arg);
3482 gfc_free (tmp);
3485 if (gfc_compare_string (arg, extremum) * sign > 0)
3487 gfc_free (STRING(extremum));
3488 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
3489 memcpy (STRING(extremum), STRING(arg),
3490 LENGTH(arg) * sizeof (gfc_char_t));
3491 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
3492 LENGTH(extremum) - LENGTH(arg));
3493 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
3495 #undef LENGTH
3496 #undef STRING
3497 break;
3499 default:
3500 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
3505 /* This function is special since MAX() can take any number of
3506 arguments. The simplified expression is a rewritten version of the
3507 argument list containing at most one constant element. Other
3508 constant elements are deleted. Because the argument list has
3509 already been checked, this function always succeeds. sign is 1 for
3510 MAX(), -1 for MIN(). */
3512 static gfc_expr *
3513 simplify_min_max (gfc_expr *expr, int sign)
3515 gfc_actual_arglist *arg, *last, *extremum;
3516 gfc_intrinsic_sym * specific;
3518 last = NULL;
3519 extremum = NULL;
3520 specific = expr->value.function.isym;
3522 arg = expr->value.function.actual;
3524 for (; arg; last = arg, arg = arg->next)
3526 if (arg->expr->expr_type != EXPR_CONSTANT)
3527 continue;
3529 if (extremum == NULL)
3531 extremum = arg;
3532 continue;
3535 min_max_choose (arg->expr, extremum->expr, sign);
3537 /* Delete the extra constant argument. */
3538 if (last == NULL)
3539 expr->value.function.actual = arg->next;
3540 else
3541 last->next = arg->next;
3543 arg->next = NULL;
3544 gfc_free_actual_arglist (arg);
3545 arg = last;
3548 /* If there is one value left, replace the function call with the
3549 expression. */
3550 if (expr->value.function.actual->next != NULL)
3551 return NULL;
3553 /* Convert to the correct type and kind. */
3554 if (expr->ts.type != BT_UNKNOWN)
3555 return gfc_convert_constant (expr->value.function.actual->expr,
3556 expr->ts.type, expr->ts.kind);
3558 if (specific->ts.type != BT_UNKNOWN)
3559 return gfc_convert_constant (expr->value.function.actual->expr,
3560 specific->ts.type, specific->ts.kind);
3562 return gfc_copy_expr (expr->value.function.actual->expr);
3566 gfc_expr *
3567 gfc_simplify_min (gfc_expr *e)
3569 return simplify_min_max (e, -1);
3573 gfc_expr *
3574 gfc_simplify_max (gfc_expr *e)
3576 return simplify_min_max (e, 1);
3580 /* This is a simplified version of simplify_min_max to provide
3581 simplification of minval and maxval for a vector. */
3583 static gfc_expr *
3584 simplify_minval_maxval (gfc_expr *expr, int sign)
3586 gfc_constructor *ctr, *extremum;
3587 gfc_intrinsic_sym * specific;
3589 extremum = NULL;
3590 specific = expr->value.function.isym;
3592 ctr = expr->value.constructor;
3594 for (; ctr; ctr = ctr->next)
3596 if (ctr->expr->expr_type != EXPR_CONSTANT)
3597 return NULL;
3599 if (extremum == NULL)
3601 extremum = ctr;
3602 continue;
3605 min_max_choose (ctr->expr, extremum->expr, sign);
3608 if (extremum == NULL)
3609 return NULL;
3611 /* Convert to the correct type and kind. */
3612 if (expr->ts.type != BT_UNKNOWN)
3613 return gfc_convert_constant (extremum->expr,
3614 expr->ts.type, expr->ts.kind);
3616 if (specific->ts.type != BT_UNKNOWN)
3617 return gfc_convert_constant (extremum->expr,
3618 specific->ts.type, specific->ts.kind);
3620 return gfc_copy_expr (extremum->expr);
3624 gfc_expr *
3625 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
3627 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
3628 return NULL;
3630 return simplify_minval_maxval (array, -1);
3634 gfc_expr *
3635 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
3637 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
3638 return NULL;
3639 return simplify_minval_maxval (array, 1);
3643 gfc_expr *
3644 gfc_simplify_maxexponent (gfc_expr *x)
3646 gfc_expr *result;
3647 int i;
3649 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3651 result = gfc_int_expr (gfc_real_kinds[i].max_exponent);
3652 result->where = x->where;
3654 return result;
3658 gfc_expr *
3659 gfc_simplify_minexponent (gfc_expr *x)
3661 gfc_expr *result;
3662 int i;
3664 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3666 result = gfc_int_expr (gfc_real_kinds[i].min_exponent);
3667 result->where = x->where;
3669 return result;
3673 gfc_expr *
3674 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
3676 gfc_expr *result;
3677 mpfr_t tmp;
3678 int kind;
3680 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
3681 return NULL;
3683 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
3684 result = gfc_constant_result (a->ts.type, kind, &a->where);
3686 switch (a->ts.type)
3688 case BT_INTEGER:
3689 if (mpz_cmp_ui (p->value.integer, 0) == 0)
3691 /* Result is processor-dependent. */
3692 gfc_error ("Second argument MOD at %L is zero", &a->where);
3693 gfc_free_expr (result);
3694 return &gfc_bad_expr;
3696 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
3697 break;
3699 case BT_REAL:
3700 if (mpfr_cmp_ui (p->value.real, 0) == 0)
3702 /* Result is processor-dependent. */
3703 gfc_error ("Second argument of MOD at %L is zero", &p->where);
3704 gfc_free_expr (result);
3705 return &gfc_bad_expr;
3708 gfc_set_model_kind (kind);
3709 mpfr_init (tmp);
3710 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
3711 mpfr_trunc (tmp, tmp);
3712 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
3713 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
3714 mpfr_clear (tmp);
3715 break;
3717 default:
3718 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
3721 return range_check (result, "MOD");
3725 gfc_expr *
3726 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
3728 gfc_expr *result;
3729 mpfr_t tmp;
3730 int kind;
3732 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
3733 return NULL;
3735 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
3736 result = gfc_constant_result (a->ts.type, kind, &a->where);
3738 switch (a->ts.type)
3740 case BT_INTEGER:
3741 if (mpz_cmp_ui (p->value.integer, 0) == 0)
3743 /* Result is processor-dependent. This processor just opts
3744 to not handle it at all. */
3745 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
3746 gfc_free_expr (result);
3747 return &gfc_bad_expr;
3749 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
3751 break;
3753 case BT_REAL:
3754 if (mpfr_cmp_ui (p->value.real, 0) == 0)
3756 /* Result is processor-dependent. */
3757 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
3758 gfc_free_expr (result);
3759 return &gfc_bad_expr;
3762 gfc_set_model_kind (kind);
3763 mpfr_init (tmp);
3764 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
3765 mpfr_floor (tmp, tmp);
3766 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
3767 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
3768 mpfr_clear (tmp);
3769 break;
3771 default:
3772 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
3775 return range_check (result, "MODULO");
3779 /* Exists for the sole purpose of consistency with other intrinsics. */
3780 gfc_expr *
3781 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
3782 gfc_expr *fp ATTRIBUTE_UNUSED,
3783 gfc_expr *l ATTRIBUTE_UNUSED,
3784 gfc_expr *to ATTRIBUTE_UNUSED,
3785 gfc_expr *tp ATTRIBUTE_UNUSED)
3787 return NULL;
3791 gfc_expr *
3792 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
3794 gfc_expr *result;
3795 mp_exp_t emin, emax;
3796 int kind;
3798 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3799 return NULL;
3801 if (mpfr_sgn (s->value.real) == 0)
3803 gfc_error ("Second argument of NEAREST at %L shall not be zero",
3804 &s->where);
3805 return &gfc_bad_expr;
3808 result = gfc_copy_expr (x);
3810 /* Save current values of emin and emax. */
3811 emin = mpfr_get_emin ();
3812 emax = mpfr_get_emax ();
3814 /* Set emin and emax for the current model number. */
3815 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
3816 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
3817 mpfr_get_prec(result->value.real) + 1);
3818 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
3819 mpfr_check_range (result->value.real, 0, GMP_RNDU);
3821 if (mpfr_sgn (s->value.real) > 0)
3823 mpfr_nextabove (result->value.real);
3824 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
3826 else
3828 mpfr_nextbelow (result->value.real);
3829 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
3832 mpfr_set_emin (emin);
3833 mpfr_set_emax (emax);
3835 /* Only NaN can occur. Do not use range check as it gives an
3836 error for denormal numbers. */
3837 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
3839 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
3840 gfc_free_expr (result);
3841 return &gfc_bad_expr;
3844 return result;
3848 static gfc_expr *
3849 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
3851 gfc_expr *itrunc, *result;
3852 int kind;
3854 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
3855 if (kind == -1)
3856 return &gfc_bad_expr;
3858 if (e->expr_type != EXPR_CONSTANT)
3859 return NULL;
3861 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
3863 itrunc = gfc_copy_expr (e);
3865 mpfr_round (itrunc->value.real, e->value.real);
3867 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
3869 gfc_free_expr (itrunc);
3871 return range_check (result, name);
3875 gfc_expr *
3876 gfc_simplify_new_line (gfc_expr *e)
3878 gfc_expr *result;
3880 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3881 result->value.character.string = gfc_get_wide_string (2);
3882 result->value.character.length = 1;
3883 result->value.character.string[0] = '\n';
3884 result->value.character.string[1] = '\0'; /* For debugger */
3885 return result;
3889 gfc_expr *
3890 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
3892 return simplify_nint ("NINT", e, k);
3896 gfc_expr *
3897 gfc_simplify_idnint (gfc_expr *e)
3899 return simplify_nint ("IDNINT", e, NULL);
3903 gfc_expr *
3904 gfc_simplify_not (gfc_expr *e)
3906 gfc_expr *result;
3908 if (e->expr_type != EXPR_CONSTANT)
3909 return NULL;
3911 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
3913 mpz_com (result->value.integer, e->value.integer);
3915 return range_check (result, "NOT");
3919 gfc_expr *
3920 gfc_simplify_null (gfc_expr *mold)
3922 gfc_expr *result;
3924 if (mold == NULL)
3926 result = gfc_get_expr ();
3927 result->ts.type = BT_UNKNOWN;
3929 else
3930 result = gfc_copy_expr (mold);
3931 result->expr_type = EXPR_NULL;
3933 return result;
3937 gfc_expr *
3938 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
3940 gfc_expr *result;
3941 int kind;
3943 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3944 return NULL;
3946 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
3947 if (x->ts.type == BT_INTEGER)
3949 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
3950 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
3951 return range_check (result, "OR");
3953 else /* BT_LOGICAL */
3955 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
3956 result->value.logical = x->value.logical || y->value.logical;
3957 return result;
3962 gfc_expr *
3963 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
3965 gfc_expr *result;
3966 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
3968 if (!is_constant_array_expr(array)
3969 || !is_constant_array_expr(vector)
3970 || (!gfc_is_constant_expr (mask)
3971 && !is_constant_array_expr(mask)))
3972 return NULL;
3974 result = gfc_start_constructor (array->ts.type,
3975 array->ts.kind,
3976 &array->where);
3978 array_ctor = array->value.constructor;
3979 vector_ctor = vector ? vector->value.constructor : NULL;
3981 if (mask->expr_type == EXPR_CONSTANT
3982 && mask->value.logical)
3984 /* Copy all elements of ARRAY to RESULT. */
3985 while (array_ctor)
3987 gfc_append_constructor (result,
3988 gfc_copy_expr (array_ctor->expr));
3990 ADVANCE (array_ctor, 1);
3991 ADVANCE (vector_ctor, 1);
3994 else if (mask->expr_type == EXPR_ARRAY)
3996 /* Copy only those elements of ARRAY to RESULT whose
3997 MASK equals .TRUE.. */
3998 mask_ctor = mask->value.constructor;
3999 while (mask_ctor)
4001 if (mask_ctor->expr->value.logical)
4003 gfc_append_constructor (result,
4004 gfc_copy_expr (array_ctor->expr));
4005 ADVANCE (vector_ctor, 1);
4008 ADVANCE (array_ctor, 1);
4009 ADVANCE (mask_ctor, 1);
4013 /* Append any left-over elements from VECTOR to RESULT. */
4014 while (vector_ctor)
4016 gfc_append_constructor (result,
4017 gfc_copy_expr (vector_ctor->expr));
4018 ADVANCE (vector_ctor, 1);
4021 result->shape = gfc_get_shape (1);
4022 gfc_array_size (result, &result->shape[0]);
4024 if (array->ts.type == BT_CHARACTER)
4025 result->ts.u.cl = array->ts.u.cl;
4027 return result;
4031 gfc_expr *
4032 gfc_simplify_precision (gfc_expr *e)
4034 gfc_expr *result;
4035 int i;
4037 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4039 result = gfc_int_expr (gfc_real_kinds[i].precision);
4040 result->where = e->where;
4042 return result;
4046 gfc_expr *
4047 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
4049 gfc_expr *result;
4051 if (!is_constant_array_expr (array)
4052 || !gfc_is_constant_expr (dim))
4053 return NULL;
4055 if (mask
4056 && !is_constant_array_expr (mask)
4057 && mask->expr_type != EXPR_CONSTANT)
4058 return NULL;
4060 result = transformational_result (array, dim, array->ts.type,
4061 array->ts.kind, &array->where);
4062 init_result_expr (result, 1, NULL);
4064 return !dim || array->rank == 1 ?
4065 simplify_transformation_to_scalar (result, array, mask, gfc_multiply) :
4066 simplify_transformation_to_array (result, array, dim, mask, gfc_multiply);
4070 gfc_expr *
4071 gfc_simplify_radix (gfc_expr *e)
4073 gfc_expr *result;
4074 int i;
4076 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4077 switch (e->ts.type)
4079 case BT_INTEGER:
4080 i = gfc_integer_kinds[i].radix;
4081 break;
4083 case BT_REAL:
4084 i = gfc_real_kinds[i].radix;
4085 break;
4087 default:
4088 gcc_unreachable ();
4091 result = gfc_int_expr (i);
4092 result->where = e->where;
4094 return result;
4098 gfc_expr *
4099 gfc_simplify_range (gfc_expr *e)
4101 gfc_expr *result;
4102 int i;
4103 long j;
4105 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4107 switch (e->ts.type)
4109 case BT_INTEGER:
4110 j = gfc_integer_kinds[i].range;
4111 break;
4113 case BT_REAL:
4114 case BT_COMPLEX:
4115 j = gfc_real_kinds[i].range;
4116 break;
4118 default:
4119 gcc_unreachable ();
4122 result = gfc_int_expr (j);
4123 result->where = e->where;
4125 return result;
4129 gfc_expr *
4130 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
4132 gfc_expr *result = NULL;
4133 int kind;
4135 if (e->ts.type == BT_COMPLEX)
4136 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
4137 else
4138 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
4140 if (kind == -1)
4141 return &gfc_bad_expr;
4143 if (e->expr_type != EXPR_CONSTANT)
4144 return NULL;
4146 switch (e->ts.type)
4148 case BT_INTEGER:
4149 if (!e->is_boz)
4150 result = gfc_int2real (e, kind);
4151 break;
4153 case BT_REAL:
4154 result = gfc_real2real (e, kind);
4155 break;
4157 case BT_COMPLEX:
4158 result = gfc_complex2real (e, kind);
4159 break;
4161 default:
4162 gfc_internal_error ("bad type in REAL");
4163 /* Not reached */
4166 if (e->ts.type == BT_INTEGER && e->is_boz)
4168 gfc_typespec ts;
4169 gfc_clear_ts (&ts);
4170 ts.type = BT_REAL;
4171 ts.kind = kind;
4172 result = gfc_copy_expr (e);
4173 if (!gfc_convert_boz (result, &ts))
4175 gfc_free_expr (result);
4176 return &gfc_bad_expr;
4180 return range_check (result, "REAL");
4184 gfc_expr *
4185 gfc_simplify_realpart (gfc_expr *e)
4187 gfc_expr *result;
4189 if (e->expr_type != EXPR_CONSTANT)
4190 return NULL;
4192 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
4193 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
4194 return range_check (result, "REALPART");
4197 gfc_expr *
4198 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
4200 gfc_expr *result;
4201 int i, j, len, ncop, nlen;
4202 mpz_t ncopies;
4203 bool have_length = false;
4205 /* If NCOPIES isn't a constant, there's nothing we can do. */
4206 if (n->expr_type != EXPR_CONSTANT)
4207 return NULL;
4209 /* If NCOPIES is negative, it's an error. */
4210 if (mpz_sgn (n->value.integer) < 0)
4212 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4213 &n->where);
4214 return &gfc_bad_expr;
4217 /* If we don't know the character length, we can do no more. */
4218 if (e->ts.u.cl && e->ts.u.cl->length
4219 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
4221 len = mpz_get_si (e->ts.u.cl->length->value.integer);
4222 have_length = true;
4224 else if (e->expr_type == EXPR_CONSTANT
4225 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
4227 len = e->value.character.length;
4229 else
4230 return NULL;
4232 /* If the source length is 0, any value of NCOPIES is valid
4233 and everything behaves as if NCOPIES == 0. */
4234 mpz_init (ncopies);
4235 if (len == 0)
4236 mpz_set_ui (ncopies, 0);
4237 else
4238 mpz_set (ncopies, n->value.integer);
4240 /* Check that NCOPIES isn't too large. */
4241 if (len)
4243 mpz_t max, mlen;
4244 int i;
4246 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4247 mpz_init (max);
4248 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4250 if (have_length)
4252 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
4253 e->ts.u.cl->length->value.integer);
4255 else
4257 mpz_init_set_si (mlen, len);
4258 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
4259 mpz_clear (mlen);
4262 /* The check itself. */
4263 if (mpz_cmp (ncopies, max) > 0)
4265 mpz_clear (max);
4266 mpz_clear (ncopies);
4267 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4268 &n->where);
4269 return &gfc_bad_expr;
4272 mpz_clear (max);
4274 mpz_clear (ncopies);
4276 /* For further simplification, we need the character string to be
4277 constant. */
4278 if (e->expr_type != EXPR_CONSTANT)
4279 return NULL;
4281 if (len ||
4282 (e->ts.u.cl->length &&
4283 mpz_sgn (e->ts.u.cl->length->value.integer)) != 0)
4285 const char *res = gfc_extract_int (n, &ncop);
4286 gcc_assert (res == NULL);
4288 else
4289 ncop = 0;
4291 len = e->value.character.length;
4292 nlen = ncop * len;
4294 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
4296 if (ncop == 0)
4298 result->value.character.string = gfc_get_wide_string (1);
4299 result->value.character.length = 0;
4300 result->value.character.string[0] = '\0';
4301 return result;
4304 result->value.character.length = nlen;
4305 result->value.character.string = gfc_get_wide_string (nlen + 1);
4307 for (i = 0; i < ncop; i++)
4308 for (j = 0; j < len; j++)
4309 result->value.character.string[j+i*len]= e->value.character.string[j];
4311 result->value.character.string[nlen] = '\0'; /* For debugger */
4312 return result;
4316 /* This one is a bear, but mainly has to do with shuffling elements. */
4318 gfc_expr *
4319 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
4320 gfc_expr *pad, gfc_expr *order_exp)
4322 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
4323 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
4324 gfc_constructor *head, *tail;
4325 mpz_t index, size;
4326 unsigned long j;
4327 size_t nsource;
4328 gfc_expr *e;
4330 /* Check that argument expression types are OK. */
4331 if (!is_constant_array_expr (source)
4332 || !is_constant_array_expr (shape_exp)
4333 || !is_constant_array_expr (pad)
4334 || !is_constant_array_expr (order_exp))
4335 return NULL;
4337 /* Proceed with simplification, unpacking the array. */
4339 mpz_init (index);
4340 rank = 0;
4341 head = tail = NULL;
4343 for (;;)
4345 e = gfc_get_array_element (shape_exp, rank);
4346 if (e == NULL)
4347 break;
4349 gfc_extract_int (e, &shape[rank]);
4351 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
4352 gcc_assert (shape[rank] >= 0);
4354 gfc_free_expr (e);
4355 rank++;
4358 gcc_assert (rank > 0);
4360 /* Now unpack the order array if present. */
4361 if (order_exp == NULL)
4363 for (i = 0; i < rank; i++)
4364 order[i] = i;
4366 else
4368 for (i = 0; i < rank; i++)
4369 x[i] = 0;
4371 for (i = 0; i < rank; i++)
4373 e = gfc_get_array_element (order_exp, i);
4374 gcc_assert (e);
4376 gfc_extract_int (e, &order[i]);
4377 gfc_free_expr (e);
4379 gcc_assert (order[i] >= 1 && order[i] <= rank);
4380 order[i]--;
4381 gcc_assert (x[order[i]] == 0);
4382 x[order[i]] = 1;
4386 /* Count the elements in the source and padding arrays. */
4388 npad = 0;
4389 if (pad != NULL)
4391 gfc_array_size (pad, &size);
4392 npad = mpz_get_ui (size);
4393 mpz_clear (size);
4396 gfc_array_size (source, &size);
4397 nsource = mpz_get_ui (size);
4398 mpz_clear (size);
4400 /* If it weren't for that pesky permutation we could just loop
4401 through the source and round out any shortage with pad elements.
4402 But no, someone just had to have the compiler do something the
4403 user should be doing. */
4405 for (i = 0; i < rank; i++)
4406 x[i] = 0;
4408 while (nsource > 0 || npad > 0)
4410 /* Figure out which element to extract. */
4411 mpz_set_ui (index, 0);
4413 for (i = rank - 1; i >= 0; i--)
4415 mpz_add_ui (index, index, x[order[i]]);
4416 if (i != 0)
4417 mpz_mul_ui (index, index, shape[order[i - 1]]);
4420 if (mpz_cmp_ui (index, INT_MAX) > 0)
4421 gfc_internal_error ("Reshaped array too large at %C");
4423 j = mpz_get_ui (index);
4425 if (j < nsource)
4426 e = gfc_get_array_element (source, j);
4427 else
4429 gcc_assert (npad > 0);
4431 j = j - nsource;
4432 j = j % npad;
4433 e = gfc_get_array_element (pad, j);
4435 gcc_assert (e);
4437 if (head == NULL)
4438 head = tail = gfc_get_constructor ();
4439 else
4441 tail->next = gfc_get_constructor ();
4442 tail = tail->next;
4445 tail->where = e->where;
4446 tail->expr = e;
4448 /* Calculate the next element. */
4449 i = 0;
4451 inc:
4452 if (++x[i] < shape[i])
4453 continue;
4454 x[i++] = 0;
4455 if (i < rank)
4456 goto inc;
4458 break;
4461 mpz_clear (index);
4463 e = gfc_get_expr ();
4464 e->where = source->where;
4465 e->expr_type = EXPR_ARRAY;
4466 e->value.constructor = head;
4467 e->shape = gfc_get_shape (rank);
4469 for (i = 0; i < rank; i++)
4470 mpz_init_set_ui (e->shape[i], shape[i]);
4472 e->ts = source->ts;
4473 e->rank = rank;
4475 return e;
4479 gfc_expr *
4480 gfc_simplify_rrspacing (gfc_expr *x)
4482 gfc_expr *result;
4483 int i;
4484 long int e, p;
4486 if (x->expr_type != EXPR_CONSTANT)
4487 return NULL;
4489 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
4491 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
4493 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
4495 /* Special case x = -0 and 0. */
4496 if (mpfr_sgn (result->value.real) == 0)
4498 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
4499 return result;
4502 /* | x * 2**(-e) | * 2**p. */
4503 e = - (long int) mpfr_get_exp (x->value.real);
4504 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
4506 p = (long int) gfc_real_kinds[i].digits;
4507 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
4509 return range_check (result, "RRSPACING");
4513 gfc_expr *
4514 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
4516 int k, neg_flag, power, exp_range;
4517 mpfr_t scale, radix;
4518 gfc_expr *result;
4520 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
4521 return NULL;
4523 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
4525 if (mpfr_sgn (x->value.real) == 0)
4527 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
4528 return result;
4531 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4533 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
4535 /* This check filters out values of i that would overflow an int. */
4536 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
4537 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
4539 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
4540 gfc_free_expr (result);
4541 return &gfc_bad_expr;
4544 /* Compute scale = radix ** power. */
4545 power = mpz_get_si (i->value.integer);
4547 if (power >= 0)
4548 neg_flag = 0;
4549 else
4551 neg_flag = 1;
4552 power = -power;
4555 gfc_set_model_kind (x->ts.kind);
4556 mpfr_init (scale);
4557 mpfr_init (radix);
4558 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
4559 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
4561 if (neg_flag)
4562 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
4563 else
4564 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
4566 mpfr_clears (scale, radix, NULL);
4568 return range_check (result, "SCALE");
4572 /* Variants of strspn and strcspn that operate on wide characters. */
4574 static size_t
4575 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
4577 size_t i = 0;
4578 const gfc_char_t *c;
4580 while (s1[i])
4582 for (c = s2; *c; c++)
4584 if (s1[i] == *c)
4585 break;
4587 if (*c == '\0')
4588 break;
4589 i++;
4592 return i;
4595 static size_t
4596 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
4598 size_t i = 0;
4599 const gfc_char_t *c;
4601 while (s1[i])
4603 for (c = s2; *c; c++)
4605 if (s1[i] == *c)
4606 break;
4608 if (*c)
4609 break;
4610 i++;
4613 return i;
4617 gfc_expr *
4618 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
4620 gfc_expr *result;
4621 int back;
4622 size_t i;
4623 size_t indx, len, lenc;
4624 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
4626 if (k == -1)
4627 return &gfc_bad_expr;
4629 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
4630 return NULL;
4632 if (b != NULL && b->value.logical != 0)
4633 back = 1;
4634 else
4635 back = 0;
4637 result = gfc_constant_result (BT_INTEGER, k, &e->where);
4639 len = e->value.character.length;
4640 lenc = c->value.character.length;
4642 if (len == 0 || lenc == 0)
4644 indx = 0;
4646 else
4648 if (back == 0)
4650 indx = wide_strcspn (e->value.character.string,
4651 c->value.character.string) + 1;
4652 if (indx > len)
4653 indx = 0;
4655 else
4657 i = 0;
4658 for (indx = len; indx > 0; indx--)
4660 for (i = 0; i < lenc; i++)
4662 if (c->value.character.string[i]
4663 == e->value.character.string[indx - 1])
4664 break;
4666 if (i < lenc)
4667 break;
4671 mpz_set_ui (result->value.integer, indx);
4672 return range_check (result, "SCAN");
4676 gfc_expr *
4677 gfc_simplify_selected_char_kind (gfc_expr *e)
4679 int kind;
4680 gfc_expr *result;
4682 if (e->expr_type != EXPR_CONSTANT)
4683 return NULL;
4685 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
4686 || gfc_compare_with_Cstring (e, "default", false) == 0)
4687 kind = 1;
4688 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
4689 kind = 4;
4690 else
4691 kind = -1;
4693 result = gfc_int_expr (kind);
4694 result->where = e->where;
4696 return result;
4700 gfc_expr *
4701 gfc_simplify_selected_int_kind (gfc_expr *e)
4703 int i, kind, range;
4704 gfc_expr *result;
4706 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
4707 return NULL;
4709 kind = INT_MAX;
4711 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
4712 if (gfc_integer_kinds[i].range >= range
4713 && gfc_integer_kinds[i].kind < kind)
4714 kind = gfc_integer_kinds[i].kind;
4716 if (kind == INT_MAX)
4717 kind = -1;
4719 result = gfc_int_expr (kind);
4720 result->where = e->where;
4722 return result;
4726 gfc_expr *
4727 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q)
4729 int range, precision, i, kind, found_precision, found_range;
4730 gfc_expr *result;
4732 if (p == NULL)
4733 precision = 0;
4734 else
4736 if (p->expr_type != EXPR_CONSTANT
4737 || gfc_extract_int (p, &precision) != NULL)
4738 return NULL;
4741 if (q == NULL)
4742 range = 0;
4743 else
4745 if (q->expr_type != EXPR_CONSTANT
4746 || gfc_extract_int (q, &range) != NULL)
4747 return NULL;
4750 kind = INT_MAX;
4751 found_precision = 0;
4752 found_range = 0;
4754 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
4756 if (gfc_real_kinds[i].precision >= precision)
4757 found_precision = 1;
4759 if (gfc_real_kinds[i].range >= range)
4760 found_range = 1;
4762 if (gfc_real_kinds[i].precision >= precision
4763 && gfc_real_kinds[i].range >= range && gfc_real_kinds[i].kind < kind)
4764 kind = gfc_real_kinds[i].kind;
4767 if (kind == INT_MAX)
4769 kind = 0;
4771 if (!found_precision)
4772 kind = -1;
4773 if (!found_range)
4774 kind -= 2;
4777 result = gfc_int_expr (kind);
4778 result->where = (p != NULL) ? p->where : q->where;
4780 return result;
4784 gfc_expr *
4785 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
4787 gfc_expr *result;
4788 mpfr_t exp, absv, log2, pow2, frac;
4789 unsigned long exp2;
4791 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
4792 return NULL;
4794 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
4796 if (mpfr_sgn (x->value.real) == 0)
4798 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
4799 return result;
4802 gfc_set_model_kind (x->ts.kind);
4803 mpfr_init (absv);
4804 mpfr_init (log2);
4805 mpfr_init (exp);
4806 mpfr_init (pow2);
4807 mpfr_init (frac);
4809 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
4810 mpfr_log2 (log2, absv, GFC_RND_MODE);
4812 mpfr_trunc (log2, log2);
4813 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
4815 /* Old exponent value, and fraction. */
4816 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
4818 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
4820 /* New exponent. */
4821 exp2 = (unsigned long) mpz_get_d (i->value.integer);
4822 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
4824 mpfr_clears (absv, log2, pow2, frac, NULL);
4826 return range_check (result, "SET_EXPONENT");
4830 gfc_expr *
4831 gfc_simplify_shape (gfc_expr *source)
4833 mpz_t shape[GFC_MAX_DIMENSIONS];
4834 gfc_expr *result, *e, *f;
4835 gfc_array_ref *ar;
4836 int n;
4837 gfc_try t;
4839 if (source->rank == 0)
4840 return gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
4841 &source->where);
4843 if (source->expr_type != EXPR_VARIABLE)
4844 return NULL;
4846 result = gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
4847 &source->where);
4849 ar = gfc_find_array_ref (source);
4851 t = gfc_array_ref_shape (ar, shape);
4853 for (n = 0; n < source->rank; n++)
4855 e = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
4856 &source->where);
4858 if (t == SUCCESS)
4860 mpz_set (e->value.integer, shape[n]);
4861 mpz_clear (shape[n]);
4863 else
4865 mpz_set_ui (e->value.integer, n + 1);
4867 f = gfc_simplify_size (source, e, NULL);
4868 gfc_free_expr (e);
4869 if (f == NULL)
4871 gfc_free_expr (result);
4872 return NULL;
4874 else
4876 e = f;
4880 gfc_append_constructor (result, e);
4883 return result;
4887 gfc_expr *
4888 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
4890 mpz_t size;
4891 gfc_expr *result;
4892 int d;
4893 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
4895 if (k == -1)
4896 return &gfc_bad_expr;
4898 if (dim == NULL)
4900 if (gfc_array_size (array, &size) == FAILURE)
4901 return NULL;
4903 else
4905 if (dim->expr_type != EXPR_CONSTANT)
4906 return NULL;
4908 d = mpz_get_ui (dim->value.integer) - 1;
4909 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
4910 return NULL;
4913 result = gfc_constant_result (BT_INTEGER, k, &array->where);
4914 mpz_set (result->value.integer, size);
4915 return result;
4919 gfc_expr *
4920 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
4922 gfc_expr *result;
4924 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4925 return NULL;
4927 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4929 switch (x->ts.type)
4931 case BT_INTEGER:
4932 mpz_abs (result->value.integer, x->value.integer);
4933 if (mpz_sgn (y->value.integer) < 0)
4934 mpz_neg (result->value.integer, result->value.integer);
4935 break;
4937 case BT_REAL:
4938 if (gfc_option.flag_sign_zero)
4939 mpfr_copysign (result->value.real, x->value.real, y->value.real,
4940 GFC_RND_MODE);
4941 else
4942 mpfr_setsign (result->value.real, x->value.real,
4943 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
4944 break;
4946 default:
4947 gfc_internal_error ("Bad type in gfc_simplify_sign");
4950 return result;
4954 gfc_expr *
4955 gfc_simplify_sin (gfc_expr *x)
4957 gfc_expr *result;
4959 if (x->expr_type != EXPR_CONSTANT)
4960 return NULL;
4962 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4964 switch (x->ts.type)
4966 case BT_REAL:
4967 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
4968 break;
4970 case BT_COMPLEX:
4971 gfc_set_model (x->value.real);
4972 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
4973 break;
4975 default:
4976 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
4979 return range_check (result, "SIN");
4983 gfc_expr *
4984 gfc_simplify_sinh (gfc_expr *x)
4986 gfc_expr *result;
4988 if (x->expr_type != EXPR_CONSTANT)
4989 return NULL;
4991 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4993 if (x->ts.type == BT_REAL)
4994 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
4995 else if (x->ts.type == BT_COMPLEX)
4996 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
4997 else
4998 gcc_unreachable ();
5001 return range_check (result, "SINH");
5005 /* The argument is always a double precision real that is converted to
5006 single precision. TODO: Rounding! */
5008 gfc_expr *
5009 gfc_simplify_sngl (gfc_expr *a)
5011 gfc_expr *result;
5013 if (a->expr_type != EXPR_CONSTANT)
5014 return NULL;
5016 result = gfc_real2real (a, gfc_default_real_kind);
5017 return range_check (result, "SNGL");
5021 gfc_expr *
5022 gfc_simplify_spacing (gfc_expr *x)
5024 gfc_expr *result;
5025 int i;
5026 long int en, ep;
5028 if (x->expr_type != EXPR_CONSTANT)
5029 return NULL;
5031 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5033 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
5035 /* Special case x = 0 and -0. */
5036 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5037 if (mpfr_sgn (result->value.real) == 0)
5039 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5040 return result;
5043 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5044 are the radix, exponent of x, and precision. This excludes the
5045 possibility of subnormal numbers. Fortran 2003 states the result is
5046 b**max(e - p, emin - 1). */
5048 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
5049 en = (long int) gfc_real_kinds[i].min_exponent - 1;
5050 en = en > ep ? en : ep;
5052 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
5053 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
5055 return range_check (result, "SPACING");
5059 gfc_expr *
5060 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
5062 gfc_expr *result = 0L;
5063 int i, j, dim, ncopies;
5064 mpz_t size;
5066 if ((!gfc_is_constant_expr (source)
5067 && !is_constant_array_expr (source))
5068 || !gfc_is_constant_expr (dim_expr)
5069 || !gfc_is_constant_expr (ncopies_expr))
5070 return NULL;
5072 gcc_assert (dim_expr->ts.type == BT_INTEGER);
5073 gfc_extract_int (dim_expr, &dim);
5074 dim -= 1; /* zero-base DIM */
5076 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
5077 gfc_extract_int (ncopies_expr, &ncopies);
5078 ncopies = MAX (ncopies, 0);
5080 /* Do not allow the array size to exceed the limit for an array
5081 constructor. */
5082 if (source->expr_type == EXPR_ARRAY)
5084 if (gfc_array_size (source, &size) == FAILURE)
5085 gfc_internal_error ("Failure getting length of a constant array.");
5087 else
5088 mpz_init_set_ui (size, 1);
5090 if (mpz_get_si (size)*ncopies > gfc_option.flag_max_array_constructor)
5091 return NULL;
5093 if (source->expr_type == EXPR_CONSTANT)
5095 gcc_assert (dim == 0);
5097 result = gfc_start_constructor (source->ts.type,
5098 source->ts.kind,
5099 &source->where);
5100 result->rank = 1;
5101 result->shape = gfc_get_shape (result->rank);
5102 mpz_init_set_si (result->shape[0], ncopies);
5104 for (i = 0; i < ncopies; ++i)
5105 gfc_append_constructor (result, gfc_copy_expr (source));
5107 else if (source->expr_type == EXPR_ARRAY)
5109 int result_size, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
5110 gfc_constructor *ctor, *source_ctor, *result_ctor;
5112 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
5113 gcc_assert (dim >= 0 && dim <= source->rank);
5115 result = gfc_start_constructor (source->ts.type,
5116 source->ts.kind,
5117 &source->where);
5118 result->rank = source->rank + 1;
5119 result->shape = gfc_get_shape (result->rank);
5121 result_size = 1;
5122 for (i = 0, j = 0; i < result->rank; ++i)
5124 if (i != dim)
5125 mpz_init_set (result->shape[i], source->shape[j++]);
5126 else
5127 mpz_init_set_si (result->shape[i], ncopies);
5129 extent[i] = mpz_get_si (result->shape[i]);
5130 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
5131 result_size *= extent[i];
5134 for (i = 0; i < result_size; ++i)
5135 gfc_append_constructor (result, NULL);
5137 source_ctor = source->value.constructor;
5138 result_ctor = result->value.constructor;
5139 while (source_ctor)
5141 ctor = result_ctor;
5143 for (i = 0; i < ncopies; ++i)
5145 ctor->expr = gfc_copy_expr (source_ctor->expr);
5146 ADVANCE (ctor, rstride[dim]);
5149 ADVANCE (result_ctor, (dim == 0 ? ncopies : 1));
5150 ADVANCE (source_ctor, 1);
5153 else
5154 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
5155 Replace NULL with gcc_unreachable() after implementing
5156 gfc_simplify_cshift(). */
5157 return NULL;
5159 if (source->ts.type == BT_CHARACTER)
5160 result->ts.u.cl = source->ts.u.cl;
5162 return result;
5166 gfc_expr *
5167 gfc_simplify_sqrt (gfc_expr *e)
5169 gfc_expr *result;
5171 if (e->expr_type != EXPR_CONSTANT)
5172 return NULL;
5174 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
5176 switch (e->ts.type)
5178 case BT_REAL:
5179 if (mpfr_cmp_si (e->value.real, 0) < 0)
5180 goto negative_arg;
5181 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
5183 break;
5185 case BT_COMPLEX:
5186 gfc_set_model (e->value.real);
5187 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
5188 break;
5190 default:
5191 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
5194 return range_check (result, "SQRT");
5196 negative_arg:
5197 gfc_free_expr (result);
5198 gfc_error ("Argument of SQRT at %L has a negative value", &e->where);
5199 return &gfc_bad_expr;
5203 gfc_expr *
5204 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5206 gfc_expr *result;
5208 if (!is_constant_array_expr (array)
5209 || !gfc_is_constant_expr (dim))
5210 return NULL;
5212 if (mask
5213 && !is_constant_array_expr (mask)
5214 && mask->expr_type != EXPR_CONSTANT)
5215 return NULL;
5217 result = transformational_result (array, dim, array->ts.type,
5218 array->ts.kind, &array->where);
5219 init_result_expr (result, 0, NULL);
5221 return !dim || array->rank == 1 ?
5222 simplify_transformation_to_scalar (result, array, mask, gfc_add) :
5223 simplify_transformation_to_array (result, array, dim, mask, gfc_add);
5227 gfc_expr *
5228 gfc_simplify_tan (gfc_expr *x)
5230 gfc_expr *result;
5232 if (x->expr_type != EXPR_CONSTANT)
5233 return NULL;
5235 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
5237 if (x->ts.type == BT_REAL)
5238 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
5239 else if (x->ts.type == BT_COMPLEX)
5240 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5241 else
5242 gcc_unreachable ();
5244 return range_check (result, "TAN");
5248 gfc_expr *
5249 gfc_simplify_tanh (gfc_expr *x)
5251 gfc_expr *result;
5253 if (x->expr_type != EXPR_CONSTANT)
5254 return NULL;
5256 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
5258 if (x->ts.type == BT_REAL)
5259 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
5260 else if (x->ts.type == BT_COMPLEX)
5261 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5262 else
5263 gcc_unreachable ();
5265 return range_check (result, "TANH");
5270 gfc_expr *
5271 gfc_simplify_tiny (gfc_expr *e)
5273 gfc_expr *result;
5274 int i;
5276 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
5278 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
5279 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5281 return result;
5285 gfc_expr *
5286 gfc_simplify_trailz (gfc_expr *e)
5288 gfc_expr *result;
5289 unsigned long tz, bs;
5290 int i;
5292 if (e->expr_type != EXPR_CONSTANT)
5293 return NULL;
5295 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5296 bs = gfc_integer_kinds[i].bit_size;
5297 tz = mpz_scan1 (e->value.integer, 0);
5299 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind, &e->where);
5300 mpz_set_ui (result->value.integer, MIN (tz, bs));
5302 return result;
5306 gfc_expr *
5307 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
5309 gfc_expr *result;
5310 gfc_expr *mold_element;
5311 size_t source_size;
5312 size_t result_size;
5313 size_t result_elt_size;
5314 size_t buffer_size;
5315 mpz_t tmp;
5316 unsigned char *buffer;
5318 if (!gfc_is_constant_expr (source)
5319 || (gfc_init_expr && !gfc_is_constant_expr (mold))
5320 || !gfc_is_constant_expr (size))
5321 return NULL;
5323 if (source->expr_type == EXPR_FUNCTION)
5324 return NULL;
5326 /* Calculate the size of the source. */
5327 if (source->expr_type == EXPR_ARRAY
5328 && gfc_array_size (source, &tmp) == FAILURE)
5329 gfc_internal_error ("Failure getting length of a constant array.");
5331 source_size = gfc_target_expr_size (source);
5333 /* Create an empty new expression with the appropriate characteristics. */
5334 result = gfc_constant_result (mold->ts.type, mold->ts.kind,
5335 &source->where);
5336 result->ts = mold->ts;
5338 mold_element = mold->expr_type == EXPR_ARRAY
5339 ? mold->value.constructor->expr
5340 : mold;
5342 /* Set result character length, if needed. Note that this needs to be
5343 set even for array expressions, in order to pass this information into
5344 gfc_target_interpret_expr. */
5345 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
5346 result->value.character.length = mold_element->value.character.length;
5348 /* Set the number of elements in the result, and determine its size. */
5349 result_elt_size = gfc_target_expr_size (mold_element);
5350 if (result_elt_size == 0)
5352 gfc_free_expr (result);
5353 return NULL;
5356 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
5358 int result_length;
5360 result->expr_type = EXPR_ARRAY;
5361 result->rank = 1;
5363 if (size)
5364 result_length = (size_t)mpz_get_ui (size->value.integer);
5365 else
5367 result_length = source_size / result_elt_size;
5368 if (result_length * result_elt_size < source_size)
5369 result_length += 1;
5372 result->shape = gfc_get_shape (1);
5373 mpz_init_set_ui (result->shape[0], result_length);
5375 result_size = result_length * result_elt_size;
5377 else
5379 result->rank = 0;
5380 result_size = result_elt_size;
5383 if (gfc_option.warn_surprising && source_size < result_size)
5384 gfc_warning("Intrinsic TRANSFER at %L has partly undefined result: "
5385 "source size %ld < result size %ld", &source->where,
5386 (long) source_size, (long) result_size);
5388 /* Allocate the buffer to store the binary version of the source. */
5389 buffer_size = MAX (source_size, result_size);
5390 buffer = (unsigned char*)alloca (buffer_size);
5391 memset (buffer, 0, buffer_size);
5393 /* Now write source to the buffer. */
5394 gfc_target_encode_expr (source, buffer, buffer_size);
5396 /* And read the buffer back into the new expression. */
5397 gfc_target_interpret_expr (buffer, buffer_size, result);
5399 return result;
5403 gfc_expr *
5404 gfc_simplify_transpose (gfc_expr *matrix)
5406 int i, matrix_rows;
5407 gfc_expr *result;
5408 gfc_constructor *matrix_ctor;
5410 if (!is_constant_array_expr (matrix))
5411 return NULL;
5413 gcc_assert (matrix->rank == 2);
5415 result = gfc_start_constructor (matrix->ts.type, matrix->ts.kind, &matrix->where);
5416 result->rank = 2;
5417 result->shape = gfc_get_shape (result->rank);
5418 mpz_set (result->shape[0], matrix->shape[1]);
5419 mpz_set (result->shape[1], matrix->shape[0]);
5421 if (matrix->ts.type == BT_CHARACTER)
5422 result->ts.u.cl = matrix->ts.u.cl;
5424 matrix_rows = mpz_get_si (matrix->shape[0]);
5425 matrix_ctor = matrix->value.constructor;
5426 for (i = 0; i < matrix_rows; ++i)
5428 gfc_constructor *column_ctor = matrix_ctor;
5429 while (column_ctor)
5431 gfc_append_constructor (result,
5432 gfc_copy_expr (column_ctor->expr));
5434 ADVANCE (column_ctor, matrix_rows);
5437 ADVANCE (matrix_ctor, 1);
5440 return result;
5444 gfc_expr *
5445 gfc_simplify_trim (gfc_expr *e)
5447 gfc_expr *result;
5448 int count, i, len, lentrim;
5450 if (e->expr_type != EXPR_CONSTANT)
5451 return NULL;
5453 len = e->value.character.length;
5455 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
5457 for (count = 0, i = 1; i <= len; ++i)
5459 if (e->value.character.string[len - i] == ' ')
5460 count++;
5461 else
5462 break;
5465 lentrim = len - count;
5467 result->value.character.length = lentrim;
5468 result->value.character.string = gfc_get_wide_string (lentrim + 1);
5470 for (i = 0; i < lentrim; i++)
5471 result->value.character.string[i] = e->value.character.string[i];
5473 result->value.character.string[lentrim] = '\0'; /* For debugger */
5475 return result;
5479 gfc_expr *
5480 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5482 return simplify_bound (array, dim, kind, 1);
5486 gfc_expr *
5487 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
5489 gfc_expr *result, *e;
5490 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
5492 if (!is_constant_array_expr (vector)
5493 || !is_constant_array_expr (mask)
5494 || (!gfc_is_constant_expr (field)
5495 && !is_constant_array_expr(field)))
5496 return NULL;
5498 result = gfc_start_constructor (vector->ts.type,
5499 vector->ts.kind,
5500 &vector->where);
5501 result->rank = mask->rank;
5502 result->shape = gfc_copy_shape (mask->shape, mask->rank);
5504 if (vector->ts.type == BT_CHARACTER)
5505 result->ts.u.cl = vector->ts.u.cl;
5507 vector_ctor = vector->value.constructor;
5508 mask_ctor = mask->value.constructor;
5509 field_ctor = field->expr_type == EXPR_ARRAY ? field->value.constructor : NULL;
5511 while (mask_ctor)
5513 if (mask_ctor->expr->value.logical)
5515 gcc_assert (vector_ctor);
5516 e = gfc_copy_expr (vector_ctor->expr);
5517 ADVANCE (vector_ctor, 1);
5519 else if (field->expr_type == EXPR_ARRAY)
5520 e = gfc_copy_expr (field_ctor->expr);
5521 else
5522 e = gfc_copy_expr (field);
5524 gfc_append_constructor (result, e);
5526 ADVANCE (mask_ctor, 1);
5527 ADVANCE (field_ctor, 1);
5530 return result;
5534 gfc_expr *
5535 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
5537 gfc_expr *result;
5538 int back;
5539 size_t index, len, lenset;
5540 size_t i;
5541 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
5543 if (k == -1)
5544 return &gfc_bad_expr;
5546 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
5547 return NULL;
5549 if (b != NULL && b->value.logical != 0)
5550 back = 1;
5551 else
5552 back = 0;
5554 result = gfc_constant_result (BT_INTEGER, k, &s->where);
5556 len = s->value.character.length;
5557 lenset = set->value.character.length;
5559 if (len == 0)
5561 mpz_set_ui (result->value.integer, 0);
5562 return result;
5565 if (back == 0)
5567 if (lenset == 0)
5569 mpz_set_ui (result->value.integer, 1);
5570 return result;
5573 index = wide_strspn (s->value.character.string,
5574 set->value.character.string) + 1;
5575 if (index > len)
5576 index = 0;
5579 else
5581 if (lenset == 0)
5583 mpz_set_ui (result->value.integer, len);
5584 return result;
5586 for (index = len; index > 0; index --)
5588 for (i = 0; i < lenset; i++)
5590 if (s->value.character.string[index - 1]
5591 == set->value.character.string[i])
5592 break;
5594 if (i == lenset)
5595 break;
5599 mpz_set_ui (result->value.integer, index);
5600 return result;
5604 gfc_expr *
5605 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
5607 gfc_expr *result;
5608 int kind;
5610 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
5611 return NULL;
5613 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
5614 if (x->ts.type == BT_INTEGER)
5616 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
5617 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
5618 return range_check (result, "XOR");
5620 else /* BT_LOGICAL */
5622 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
5623 result->value.logical = (x->value.logical && !y->value.logical)
5624 || (!x->value.logical && y->value.logical);
5625 return result;
5631 /****************** Constant simplification *****************/
5633 /* Master function to convert one constant to another. While this is
5634 used as a simplification function, it requires the destination type
5635 and kind information which is supplied by a special case in
5636 do_simplify(). */
5638 gfc_expr *
5639 gfc_convert_constant (gfc_expr *e, bt type, int kind)
5641 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
5642 gfc_constructor *head, *c, *tail = NULL;
5644 switch (e->ts.type)
5646 case BT_INTEGER:
5647 switch (type)
5649 case BT_INTEGER:
5650 f = gfc_int2int;
5651 break;
5652 case BT_REAL:
5653 f = gfc_int2real;
5654 break;
5655 case BT_COMPLEX:
5656 f = gfc_int2complex;
5657 break;
5658 case BT_LOGICAL:
5659 f = gfc_int2log;
5660 break;
5661 default:
5662 goto oops;
5664 break;
5666 case BT_REAL:
5667 switch (type)
5669 case BT_INTEGER:
5670 f = gfc_real2int;
5671 break;
5672 case BT_REAL:
5673 f = gfc_real2real;
5674 break;
5675 case BT_COMPLEX:
5676 f = gfc_real2complex;
5677 break;
5678 default:
5679 goto oops;
5681 break;
5683 case BT_COMPLEX:
5684 switch (type)
5686 case BT_INTEGER:
5687 f = gfc_complex2int;
5688 break;
5689 case BT_REAL:
5690 f = gfc_complex2real;
5691 break;
5692 case BT_COMPLEX:
5693 f = gfc_complex2complex;
5694 break;
5696 default:
5697 goto oops;
5699 break;
5701 case BT_LOGICAL:
5702 switch (type)
5704 case BT_INTEGER:
5705 f = gfc_log2int;
5706 break;
5707 case BT_LOGICAL:
5708 f = gfc_log2log;
5709 break;
5710 default:
5711 goto oops;
5713 break;
5715 case BT_HOLLERITH:
5716 switch (type)
5718 case BT_INTEGER:
5719 f = gfc_hollerith2int;
5720 break;
5722 case BT_REAL:
5723 f = gfc_hollerith2real;
5724 break;
5726 case BT_COMPLEX:
5727 f = gfc_hollerith2complex;
5728 break;
5730 case BT_CHARACTER:
5731 f = gfc_hollerith2character;
5732 break;
5734 case BT_LOGICAL:
5735 f = gfc_hollerith2logical;
5736 break;
5738 default:
5739 goto oops;
5741 break;
5743 default:
5744 oops:
5745 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
5748 result = NULL;
5750 switch (e->expr_type)
5752 case EXPR_CONSTANT:
5753 result = f (e, kind);
5754 if (result == NULL)
5755 return &gfc_bad_expr;
5756 break;
5758 case EXPR_ARRAY:
5759 if (!gfc_is_constant_expr (e))
5760 break;
5762 head = NULL;
5764 for (c = e->value.constructor; c; c = c->next)
5766 if (head == NULL)
5767 head = tail = gfc_get_constructor ();
5768 else
5770 tail->next = gfc_get_constructor ();
5771 tail = tail->next;
5774 tail->where = c->where;
5776 if (c->iterator == NULL)
5777 tail->expr = f (c->expr, kind);
5778 else
5780 g = gfc_convert_constant (c->expr, type, kind);
5781 if (g == &gfc_bad_expr)
5782 return g;
5783 tail->expr = g;
5786 if (tail->expr == NULL)
5788 gfc_free_constructor (head);
5789 return NULL;
5793 result = gfc_get_expr ();
5794 result->ts.type = type;
5795 result->ts.kind = kind;
5796 result->expr_type = EXPR_ARRAY;
5797 result->value.constructor = head;
5798 result->shape = gfc_copy_shape (e->shape, e->rank);
5799 result->where = e->where;
5800 result->rank = e->rank;
5801 break;
5803 default:
5804 break;
5807 return result;
5811 /* Function for converting character constants. */
5812 gfc_expr *
5813 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
5815 gfc_expr *result;
5816 int i;
5818 if (!gfc_is_constant_expr (e))
5819 return NULL;
5821 if (e->expr_type == EXPR_CONSTANT)
5823 /* Simple case of a scalar. */
5824 result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
5825 if (result == NULL)
5826 return &gfc_bad_expr;
5828 result->value.character.length = e->value.character.length;
5829 result->value.character.string
5830 = gfc_get_wide_string (e->value.character.length + 1);
5831 memcpy (result->value.character.string, e->value.character.string,
5832 (e->value.character.length + 1) * sizeof (gfc_char_t));
5834 /* Check we only have values representable in the destination kind. */
5835 for (i = 0; i < result->value.character.length; i++)
5836 if (!gfc_check_character_range (result->value.character.string[i],
5837 kind))
5839 gfc_error ("Character '%s' in string at %L cannot be converted "
5840 "into character kind %d",
5841 gfc_print_wide_char (result->value.character.string[i]),
5842 &e->where, kind);
5843 return &gfc_bad_expr;
5846 return result;
5848 else if (e->expr_type == EXPR_ARRAY)
5850 /* For an array constructor, we convert each constructor element. */
5851 gfc_constructor *head = NULL, *tail = NULL, *c;
5853 for (c = e->value.constructor; c; c = c->next)
5855 if (head == NULL)
5856 head = tail = gfc_get_constructor ();
5857 else
5859 tail->next = gfc_get_constructor ();
5860 tail = tail->next;
5863 tail->where = c->where;
5864 tail->expr = gfc_convert_char_constant (c->expr, type, kind);
5865 if (tail->expr == &gfc_bad_expr)
5867 tail->expr = NULL;
5868 return &gfc_bad_expr;
5871 if (tail->expr == NULL)
5873 gfc_free_constructor (head);
5874 return NULL;
5878 result = gfc_get_expr ();
5879 result->ts.type = type;
5880 result->ts.kind = kind;
5881 result->expr_type = EXPR_ARRAY;
5882 result->value.constructor = head;
5883 result->shape = gfc_copy_shape (e->shape, e->rank);
5884 result->where = e->where;
5885 result->rank = e->rank;
5886 result->ts.u.cl = e->ts.u.cl;
5888 return result;
5890 else
5891 return NULL;