1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2018 Free Software Foundation, Inc.
3 Contributed by Andy Vaught & Katherine Holcomb
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
24 #include "tm.h" /* For BITS_PER_UNIT. */
27 #include "intrinsic.h"
28 #include "target-memory.h"
29 #include "constructor.h"
30 #include "version.h" /* For version_string. */
34 static int min_max_choose (gfc_expr
*, gfc_expr
*, int);
36 gfc_expr gfc_bad_expr
;
38 static gfc_expr
*simplify_size (gfc_expr
*, gfc_expr
*, int);
41 /* Note that 'simplification' is not just transforming expressions.
42 For functions that are not simplified at compile time, range
43 checking is done if possible.
45 The return convention is that each simplification function returns:
47 A new expression node corresponding to the simplified arguments.
48 The original arguments are destroyed by the caller, and must not
49 be a part of the new expression.
51 NULL pointer indicating that no simplification was possible and
52 the original expression should remain intact.
54 An expression pointer to gfc_bad_expr (a static placeholder)
55 indicating that some error has prevented simplification. The
56 error is generated within the function and should be propagated
59 By the time a simplification function gets control, it has been
60 decided that the function call is really supposed to be the
61 intrinsic. No type checking is strictly necessary, since only
62 valid types will be passed on. On the other hand, a simplification
63 subroutine may have to look at the type of an argument as part of
66 Array arguments are only passed to these subroutines that implement
67 the simplification of transformational intrinsics.
69 The functions in this file don't have much comment with them, but
70 everything is reasonably straight-forward. The Standard, chapter 13
71 is the best comment you'll find for this file anyway. */
73 /* Range checks an expression node. If all goes well, returns the
74 node, otherwise returns &gfc_bad_expr and frees the node. */
77 range_check (gfc_expr
*result
, const char *name
)
82 if (result
->expr_type
!= EXPR_CONSTANT
)
85 switch (gfc_range_check (result
))
91 gfc_error ("Result of %s overflows its kind at %L", name
,
96 gfc_error ("Result of %s underflows its kind at %L", name
,
101 gfc_error ("Result of %s is NaN at %L", name
, &result
->where
);
105 gfc_error ("Result of %s gives range error for its kind at %L", name
,
110 gfc_free_expr (result
);
111 return &gfc_bad_expr
;
115 /* A helper function that gets an optional and possibly missing
116 kind parameter. Returns the kind, -1 if something went wrong. */
119 get_kind (bt type
, gfc_expr
*k
, const char *name
, int default_kind
)
126 if (k
->expr_type
!= EXPR_CONSTANT
)
128 gfc_error ("KIND parameter of %s at %L must be an initialization "
129 "expression", name
, &k
->where
);
133 if (gfc_extract_int (k
, &kind
)
134 || gfc_validate_kind (type
, kind
, true) < 0)
136 gfc_error ("Invalid KIND parameter of %s at %L", name
, &k
->where
);
144 /* Converts an mpz_t signed variable into an unsigned one, assuming
145 two's complement representations and a binary width of bitsize.
146 The conversion is a no-op unless x is negative; otherwise, it can
147 be accomplished by masking out the high bits. */
150 convert_mpz_to_unsigned (mpz_t x
, int bitsize
)
156 /* Confirm that no bits above the signed range are unset if we
157 are doing range checking. */
158 if (flag_range_check
!= 0)
159 gcc_assert (mpz_scan0 (x
, bitsize
-1) == ULONG_MAX
);
161 mpz_init_set_ui (mask
, 1);
162 mpz_mul_2exp (mask
, mask
, bitsize
);
163 mpz_sub_ui (mask
, mask
, 1);
165 mpz_and (x
, x
, mask
);
171 /* Confirm that no bits above the signed range are set. */
172 gcc_assert (mpz_scan1 (x
, bitsize
-1) == ULONG_MAX
);
177 /* Converts an mpz_t unsigned variable into a signed one, assuming
178 two's complement representations and a binary width of bitsize.
179 If the bitsize-1 bit is set, this is taken as a sign bit and
180 the number is converted to the corresponding negative number. */
183 gfc_convert_mpz_to_signed (mpz_t x
, int bitsize
)
187 /* Confirm that no bits above the unsigned range are set if we are
188 doing range checking. */
189 if (flag_range_check
!= 0)
190 gcc_assert (mpz_scan1 (x
, bitsize
) == ULONG_MAX
);
192 if (mpz_tstbit (x
, bitsize
- 1) == 1)
194 mpz_init_set_ui (mask
, 1);
195 mpz_mul_2exp (mask
, mask
, bitsize
);
196 mpz_sub_ui (mask
, mask
, 1);
198 /* We negate the number by hand, zeroing the high bits, that is
199 make it the corresponding positive number, and then have it
200 negated by GMP, giving the correct representation of the
203 mpz_add_ui (x
, x
, 1);
204 mpz_and (x
, x
, mask
);
213 /* In-place convert BOZ to REAL of the specified kind. */
216 convert_boz (gfc_expr
*x
, int kind
)
218 if (x
&& x
->ts
.type
== BT_INTEGER
&& x
->is_boz
)
225 if (!gfc_convert_boz (x
, &ts
))
226 return &gfc_bad_expr
;
233 /* Test that the expression is a constant array, simplifying if
234 we are dealing with a parameter array. */
237 is_constant_array_expr (gfc_expr
*e
)
244 if (e
->expr_type
== EXPR_VARIABLE
&& e
->rank
> 0
245 && e
->symtree
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
246 gfc_simplify_expr (e
, 1);
248 if (e
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (e
))
251 for (c
= gfc_constructor_first (e
->value
.constructor
);
252 c
; c
= gfc_constructor_next (c
))
253 if (c
->expr
->expr_type
!= EXPR_CONSTANT
254 && c
->expr
->expr_type
!= EXPR_STRUCTURE
)
261 /* Initialize a transformational result expression with a given value. */
264 init_result_expr (gfc_expr
*e
, int init
, gfc_expr
*array
)
266 if (e
&& e
->expr_type
== EXPR_ARRAY
)
268 gfc_constructor
*ctor
= gfc_constructor_first (e
->value
.constructor
);
271 init_result_expr (ctor
->expr
, init
, array
);
272 ctor
= gfc_constructor_next (ctor
);
275 else if (e
&& e
->expr_type
== EXPR_CONSTANT
)
277 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
284 e
->value
.logical
= (init
? 1 : 0);
289 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].min_int
);
290 else if (init
== INT_MAX
)
291 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].huge
);
293 mpz_set_si (e
->value
.integer
, init
);
299 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
300 mpfr_neg (e
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
302 else if (init
== INT_MAX
)
303 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
305 mpfr_set_si (e
->value
.real
, init
, GFC_RND_MODE
);
309 mpc_set_si (e
->value
.complex, init
, GFC_MPC_RND_MODE
);
315 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
316 gfc_extract_int (len
, &length
);
317 string
= gfc_get_wide_string (length
+ 1);
318 gfc_wide_memset (string
, 0, length
);
320 else if (init
== INT_MAX
)
322 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
323 gfc_extract_int (len
, &length
);
324 string
= gfc_get_wide_string (length
+ 1);
325 gfc_wide_memset (string
, 255, length
);
330 string
= gfc_get_wide_string (1);
333 string
[length
] = '\0';
334 e
->value
.character
.length
= length
;
335 e
->value
.character
.string
= string
;
347 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
348 if conj_a is true, the matrix_a is complex conjugated. */
351 compute_dot_product (gfc_expr
*matrix_a
, int stride_a
, int offset_a
,
352 gfc_expr
*matrix_b
, int stride_b
, int offset_b
,
355 gfc_expr
*result
, *a
, *b
, *c
;
357 result
= gfc_get_constant_expr (matrix_a
->ts
.type
, matrix_a
->ts
.kind
,
359 init_result_expr (result
, 0, NULL
);
361 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
362 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
365 /* Copying of expressions is required as operands are free'd
366 by the gfc_arith routines. */
367 switch (result
->ts
.type
)
370 result
= gfc_or (result
,
371 gfc_and (gfc_copy_expr (a
),
378 if (conj_a
&& a
->ts
.type
== BT_COMPLEX
)
379 c
= gfc_simplify_conjg (a
);
381 c
= gfc_copy_expr (a
);
382 result
= gfc_add (result
, gfc_multiply (c
, gfc_copy_expr (b
)));
389 offset_a
+= stride_a
;
390 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
392 offset_b
+= stride_b
;
393 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
400 /* Build a result expression for transformational intrinsics,
404 transformational_result (gfc_expr
*array
, gfc_expr
*dim
, bt type
,
405 int kind
, locus
* where
)
410 if (!dim
|| array
->rank
== 1)
411 return gfc_get_constant_expr (type
, kind
, where
);
413 result
= gfc_get_array_expr (type
, kind
, where
);
414 result
->shape
= gfc_copy_shape_excluding (array
->shape
, array
->rank
, dim
);
415 result
->rank
= array
->rank
- 1;
417 /* gfc_array_size() would count the number of elements in the constructor,
418 we have not built those yet. */
420 for (i
= 0; i
< result
->rank
; ++i
)
421 nelem
*= mpz_get_ui (result
->shape
[i
]);
423 for (i
= 0; i
< nelem
; ++i
)
425 gfc_constructor_append_expr (&result
->value
.constructor
,
426 gfc_get_constant_expr (type
, kind
, where
),
434 typedef gfc_expr
* (*transformational_op
)(gfc_expr
*, gfc_expr
*);
436 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
437 of COUNT intrinsic is .TRUE..
439 Interface and implementation mimics arith functions as
440 gfc_add, gfc_multiply, etc. */
443 gfc_count (gfc_expr
*op1
, gfc_expr
*op2
)
447 gcc_assert (op1
->ts
.type
== BT_INTEGER
);
448 gcc_assert (op2
->ts
.type
== BT_LOGICAL
);
449 gcc_assert (op2
->value
.logical
);
451 result
= gfc_copy_expr (op1
);
452 mpz_add_ui (result
->value
.integer
, result
->value
.integer
, 1);
460 /* Transforms an ARRAY with operation OP, according to MASK, to a
461 scalar RESULT. E.g. called if
463 REAL, PARAMETER :: array(n, m) = ...
464 REAL, PARAMETER :: s = SUM(array)
466 where OP == gfc_add(). */
469 simplify_transformation_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
470 transformational_op op
)
473 gfc_constructor
*array_ctor
, *mask_ctor
;
475 /* Shortcut for constant .FALSE. MASK. */
477 && mask
->expr_type
== EXPR_CONSTANT
478 && !mask
->value
.logical
)
481 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
483 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
484 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
488 a
= array_ctor
->expr
;
489 array_ctor
= gfc_constructor_next (array_ctor
);
491 /* A constant MASK equals .TRUE. here and can be ignored. */
495 mask_ctor
= gfc_constructor_next (mask_ctor
);
496 if (!m
->value
.logical
)
500 result
= op (result
, gfc_copy_expr (a
));
508 /* Transforms an ARRAY with operation OP, according to MASK, to an
509 array RESULT. E.g. called if
511 REAL, PARAMETER :: array(n, m) = ...
512 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
514 where OP == gfc_multiply().
515 The result might be post processed using post_op. */
518 simplify_transformation_to_array (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*dim
,
519 gfc_expr
*mask
, transformational_op op
,
520 transformational_op post_op
)
523 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
524 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
525 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
527 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
528 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
529 tmpstride
[GFC_MAX_DIMENSIONS
];
531 /* Shortcut for constant .FALSE. MASK. */
533 && mask
->expr_type
== EXPR_CONSTANT
534 && !mask
->value
.logical
)
537 /* Build an indexed table for array element expressions to minimize
538 linked-list traversal. Masked elements are set to NULL. */
539 gfc_array_size (array
, &size
);
540 arraysize
= mpz_get_ui (size
);
543 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
545 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
547 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
548 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
550 for (i
= 0; i
< arraysize
; ++i
)
552 arrayvec
[i
] = array_ctor
->expr
;
553 array_ctor
= gfc_constructor_next (array_ctor
);
557 if (!mask_ctor
->expr
->value
.logical
)
560 mask_ctor
= gfc_constructor_next (mask_ctor
);
564 /* Same for the result expression. */
565 gfc_array_size (result
, &size
);
566 resultsize
= mpz_get_ui (size
);
569 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
570 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
571 for (i
= 0; i
< resultsize
; ++i
)
573 resultvec
[i
] = result_ctor
->expr
;
574 result_ctor
= gfc_constructor_next (result_ctor
);
577 gfc_extract_int (dim
, &dim_index
);
578 dim_index
-= 1; /* zero-base index */
582 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
585 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
588 dim_extent
= mpz_get_si (array
->shape
[i
]);
589 dim_stride
= tmpstride
[i
];
593 extent
[n
] = mpz_get_si (array
->shape
[i
]);
594 sstride
[n
] = tmpstride
[i
];
595 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
604 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
606 *dest
= op (*dest
, gfc_copy_expr (*src
));
613 while (!done
&& count
[n
] == extent
[n
])
616 base
-= sstride
[n
] * extent
[n
];
617 dest
-= dstride
[n
] * extent
[n
];
620 if (n
< result
->rank
)
622 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
623 times, we'd warn for the last iteration, because the
624 array index will have already been incremented to the
625 array sizes, and we can't tell that this must make
626 the test against result->rank false, because ranks
627 must not exceed GFC_MAX_DIMENSIONS. */
628 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray
-bounds
)
639 /* Place updated expression in result constructor. */
640 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
641 for (i
= 0; i
< resultsize
; ++i
)
644 result_ctor
->expr
= post_op (result_ctor
->expr
, resultvec
[i
]);
646 result_ctor
->expr
= resultvec
[i
];
647 result_ctor
= gfc_constructor_next (result_ctor
);
657 simplify_transformation (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
658 int init_val
, transformational_op op
)
662 if (!is_constant_array_expr (array
)
663 || !gfc_is_constant_expr (dim
))
667 && !is_constant_array_expr (mask
)
668 && mask
->expr_type
!= EXPR_CONSTANT
)
671 result
= transformational_result (array
, dim
, array
->ts
.type
,
672 array
->ts
.kind
, &array
->where
);
673 init_result_expr (result
, init_val
, array
);
675 return !dim
|| array
->rank
== 1 ?
676 simplify_transformation_to_scalar (result
, array
, mask
, op
) :
677 simplify_transformation_to_array (result
, array
, dim
, mask
, op
, NULL
);
681 /********************** Simplification functions *****************************/
684 gfc_simplify_abs (gfc_expr
*e
)
688 if (e
->expr_type
!= EXPR_CONSTANT
)
694 result
= gfc_get_constant_expr (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
695 mpz_abs (result
->value
.integer
, e
->value
.integer
);
696 return range_check (result
, "IABS");
699 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
700 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
701 return range_check (result
, "ABS");
704 gfc_set_model_kind (e
->ts
.kind
);
705 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
706 mpc_abs (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
707 return range_check (result
, "CABS");
710 gfc_internal_error ("gfc_simplify_abs(): Bad type");
716 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
720 bool too_large
= false;
722 if (e
->expr_type
!= EXPR_CONSTANT
)
725 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
727 return &gfc_bad_expr
;
729 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
731 gfc_error ("Argument of %s function at %L is negative", name
,
733 return &gfc_bad_expr
;
736 if (ascii
&& warn_surprising
&& mpz_cmp_si (e
->value
.integer
, 127) > 0)
737 gfc_warning (OPT_Wsurprising
,
738 "Argument of %s function at %L outside of range [0,127]",
741 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
746 mpz_init_set_ui (t
, 2);
747 mpz_pow_ui (t
, t
, 32);
748 mpz_sub_ui (t
, t
, 1);
749 if (mpz_cmp (e
->value
.integer
, t
) > 0)
756 gfc_error ("Argument of %s function at %L is too large for the "
757 "collating sequence of kind %d", name
, &e
->where
, kind
);
758 return &gfc_bad_expr
;
761 result
= gfc_get_character_expr (kind
, &e
->where
, NULL
, 1);
762 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
769 /* We use the processor's collating sequence, because all
770 systems that gfortran currently works on are ASCII. */
773 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
775 return simplify_achar_char (e
, k
, "ACHAR", true);
780 gfc_simplify_acos (gfc_expr
*x
)
784 if (x
->expr_type
!= EXPR_CONSTANT
)
790 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
791 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
793 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
795 return &gfc_bad_expr
;
797 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
798 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
802 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
803 mpc_acos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
807 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
810 return range_check (result
, "ACOS");
814 gfc_simplify_acosh (gfc_expr
*x
)
818 if (x
->expr_type
!= EXPR_CONSTANT
)
824 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
826 gfc_error ("Argument of ACOSH at %L must not be less than 1",
828 return &gfc_bad_expr
;
831 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
832 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
836 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
837 mpc_acosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
841 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
844 return range_check (result
, "ACOSH");
848 gfc_simplify_adjustl (gfc_expr
*e
)
854 if (e
->expr_type
!= EXPR_CONSTANT
)
857 len
= e
->value
.character
.length
;
859 for (count
= 0, i
= 0; i
< len
; ++i
)
861 ch
= e
->value
.character
.string
[i
];
867 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
868 for (i
= 0; i
< len
- count
; ++i
)
869 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
876 gfc_simplify_adjustr (gfc_expr
*e
)
882 if (e
->expr_type
!= EXPR_CONSTANT
)
885 len
= e
->value
.character
.length
;
887 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
889 ch
= e
->value
.character
.string
[i
];
895 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
896 for (i
= 0; i
< count
; ++i
)
897 result
->value
.character
.string
[i
] = ' ';
899 for (i
= count
; i
< len
; ++i
)
900 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
907 gfc_simplify_aimag (gfc_expr
*e
)
911 if (e
->expr_type
!= EXPR_CONSTANT
)
914 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
915 mpfr_set (result
->value
.real
, mpc_imagref (e
->value
.complex), GFC_RND_MODE
);
917 return range_check (result
, "AIMAG");
922 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
924 gfc_expr
*rtrunc
, *result
;
927 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
929 return &gfc_bad_expr
;
931 if (e
->expr_type
!= EXPR_CONSTANT
)
934 rtrunc
= gfc_copy_expr (e
);
935 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
937 result
= gfc_real2real (rtrunc
, kind
);
939 gfc_free_expr (rtrunc
);
941 return range_check (result
, "AINT");
946 gfc_simplify_all (gfc_expr
*mask
, gfc_expr
*dim
)
948 return simplify_transformation (mask
, dim
, NULL
, true, gfc_and
);
953 gfc_simplify_dint (gfc_expr
*e
)
955 gfc_expr
*rtrunc
, *result
;
957 if (e
->expr_type
!= EXPR_CONSTANT
)
960 rtrunc
= gfc_copy_expr (e
);
961 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
963 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
965 gfc_free_expr (rtrunc
);
967 return range_check (result
, "DINT");
972 gfc_simplify_dreal (gfc_expr
*e
)
974 gfc_expr
*result
= NULL
;
976 if (e
->expr_type
!= EXPR_CONSTANT
)
979 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
980 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
982 return range_check (result
, "DREAL");
987 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
992 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
994 return &gfc_bad_expr
;
996 if (e
->expr_type
!= EXPR_CONSTANT
)
999 result
= gfc_get_constant_expr (e
->ts
.type
, kind
, &e
->where
);
1000 mpfr_round (result
->value
.real
, e
->value
.real
);
1002 return range_check (result
, "ANINT");
1007 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
1012 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1015 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1020 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
1021 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1022 return range_check (result
, "AND");
1025 return gfc_get_logical_expr (kind
, &x
->where
,
1026 x
->value
.logical
&& y
->value
.logical
);
1035 gfc_simplify_any (gfc_expr
*mask
, gfc_expr
*dim
)
1037 return simplify_transformation (mask
, dim
, NULL
, false, gfc_or
);
1042 gfc_simplify_dnint (gfc_expr
*e
)
1046 if (e
->expr_type
!= EXPR_CONSTANT
)
1049 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &e
->where
);
1050 mpfr_round (result
->value
.real
, e
->value
.real
);
1052 return range_check (result
, "DNINT");
1057 gfc_simplify_asin (gfc_expr
*x
)
1061 if (x
->expr_type
!= EXPR_CONSTANT
)
1067 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1068 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1070 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1072 return &gfc_bad_expr
;
1074 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1075 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1079 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1080 mpc_asin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1084 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1087 return range_check (result
, "ASIN");
1092 gfc_simplify_asinh (gfc_expr
*x
)
1096 if (x
->expr_type
!= EXPR_CONSTANT
)
1099 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1104 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1108 mpc_asinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1112 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1115 return range_check (result
, "ASINH");
1120 gfc_simplify_atan (gfc_expr
*x
)
1124 if (x
->expr_type
!= EXPR_CONSTANT
)
1127 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1132 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1136 mpc_atan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1140 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1143 return range_check (result
, "ATAN");
1148 gfc_simplify_atanh (gfc_expr
*x
)
1152 if (x
->expr_type
!= EXPR_CONSTANT
)
1158 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
1159 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
1161 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1163 return &gfc_bad_expr
;
1165 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1166 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1170 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1171 mpc_atanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1175 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1178 return range_check (result
, "ATANH");
1183 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
1187 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1190 if (mpfr_zero_p (y
->value
.real
) && mpfr_zero_p (x
->value
.real
))
1192 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1193 "second argument must not be zero", &x
->where
);
1194 return &gfc_bad_expr
;
1197 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1198 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1200 return range_check (result
, "ATAN2");
1205 gfc_simplify_bessel_j0 (gfc_expr
*x
)
1209 if (x
->expr_type
!= EXPR_CONSTANT
)
1212 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1213 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1215 return range_check (result
, "BESSEL_J0");
1220 gfc_simplify_bessel_j1 (gfc_expr
*x
)
1224 if (x
->expr_type
!= EXPR_CONSTANT
)
1227 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1228 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1230 return range_check (result
, "BESSEL_J1");
1235 gfc_simplify_bessel_jn (gfc_expr
*order
, gfc_expr
*x
)
1240 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1243 n
= mpz_get_si (order
->value
.integer
);
1244 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1245 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1247 return range_check (result
, "BESSEL_JN");
1251 /* Simplify transformational form of JN and YN. */
1254 gfc_simplify_bessel_n2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
,
1261 mpfr_t x2rev
, last1
, last2
;
1263 if (x
->expr_type
!= EXPR_CONSTANT
|| order1
->expr_type
!= EXPR_CONSTANT
1264 || order2
->expr_type
!= EXPR_CONSTANT
)
1267 n1
= mpz_get_si (order1
->value
.integer
);
1268 n2
= mpz_get_si (order2
->value
.integer
);
1269 result
= gfc_get_array_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1271 result
->shape
= gfc_get_shape (1);
1272 mpz_init_set_ui (result
->shape
[0], MAX (n2
-n1
+1, 0));
1277 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1278 YN(N, 0.0) = -Inf. */
1280 if (mpfr_cmp_ui (x
->value
.real
, 0.0) == 0)
1282 if (!jn
&& flag_range_check
)
1284 gfc_error ("Result of BESSEL_YN is -INF at %L", &result
->where
);
1285 gfc_free_expr (result
);
1286 return &gfc_bad_expr
;
1291 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1292 mpfr_set_ui (e
->value
.real
, 1, GFC_RND_MODE
);
1293 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1298 for (i
= n1
; i
<= n2
; i
++)
1300 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1302 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
1304 mpfr_set_inf (e
->value
.real
, -1);
1305 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1312 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1313 are stable for downward recursion and Neumann functions are stable
1314 for upward recursion. It is
1316 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1317 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1318 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1320 gfc_set_model_kind (x
->ts
.kind
);
1322 /* Get first recursion anchor. */
1326 mpfr_jn (last1
, n2
, x
->value
.real
, GFC_RND_MODE
);
1328 mpfr_yn (last1
, n1
, x
->value
.real
, GFC_RND_MODE
);
1330 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1331 mpfr_set (e
->value
.real
, last1
, GFC_RND_MODE
);
1332 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1336 gfc_free_expr (result
);
1337 return &gfc_bad_expr
;
1339 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1347 /* Get second recursion anchor. */
1351 mpfr_jn (last2
, n2
-1, x
->value
.real
, GFC_RND_MODE
);
1353 mpfr_yn (last2
, n1
+1, x
->value
.real
, GFC_RND_MODE
);
1355 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1356 mpfr_set (e
->value
.real
, last2
, GFC_RND_MODE
);
1357 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1362 gfc_free_expr (result
);
1363 return &gfc_bad_expr
;
1366 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
, -2);
1368 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1377 /* Start actual recursion. */
1380 mpfr_ui_div (x2rev
, 2, x
->value
.real
, GFC_RND_MODE
);
1382 for (i
= 2; i
<= n2
-n1
; i
++)
1384 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1386 /* Special case: For YN, if the previous N gave -INF, set
1387 also N+1 to -INF. */
1388 if (!jn
&& !flag_range_check
&& mpfr_inf_p (last2
))
1390 mpfr_set_inf (e
->value
.real
, -1);
1391 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1396 mpfr_mul_si (e
->value
.real
, x2rev
, jn
? (n2
-i
+1) : (n1
+i
-1),
1398 mpfr_mul (e
->value
.real
, e
->value
.real
, last2
, GFC_RND_MODE
);
1399 mpfr_sub (e
->value
.real
, e
->value
.real
, last1
, GFC_RND_MODE
);
1401 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1403 /* Range_check frees "e" in that case. */
1409 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
,
1412 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1414 mpfr_set (last1
, last2
, GFC_RND_MODE
);
1415 mpfr_set (last2
, e
->value
.real
, GFC_RND_MODE
);
1428 gfc_free_expr (result
);
1429 return &gfc_bad_expr
;
1434 gfc_simplify_bessel_jn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1436 return gfc_simplify_bessel_n2 (order1
, order2
, x
, true);
1441 gfc_simplify_bessel_y0 (gfc_expr
*x
)
1445 if (x
->expr_type
!= EXPR_CONSTANT
)
1448 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1449 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1451 return range_check (result
, "BESSEL_Y0");
1456 gfc_simplify_bessel_y1 (gfc_expr
*x
)
1460 if (x
->expr_type
!= EXPR_CONSTANT
)
1463 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1464 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1466 return range_check (result
, "BESSEL_Y1");
1471 gfc_simplify_bessel_yn (gfc_expr
*order
, gfc_expr
*x
)
1476 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1479 n
= mpz_get_si (order
->value
.integer
);
1480 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1481 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1483 return range_check (result
, "BESSEL_YN");
1488 gfc_simplify_bessel_yn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1490 return gfc_simplify_bessel_n2 (order1
, order2
, x
, false);
1495 gfc_simplify_bit_size (gfc_expr
*e
)
1497 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1498 return gfc_get_int_expr (e
->ts
.kind
, &e
->where
,
1499 gfc_integer_kinds
[i
].bit_size
);
1504 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
1508 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
1511 if (gfc_extract_int (bit
, &b
) || b
< 0)
1512 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
, false);
1514 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
,
1515 mpz_tstbit (e
->value
.integer
, b
));
1520 compare_bitwise (gfc_expr
*i
, gfc_expr
*j
)
1525 gcc_assert (i
->ts
.type
== BT_INTEGER
);
1526 gcc_assert (j
->ts
.type
== BT_INTEGER
);
1528 mpz_init_set (x
, i
->value
.integer
);
1529 k
= gfc_validate_kind (i
->ts
.type
, i
->ts
.kind
, false);
1530 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
1532 mpz_init_set (y
, j
->value
.integer
);
1533 k
= gfc_validate_kind (j
->ts
.type
, j
->ts
.kind
, false);
1534 convert_mpz_to_unsigned (y
, gfc_integer_kinds
[k
].bit_size
);
1536 res
= mpz_cmp (x
, y
);
1544 gfc_simplify_bge (gfc_expr
*i
, gfc_expr
*j
)
1546 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1549 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1550 compare_bitwise (i
, j
) >= 0);
1555 gfc_simplify_bgt (gfc_expr
*i
, gfc_expr
*j
)
1557 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1560 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1561 compare_bitwise (i
, j
) > 0);
1566 gfc_simplify_ble (gfc_expr
*i
, gfc_expr
*j
)
1568 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1571 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1572 compare_bitwise (i
, j
) <= 0);
1577 gfc_simplify_blt (gfc_expr
*i
, gfc_expr
*j
)
1579 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1582 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1583 compare_bitwise (i
, j
) < 0);
1588 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
1590 gfc_expr
*ceil
, *result
;
1593 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
1595 return &gfc_bad_expr
;
1597 if (e
->expr_type
!= EXPR_CONSTANT
)
1600 ceil
= gfc_copy_expr (e
);
1601 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
1603 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
1604 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
, &e
->where
);
1606 gfc_free_expr (ceil
);
1608 return range_check (result
, "CEILING");
1613 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
1615 return simplify_achar_char (e
, k
, "CHAR", false);
1619 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1622 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
1626 if (convert_boz (x
, kind
) == &gfc_bad_expr
)
1627 return &gfc_bad_expr
;
1629 if (convert_boz (y
, kind
) == &gfc_bad_expr
)
1630 return &gfc_bad_expr
;
1632 if (x
->expr_type
!= EXPR_CONSTANT
1633 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1636 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &x
->where
);
1641 mpc_set_z (result
->value
.complex, x
->value
.integer
, GFC_MPC_RND_MODE
);
1645 mpc_set_fr (result
->value
.complex, x
->value
.real
, GFC_RND_MODE
);
1649 mpc_set (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1653 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1657 return range_check (result
, name
);
1662 mpfr_set_z (mpc_imagref (result
->value
.complex),
1663 y
->value
.integer
, GFC_RND_MODE
);
1667 mpfr_set (mpc_imagref (result
->value
.complex),
1668 y
->value
.real
, GFC_RND_MODE
);
1672 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1675 return range_check (result
, name
);
1680 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
1684 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_complex_kind
);
1686 return &gfc_bad_expr
;
1688 return simplify_cmplx ("CMPLX", x
, y
, kind
);
1693 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
1697 if (x
->ts
.type
== BT_INTEGER
&& y
->ts
.type
== BT_INTEGER
)
1698 kind
= gfc_default_complex_kind
;
1699 else if (x
->ts
.type
== BT_REAL
|| y
->ts
.type
== BT_INTEGER
)
1701 else if (x
->ts
.type
== BT_INTEGER
|| y
->ts
.type
== BT_REAL
)
1703 else if (x
->ts
.type
== BT_REAL
&& y
->ts
.type
== BT_REAL
)
1704 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
1708 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
1713 gfc_simplify_conjg (gfc_expr
*e
)
1717 if (e
->expr_type
!= EXPR_CONSTANT
)
1720 result
= gfc_copy_expr (e
);
1721 mpc_conj (result
->value
.complex, result
->value
.complex, GFC_MPC_RND_MODE
);
1723 return range_check (result
, "CONJG");
1726 /* Return the simplification of the constant expression in icall, or NULL
1727 if the expression is not constant. */
1730 simplify_trig_call (gfc_expr
*icall
)
1732 gfc_isym_id func
= icall
->value
.function
.isym
->id
;
1733 gfc_expr
*x
= icall
->value
.function
.actual
->expr
;
1735 /* The actual simplifiers will return NULL for non-constant x. */
1739 return gfc_simplify_acos (x
);
1741 return gfc_simplify_asin (x
);
1743 return gfc_simplify_atan (x
);
1745 return gfc_simplify_cos (x
);
1746 case GFC_ISYM_COTAN
:
1747 return gfc_simplify_cotan (x
);
1749 return gfc_simplify_sin (x
);
1751 return gfc_simplify_tan (x
);
1753 gfc_internal_error ("in simplify_trig_call(): Bad intrinsic");
1757 /* Convert a floating-point number from radians to degrees. */
1760 degrees_f (mpfr_t x
, mp_rnd_t rnd_mode
)
1765 /* Set x = x % 2pi to avoid offsets with large angles. */
1766 mpfr_const_pi (tmp
, rnd_mode
);
1767 mpfr_mul_ui (tmp
, tmp
, 2, rnd_mode
);
1768 mpfr_fmod (tmp
, x
, tmp
, rnd_mode
);
1770 /* Set x = x * 180. */
1771 mpfr_mul_ui (x
, x
, 180, rnd_mode
);
1773 /* Set x = x / pi. */
1774 mpfr_const_pi (tmp
, rnd_mode
);
1775 mpfr_div (x
, x
, tmp
, rnd_mode
);
1780 /* Convert a floating-point number from degrees to radians. */
1783 radians_f (mpfr_t x
, mp_rnd_t rnd_mode
)
1788 /* Set x = x % 360 to avoid offsets with large angles. */
1789 mpfr_set_ui (tmp
, 360, rnd_mode
);
1790 mpfr_fmod (tmp
, x
, tmp
, rnd_mode
);
1792 /* Set x = x * pi. */
1793 mpfr_const_pi (tmp
, rnd_mode
);
1794 mpfr_mul (x
, x
, tmp
, rnd_mode
);
1796 /* Set x = x / 180. */
1797 mpfr_div_ui (x
, x
, 180, rnd_mode
);
1803 /* Convert argument to radians before calling a trig function. */
1806 gfc_simplify_trigd (gfc_expr
*icall
)
1810 arg
= icall
->value
.function
.actual
->expr
;
1812 if (arg
->ts
.type
!= BT_REAL
)
1813 gfc_internal_error ("in gfc_simplify_trigd(): Bad type");
1815 if (arg
->expr_type
== EXPR_CONSTANT
)
1816 /* Convert constant to radians before passing off to simplifier. */
1817 radians_f (arg
->value
.real
, GFC_RND_MODE
);
1819 /* Let the usual simplifier take over - we just simplified the arg. */
1820 return simplify_trig_call (icall
);
1823 /* Convert result of an inverse trig function to degrees. */
1826 gfc_simplify_atrigd (gfc_expr
*icall
)
1830 if (icall
->value
.function
.actual
->expr
->ts
.type
!= BT_REAL
)
1831 gfc_internal_error ("in gfc_simplify_atrigd(): Bad type");
1833 /* See if another simplifier has work to do first. */
1834 result
= simplify_trig_call (icall
);
1836 if (result
&& result
->expr_type
== EXPR_CONSTANT
)
1838 /* Convert constant to degrees after passing off to actual simplifier. */
1839 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1843 /* Let gfc_resolve_atrigd take care of the non-constant case. */
1847 /* Convert the result of atan2 to degrees. */
1850 gfc_simplify_atan2d (gfc_expr
*y
, gfc_expr
*x
)
1854 if (x
->ts
.type
!= BT_REAL
|| y
->ts
.type
!= BT_REAL
)
1855 gfc_internal_error ("in gfc_simplify_atan2d(): Bad type");
1857 if (x
->expr_type
== EXPR_CONSTANT
&& y
->expr_type
== EXPR_CONSTANT
)
1859 result
= gfc_simplify_atan2 (y
, x
);
1862 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1867 /* Let gfc_resolve_atan2d take care of the non-constant case. */
1872 gfc_simplify_cos (gfc_expr
*x
)
1876 if (x
->expr_type
!= EXPR_CONSTANT
)
1879 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1884 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1888 gfc_set_model_kind (x
->ts
.kind
);
1889 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1893 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1896 return range_check (result
, "COS");
1901 gfc_simplify_cosh (gfc_expr
*x
)
1905 if (x
->expr_type
!= EXPR_CONSTANT
)
1908 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1913 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1917 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1924 return range_check (result
, "COSH");
1929 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
1933 if (!is_constant_array_expr (mask
)
1934 || !gfc_is_constant_expr (dim
)
1935 || !gfc_is_constant_expr (kind
))
1938 result
= transformational_result (mask
, dim
,
1940 get_kind (BT_INTEGER
, kind
, "COUNT",
1941 gfc_default_integer_kind
),
1944 init_result_expr (result
, 0, NULL
);
1946 /* Passing MASK twice, once as data array, once as mask.
1947 Whenever gfc_count is called, '1' is added to the result. */
1948 return !dim
|| mask
->rank
== 1 ?
1949 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
1950 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
, NULL
);
1953 /* Simplification routine for cshift. This works by copying the array
1954 expressions into a one-dimensional array, shuffling the values into another
1955 one-dimensional array and creating the new array expression from this. The
1956 shuffling part is basically taken from the library routine. */
1959 gfc_simplify_cshift (gfc_expr
*array
, gfc_expr
*shift
, gfc_expr
*dim
)
1963 gfc_expr
**arrayvec
, **resultvec
;
1964 gfc_expr
**rptr
, **sptr
;
1966 size_t arraysize
, shiftsize
, i
;
1967 gfc_constructor
*array_ctor
, *shift_ctor
;
1968 ssize_t
*shiftvec
, *hptr
;
1969 ssize_t shift_val
, len
;
1970 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
1971 hs_ex
[GFC_MAX_DIMENSIONS
],
1972 hstride
[GFC_MAX_DIMENSIONS
], sstride
[GFC_MAX_DIMENSIONS
],
1973 a_extent
[GFC_MAX_DIMENSIONS
], a_stride
[GFC_MAX_DIMENSIONS
],
1974 h_extent
[GFC_MAX_DIMENSIONS
],
1975 ss_ex
[GFC_MAX_DIMENSIONS
];
1979 gfc_expr
**src
, **dest
;
1981 if (!is_constant_array_expr (array
))
1984 if (shift
->rank
> 0)
1985 gfc_simplify_expr (shift
, 1);
1987 if (!gfc_is_constant_expr (shift
))
1990 /* Make dim zero-based. */
1993 if (!gfc_is_constant_expr (dim
))
1995 which
= mpz_get_si (dim
->value
.integer
) - 1;
2000 gfc_array_size (array
, &size
);
2001 arraysize
= mpz_get_ui (size
);
2004 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
2005 result
->shape
= gfc_copy_shape (array
->shape
, array
->rank
);
2006 result
->rank
= array
->rank
;
2007 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
2012 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2013 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
2014 for (i
= 0; i
< arraysize
; i
++)
2016 arrayvec
[i
] = array_ctor
->expr
;
2017 array_ctor
= gfc_constructor_next (array_ctor
);
2020 resultvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2025 for (d
=0; d
< array
->rank
; d
++)
2027 a_extent
[d
] = mpz_get_si (array
->shape
[d
]);
2028 a_stride
[d
] = d
== 0 ? 1 : a_stride
[d
-1] * a_extent
[d
-1];
2031 if (shift
->rank
> 0)
2033 gfc_array_size (shift
, &size
);
2034 shiftsize
= mpz_get_ui (size
);
2036 shiftvec
= XCNEWVEC (ssize_t
, shiftsize
);
2037 shift_ctor
= gfc_constructor_first (shift
->value
.constructor
);
2038 for (d
= 0; d
< shift
->rank
; d
++)
2040 h_extent
[d
] = mpz_get_si (shift
->shape
[d
]);
2041 hstride
[d
] = d
== 0 ? 1 : hstride
[d
-1] * h_extent
[d
-1];
2047 /* Shut up compiler */
2052 for (d
=0; d
< array
->rank
; d
++)
2056 rsoffset
= a_stride
[d
];
2062 extent
[n
] = a_extent
[d
];
2063 sstride
[n
] = a_stride
[d
];
2064 ss_ex
[n
] = sstride
[n
] * extent
[n
];
2066 hs_ex
[n
] = hstride
[n
] * extent
[n
];
2073 for (i
= 0; i
< shiftsize
; i
++)
2076 val
= mpz_get_si (shift_ctor
->expr
->value
.integer
);
2081 shift_ctor
= gfc_constructor_next (shift_ctor
);
2087 shift_val
= mpz_get_si (shift
->value
.integer
);
2088 shift_val
= shift_val
% len
;
2093 continue_loop
= true;
2099 while (continue_loop
)
2107 src
= &sptr
[sh
* rsoffset
];
2109 for (n
= 0; n
< len
- sh
; n
++)
2116 for ( n
= 0; n
< sh
; n
++)
2128 while (count
[n
] == extent
[n
])
2138 continue_loop
= false;
2152 for (i
= 0; i
< arraysize
; i
++)
2154 gfc_constructor_append_expr (&result
->value
.constructor
,
2155 gfc_copy_expr (resultvec
[i
]),
2163 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
2165 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
2170 gfc_simplify_dble (gfc_expr
*e
)
2172 gfc_expr
*result
= NULL
;
2174 if (e
->expr_type
!= EXPR_CONSTANT
)
2177 if (convert_boz (e
, gfc_default_double_kind
) == &gfc_bad_expr
)
2178 return &gfc_bad_expr
;
2180 result
= gfc_convert_constant (e
, BT_REAL
, gfc_default_double_kind
);
2181 if (result
== &gfc_bad_expr
)
2182 return &gfc_bad_expr
;
2184 return range_check (result
, "DBLE");
2189 gfc_simplify_digits (gfc_expr
*x
)
2193 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2198 digits
= gfc_integer_kinds
[i
].digits
;
2203 digits
= gfc_real_kinds
[i
].digits
;
2210 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, digits
);
2215 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
2220 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2223 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
2224 result
= gfc_get_constant_expr (x
->ts
.type
, kind
, &x
->where
);
2229 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
2230 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2232 mpz_set_ui (result
->value
.integer
, 0);
2237 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
2238 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
2241 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2246 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2249 return range_check (result
, "DIM");
2254 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
2259 if (!is_constant_array_expr (vector_a
)
2260 || !is_constant_array_expr (vector_b
))
2263 gcc_assert (vector_a
->rank
== 1);
2264 gcc_assert (vector_b
->rank
== 1);
2266 temp
.expr_type
= EXPR_OP
;
2267 gfc_clear_ts (&temp
.ts
);
2268 temp
.value
.op
.op
= INTRINSIC_NONE
;
2269 temp
.value
.op
.op1
= vector_a
;
2270 temp
.value
.op
.op2
= vector_b
;
2271 gfc_type_convert_binary (&temp
, 1);
2273 return compute_dot_product (vector_a
, 1, 0, vector_b
, 1, 0, true);
2278 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
2280 gfc_expr
*a1
, *a2
, *result
;
2282 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2285 a1
= gfc_real2real (x
, gfc_default_double_kind
);
2286 a2
= gfc_real2real (y
, gfc_default_double_kind
);
2288 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &x
->where
);
2289 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
2294 return range_check (result
, "DPROD");
2299 simplify_dshift (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
,
2303 int i
, k
, size
, shift
;
2305 if (arg1
->expr_type
!= EXPR_CONSTANT
|| arg2
->expr_type
!= EXPR_CONSTANT
2306 || shiftarg
->expr_type
!= EXPR_CONSTANT
)
2309 k
= gfc_validate_kind (BT_INTEGER
, arg1
->ts
.kind
, false);
2310 size
= gfc_integer_kinds
[k
].bit_size
;
2312 gfc_extract_int (shiftarg
, &shift
);
2314 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2316 shift
= size
- shift
;
2318 result
= gfc_get_constant_expr (BT_INTEGER
, arg1
->ts
.kind
, &arg1
->where
);
2319 mpz_set_ui (result
->value
.integer
, 0);
2321 for (i
= 0; i
< shift
; i
++)
2322 if (mpz_tstbit (arg2
->value
.integer
, size
- shift
+ i
))
2323 mpz_setbit (result
->value
.integer
, i
);
2325 for (i
= 0; i
< size
- shift
; i
++)
2326 if (mpz_tstbit (arg1
->value
.integer
, i
))
2327 mpz_setbit (result
->value
.integer
, shift
+ i
);
2329 /* Convert to a signed value. */
2330 gfc_convert_mpz_to_signed (result
->value
.integer
, size
);
2337 gfc_simplify_dshiftr (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2339 return simplify_dshift (arg1
, arg2
, shiftarg
, true);
2344 gfc_simplify_dshiftl (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2346 return simplify_dshift (arg1
, arg2
, shiftarg
, false);
2351 gfc_simplify_eoshift (gfc_expr
*array
, gfc_expr
*shift
, gfc_expr
*boundary
,
2358 gfc_expr
**arrayvec
, **resultvec
;
2359 gfc_expr
**rptr
, **sptr
;
2361 size_t arraysize
, i
;
2362 gfc_constructor
*array_ctor
, *shift_ctor
, *bnd_ctor
;
2363 ssize_t shift_val
, len
;
2364 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
2365 sstride
[GFC_MAX_DIMENSIONS
], a_extent
[GFC_MAX_DIMENSIONS
],
2366 a_stride
[GFC_MAX_DIMENSIONS
], ss_ex
[GFC_MAX_DIMENSIONS
];
2370 gfc_expr
**src
, **dest
;
2373 if (!is_constant_array_expr (array
))
2376 if (shift
->rank
> 0)
2377 gfc_simplify_expr (shift
, 1);
2379 if (!gfc_is_constant_expr (shift
))
2384 if (boundary
->rank
> 0)
2385 gfc_simplify_expr (boundary
, 1);
2387 if (!gfc_is_constant_expr (boundary
))
2393 if (!gfc_is_constant_expr (dim
))
2395 which
= mpz_get_si (dim
->value
.integer
) - 1;
2401 if (boundary
== NULL
)
2403 temp_boundary
= true;
2404 switch (array
->ts
.type
)
2408 bnd
= gfc_get_int_expr (array
->ts
.kind
, NULL
, 0);
2412 bnd
= gfc_get_logical_expr (array
->ts
.kind
, NULL
, 0);
2416 bnd
= gfc_get_constant_expr (array
->ts
.type
, array
->ts
.kind
, &gfc_current_locus
);
2417 mpfr_set_ui (bnd
->value
.real
, 0, GFC_RND_MODE
);
2421 bnd
= gfc_get_constant_expr (array
->ts
.type
, array
->ts
.kind
, &gfc_current_locus
);
2422 mpc_set_ui (bnd
->value
.complex, 0, GFC_RND_MODE
);
2426 s_len
= mpz_get_ui (array
->ts
.u
.cl
->length
->value
.integer
);
2427 bnd
= gfc_get_character_expr (array
->ts
.kind
, &gfc_current_locus
, NULL
, s_len
);
2437 temp_boundary
= false;
2441 gfc_array_size (array
, &size
);
2442 arraysize
= mpz_get_ui (size
);
2445 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
2446 result
->shape
= gfc_copy_shape (array
->shape
, array
->rank
);
2447 result
->rank
= array
->rank
;
2448 result
->ts
= array
->ts
;
2453 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2454 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
2455 for (i
= 0; i
< arraysize
; i
++)
2457 arrayvec
[i
] = array_ctor
->expr
;
2458 array_ctor
= gfc_constructor_next (array_ctor
);
2461 resultvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2466 for (d
=0; d
< array
->rank
; d
++)
2468 a_extent
[d
] = mpz_get_si (array
->shape
[d
]);
2469 a_stride
[d
] = d
== 0 ? 1 : a_stride
[d
-1] * a_extent
[d
-1];
2472 if (shift
->rank
> 0)
2474 shift_ctor
= gfc_constructor_first (shift
->value
.constructor
);
2480 shift_val
= mpz_get_si (shift
->value
.integer
);
2484 bnd_ctor
= gfc_constructor_first (bnd
->value
.constructor
);
2488 /* Shut up compiler */
2493 for (d
=0; d
< array
->rank
; d
++)
2497 rsoffset
= a_stride
[d
];
2503 extent
[n
] = a_extent
[d
];
2504 sstride
[n
] = a_stride
[d
];
2505 ss_ex
[n
] = sstride
[n
] * extent
[n
];
2510 continue_loop
= true;
2515 while (continue_loop
)
2520 sh
= mpz_get_si (shift_ctor
->expr
->value
.integer
);
2524 if (( sh
>= 0 ? sh
: -sh
) > len
)
2530 delta
= (sh
>= 0) ? sh
: -sh
;
2534 src
= &sptr
[delta
* rsoffset
];
2540 dest
= &rptr
[delta
* rsoffset
];
2543 for (n
= 0; n
< len
- delta
; n
++)
2559 *dest
= gfc_copy_expr (bnd_ctor
->expr
);
2567 *dest
= gfc_copy_expr (bnd
);
2574 shift_ctor
= gfc_constructor_next (shift_ctor
);
2577 bnd_ctor
= gfc_constructor_next (bnd_ctor
);
2581 while (count
[n
] == extent
[n
])
2589 continue_loop
= false;
2601 for (i
= 0; i
< arraysize
; i
++)
2603 gfc_constructor_append_expr (&result
->value
.constructor
,
2604 gfc_copy_expr (resultvec
[i
]),
2610 gfc_free_expr (bnd
);
2616 gfc_simplify_erf (gfc_expr
*x
)
2620 if (x
->expr_type
!= EXPR_CONSTANT
)
2623 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2624 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2626 return range_check (result
, "ERF");
2631 gfc_simplify_erfc (gfc_expr
*x
)
2635 if (x
->expr_type
!= EXPR_CONSTANT
)
2638 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2639 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2641 return range_check (result
, "ERFC");
2645 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2647 #define MAX_ITER 200
2648 #define ARG_LIMIT 12
2650 /* Calculate ERFC_SCALED directly by its definition:
2652 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2654 using a large precision for intermediate results. This is used for all
2655 but large values of the argument. */
2657 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2662 prec
= mpfr_get_default_prec ();
2663 mpfr_set_default_prec (10 * prec
);
2668 mpfr_set (a
, arg
, GFC_RND_MODE
);
2669 mpfr_sqr (b
, a
, GFC_RND_MODE
);
2670 mpfr_exp (b
, b
, GFC_RND_MODE
);
2671 mpfr_erfc (a
, a
, GFC_RND_MODE
);
2672 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
2674 mpfr_set (res
, a
, GFC_RND_MODE
);
2675 mpfr_set_default_prec (prec
);
2681 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2683 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2684 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2687 This is used for large values of the argument. Intermediate calculations
2688 are performed with twice the precision. We don't do a fixed number of
2689 iterations of the sum, but stop when it has converged to the required
2692 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2694 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
2699 prec
= mpfr_get_default_prec ();
2700 mpfr_set_default_prec (2 * prec
);
2710 mpfr_init (sumtrunc
);
2711 mpfr_set_prec (oldsum
, prec
);
2712 mpfr_set_prec (sumtrunc
, prec
);
2714 mpfr_set (x
, arg
, GFC_RND_MODE
);
2715 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
2716 mpz_set_ui (num
, 1);
2718 mpfr_set (u
, x
, GFC_RND_MODE
);
2719 mpfr_sqr (u
, u
, GFC_RND_MODE
);
2720 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
2721 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
2723 for (i
= 1; i
< MAX_ITER
; i
++)
2725 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
2727 mpz_mul_ui (num
, num
, 2 * i
- 1);
2730 mpfr_set (w
, u
, GFC_RND_MODE
);
2731 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
2733 mpfr_set_z (v
, num
, GFC_RND_MODE
);
2734 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
2736 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
2738 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
2739 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
2743 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2745 gcc_assert (i
< MAX_ITER
);
2747 /* Divide by x * sqrt(Pi). */
2748 mpfr_const_pi (u
, GFC_RND_MODE
);
2749 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
2750 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
2751 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
2753 mpfr_set (res
, sum
, GFC_RND_MODE
);
2754 mpfr_set_default_prec (prec
);
2756 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
2762 gfc_simplify_erfc_scaled (gfc_expr
*x
)
2766 if (x
->expr_type
!= EXPR_CONSTANT
)
2769 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2770 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
2771 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
2773 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
2775 return range_check (result
, "ERFC_SCALED");
2783 gfc_simplify_epsilon (gfc_expr
*e
)
2788 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2790 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
2791 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
2793 return range_check (result
, "EPSILON");
2798 gfc_simplify_exp (gfc_expr
*x
)
2802 if (x
->expr_type
!= EXPR_CONSTANT
)
2805 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2810 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2814 gfc_set_model_kind (x
->ts
.kind
);
2815 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
2819 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2822 return range_check (result
, "EXP");
2827 gfc_simplify_exponent (gfc_expr
*x
)
2832 if (x
->expr_type
!= EXPR_CONSTANT
)
2835 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2838 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2839 if (mpfr_inf_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
2841 int i
= gfc_validate_kind (BT_INTEGER
, gfc_default_integer_kind
, false);
2842 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2846 /* EXPONENT(+/- 0.0) = 0 */
2847 if (mpfr_zero_p (x
->value
.real
))
2849 mpz_set_ui (result
->value
.integer
, 0);
2853 gfc_set_model (x
->value
.real
);
2855 val
= (long int) mpfr_get_exp (x
->value
.real
);
2856 mpz_set_si (result
->value
.integer
, val
);
2858 return range_check (result
, "EXPONENT");
2863 gfc_simplify_failed_or_stopped_images (gfc_expr
*team ATTRIBUTE_UNUSED
,
2866 if (flag_coarray
== GFC_FCOARRAY_NONE
)
2868 gfc_current_locus
= *gfc_current_intrinsic_where
;
2869 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
2870 return &gfc_bad_expr
;
2873 if (flag_coarray
== GFC_FCOARRAY_SINGLE
)
2878 gfc_extract_int (kind
, &actual_kind
);
2880 actual_kind
= gfc_default_integer_kind
;
2882 result
= gfc_get_array_expr (BT_INTEGER
, actual_kind
, &gfc_current_locus
);
2887 /* For fcoarray = lib no simplification is possible, because it is not known
2888 what images failed or are stopped at compile time. */
2894 gfc_simplify_float (gfc_expr
*a
)
2898 if (a
->expr_type
!= EXPR_CONSTANT
)
2903 if (convert_boz (a
, gfc_default_real_kind
) == &gfc_bad_expr
)
2904 return &gfc_bad_expr
;
2906 result
= gfc_copy_expr (a
);
2909 result
= gfc_int2real (a
, gfc_default_real_kind
);
2911 return range_check (result
, "FLOAT");
2916 is_last_ref_vtab (gfc_expr
*e
)
2919 gfc_component
*comp
= NULL
;
2921 if (e
->expr_type
!= EXPR_VARIABLE
)
2924 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
2925 if (ref
->type
== REF_COMPONENT
)
2926 comp
= ref
->u
.c
.component
;
2928 if (!e
->ref
|| !comp
)
2929 return e
->symtree
->n
.sym
->attr
.vtab
;
2931 if (comp
->name
[0] == '_' && strcmp (comp
->name
, "_vptr") == 0)
2939 gfc_simplify_extends_type_of (gfc_expr
*a
, gfc_expr
*mold
)
2941 /* Avoid simplification of resolved symbols. */
2942 if (is_last_ref_vtab (a
) || is_last_ref_vtab (mold
))
2945 if (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_DERIVED
)
2946 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2947 gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2950 if (UNLIMITED_POLY (a
) || UNLIMITED_POLY (mold
))
2953 /* Return .false. if the dynamic type can never be an extension. */
2954 if ((a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_CLASS
2955 && !gfc_type_is_extension_of
2956 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2957 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2958 && !gfc_type_is_extension_of
2959 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2960 mold
->ts
.u
.derived
->components
->ts
.u
.derived
))
2961 || (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_CLASS
2962 && !gfc_type_is_extension_of
2963 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2965 || (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2966 && !gfc_type_is_extension_of
2967 (mold
->ts
.u
.derived
,
2968 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2969 && !gfc_type_is_extension_of
2970 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2971 mold
->ts
.u
.derived
)))
2972 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2974 /* Return .true. if the dynamic type is guaranteed to be an extension. */
2975 if (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2976 && gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2977 a
->ts
.u
.derived
->components
->ts
.u
.derived
))
2978 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, true);
2985 gfc_simplify_same_type_as (gfc_expr
*a
, gfc_expr
*b
)
2987 /* Avoid simplification of resolved symbols. */
2988 if (is_last_ref_vtab (a
) || is_last_ref_vtab (b
))
2991 /* Return .false. if the dynamic type can never be the
2993 if (((a
->ts
.type
== BT_CLASS
&& gfc_expr_attr (a
).class_ok
)
2994 || (b
->ts
.type
== BT_CLASS
&& gfc_expr_attr (b
).class_ok
))
2995 && !gfc_type_compatible (&a
->ts
, &b
->ts
)
2996 && !gfc_type_compatible (&b
->ts
, &a
->ts
))
2997 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2999 if (a
->ts
.type
!= BT_DERIVED
|| b
->ts
.type
!= BT_DERIVED
)
3002 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3003 gfc_compare_derived_types (a
->ts
.u
.derived
,
3009 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
3015 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
3017 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
3019 if (e
->expr_type
!= EXPR_CONSTANT
)
3022 mpfr_init2 (floor
, mpfr_get_prec (e
->value
.real
));
3023 mpfr_floor (floor
, e
->value
.real
);
3025 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
3026 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
3030 return range_check (result
, "FLOOR");
3035 gfc_simplify_fraction (gfc_expr
*x
)
3039 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
3040 mpfr_t absv
, exp
, pow2
;
3045 if (x
->expr_type
!= EXPR_CONSTANT
)
3048 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
3050 /* FRACTION(inf) = NaN. */
3051 if (mpfr_inf_p (x
->value
.real
))
3053 mpfr_set_nan (result
->value
.real
);
3057 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
3059 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
3060 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
3062 if (mpfr_sgn (x
->value
.real
) == 0)
3064 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3068 gfc_set_model_kind (x
->ts
.kind
);
3073 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
3074 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
3076 mpfr_trunc (exp
, exp
);
3077 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
3079 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
3081 mpfr_div (result
->value
.real
, x
->value
.real
, pow2
, GFC_RND_MODE
);
3083 mpfr_clears (exp
, absv
, pow2
, NULL
);
3087 /* mpfr_frexp() correctly handles zeros and NaNs. */
3088 mpfr_frexp (&e
, result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3092 return range_check (result
, "FRACTION");
3097 gfc_simplify_gamma (gfc_expr
*x
)
3101 if (x
->expr_type
!= EXPR_CONSTANT
)
3104 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3105 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3107 return range_check (result
, "GAMMA");
3112 gfc_simplify_huge (gfc_expr
*e
)
3117 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3118 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3123 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
3127 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
3139 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
3143 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3146 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3147 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
3148 return range_check (result
, "HYPOT");
3152 /* We use the processor's collating sequence, because all
3153 systems that gfortran currently works on are ASCII. */
3156 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
3162 if (e
->expr_type
!= EXPR_CONSTANT
)
3165 if (e
->value
.character
.length
!= 1)
3167 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
3168 return &gfc_bad_expr
;
3171 index
= e
->value
.character
.string
[0];
3173 if (warn_surprising
&& index
> 127)
3174 gfc_warning (OPT_Wsurprising
,
3175 "Argument of IACHAR function at %L outside of range 0..127",
3178 k
= get_kind (BT_INTEGER
, kind
, "IACHAR", gfc_default_integer_kind
);
3180 return &gfc_bad_expr
;
3182 result
= gfc_get_int_expr (k
, &e
->where
, index
);
3184 return range_check (result
, "IACHAR");
3189 do_bit_and (gfc_expr
*result
, gfc_expr
*e
)
3191 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3192 gcc_assert (result
->ts
.type
== BT_INTEGER
3193 && result
->expr_type
== EXPR_CONSTANT
);
3195 mpz_and (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3201 gfc_simplify_iall (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3203 return simplify_transformation (array
, dim
, mask
, -1, do_bit_and
);
3208 do_bit_ior (gfc_expr
*result
, gfc_expr
*e
)
3210 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3211 gcc_assert (result
->ts
.type
== BT_INTEGER
3212 && result
->expr_type
== EXPR_CONSTANT
);
3214 mpz_ior (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3220 gfc_simplify_iany (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3222 return simplify_transformation (array
, dim
, mask
, 0, do_bit_ior
);
3227 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
3231 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3234 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3235 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3237 return range_check (result
, "IAND");
3242 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
3247 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3250 gfc_extract_int (y
, &pos
);
3252 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
3254 result
= gfc_copy_expr (x
);
3256 convert_mpz_to_unsigned (result
->value
.integer
,
3257 gfc_integer_kinds
[k
].bit_size
);
3259 mpz_clrbit (result
->value
.integer
, pos
);
3261 gfc_convert_mpz_to_signed (result
->value
.integer
,
3262 gfc_integer_kinds
[k
].bit_size
);
3269 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
3276 if (x
->expr_type
!= EXPR_CONSTANT
3277 || y
->expr_type
!= EXPR_CONSTANT
3278 || z
->expr_type
!= EXPR_CONSTANT
)
3281 gfc_extract_int (y
, &pos
);
3282 gfc_extract_int (z
, &len
);
3284 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
3286 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3288 if (pos
+ len
> bitsize
)
3290 gfc_error ("Sum of second and third arguments of IBITS exceeds "
3291 "bit size at %L", &y
->where
);
3292 return &gfc_bad_expr
;
3295 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3296 convert_mpz_to_unsigned (result
->value
.integer
,
3297 gfc_integer_kinds
[k
].bit_size
);
3299 bits
= XCNEWVEC (int, bitsize
);
3301 for (i
= 0; i
< bitsize
; i
++)
3304 for (i
= 0; i
< len
; i
++)
3305 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
3307 for (i
= 0; i
< bitsize
; i
++)
3310 mpz_clrbit (result
->value
.integer
, i
);
3311 else if (bits
[i
] == 1)
3312 mpz_setbit (result
->value
.integer
, i
);
3314 gfc_internal_error ("IBITS: Bad bit");
3319 gfc_convert_mpz_to_signed (result
->value
.integer
,
3320 gfc_integer_kinds
[k
].bit_size
);
3327 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
3332 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3335 gfc_extract_int (y
, &pos
);
3337 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
3339 result
= gfc_copy_expr (x
);
3341 convert_mpz_to_unsigned (result
->value
.integer
,
3342 gfc_integer_kinds
[k
].bit_size
);
3344 mpz_setbit (result
->value
.integer
, pos
);
3346 gfc_convert_mpz_to_signed (result
->value
.integer
,
3347 gfc_integer_kinds
[k
].bit_size
);
3354 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
3360 if (e
->expr_type
!= EXPR_CONSTANT
)
3363 if (e
->value
.character
.length
!= 1)
3365 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
3366 return &gfc_bad_expr
;
3369 index
= e
->value
.character
.string
[0];
3371 k
= get_kind (BT_INTEGER
, kind
, "ICHAR", gfc_default_integer_kind
);
3373 return &gfc_bad_expr
;
3375 result
= gfc_get_int_expr (k
, &e
->where
, index
);
3377 return range_check (result
, "ICHAR");
3382 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
3386 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3389 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3390 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3392 return range_check (result
, "IEOR");
3397 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
3400 int back
, len
, lensub
;
3401 int i
, j
, k
, count
, index
= 0, start
;
3403 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
3404 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
3407 if (b
!= NULL
&& b
->value
.logical
!= 0)
3412 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
3414 return &gfc_bad_expr
;
3416 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
3418 len
= x
->value
.character
.length
;
3419 lensub
= y
->value
.character
.length
;
3423 mpz_set_si (result
->value
.integer
, 0);
3431 mpz_set_si (result
->value
.integer
, 1);
3434 else if (lensub
== 1)
3436 for (i
= 0; i
< len
; i
++)
3438 for (j
= 0; j
< lensub
; j
++)
3440 if (y
->value
.character
.string
[j
]
3441 == x
->value
.character
.string
[i
])
3451 for (i
= 0; i
< len
; i
++)
3453 for (j
= 0; j
< lensub
; j
++)
3455 if (y
->value
.character
.string
[j
]
3456 == x
->value
.character
.string
[i
])
3461 for (k
= 0; k
< lensub
; k
++)
3463 if (y
->value
.character
.string
[k
]
3464 == x
->value
.character
.string
[k
+ start
])
3468 if (count
== lensub
)
3483 mpz_set_si (result
->value
.integer
, len
+ 1);
3486 else if (lensub
== 1)
3488 for (i
= 0; i
< len
; i
++)
3490 for (j
= 0; j
< lensub
; j
++)
3492 if (y
->value
.character
.string
[j
]
3493 == x
->value
.character
.string
[len
- i
])
3495 index
= len
- i
+ 1;
3503 for (i
= 0; i
< len
; i
++)
3505 for (j
= 0; j
< lensub
; j
++)
3507 if (y
->value
.character
.string
[j
]
3508 == x
->value
.character
.string
[len
- i
])
3511 if (start
<= len
- lensub
)
3514 for (k
= 0; k
< lensub
; k
++)
3515 if (y
->value
.character
.string
[k
]
3516 == x
->value
.character
.string
[k
+ start
])
3519 if (count
== lensub
)
3536 mpz_set_si (result
->value
.integer
, index
);
3537 return range_check (result
, "INDEX");
3542 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
3544 gfc_expr
*result
= NULL
;
3546 if (e
->expr_type
!= EXPR_CONSTANT
)
3549 result
= gfc_convert_constant (e
, BT_INTEGER
, kind
);
3550 if (result
== &gfc_bad_expr
)
3551 return &gfc_bad_expr
;
3553 return range_check (result
, name
);
3558 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
3562 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
3564 return &gfc_bad_expr
;
3566 return simplify_intconv (e
, kind
, "INT");
3570 gfc_simplify_int2 (gfc_expr
*e
)
3572 return simplify_intconv (e
, 2, "INT2");
3577 gfc_simplify_int8 (gfc_expr
*e
)
3579 return simplify_intconv (e
, 8, "INT8");
3584 gfc_simplify_long (gfc_expr
*e
)
3586 return simplify_intconv (e
, 4, "LONG");
3591 gfc_simplify_ifix (gfc_expr
*e
)
3593 gfc_expr
*rtrunc
, *result
;
3595 if (e
->expr_type
!= EXPR_CONSTANT
)
3598 rtrunc
= gfc_copy_expr (e
);
3599 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3601 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3603 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3605 gfc_free_expr (rtrunc
);
3607 return range_check (result
, "IFIX");
3612 gfc_simplify_idint (gfc_expr
*e
)
3614 gfc_expr
*rtrunc
, *result
;
3616 if (e
->expr_type
!= EXPR_CONSTANT
)
3619 rtrunc
= gfc_copy_expr (e
);
3620 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3622 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3624 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3626 gfc_free_expr (rtrunc
);
3628 return range_check (result
, "IDINT");
3633 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
3637 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3640 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3641 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3643 return range_check (result
, "IOR");
3648 do_bit_xor (gfc_expr
*result
, gfc_expr
*e
)
3650 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3651 gcc_assert (result
->ts
.type
== BT_INTEGER
3652 && result
->expr_type
== EXPR_CONSTANT
);
3654 mpz_xor (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3660 gfc_simplify_iparity (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3662 return simplify_transformation (array
, dim
, mask
, 0, do_bit_xor
);
3667 gfc_simplify_is_iostat_end (gfc_expr
*x
)
3669 if (x
->expr_type
!= EXPR_CONSTANT
)
3672 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3673 mpz_cmp_si (x
->value
.integer
,
3674 LIBERROR_END
) == 0);
3679 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
3681 if (x
->expr_type
!= EXPR_CONSTANT
)
3684 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3685 mpz_cmp_si (x
->value
.integer
,
3686 LIBERROR_EOR
) == 0);
3691 gfc_simplify_isnan (gfc_expr
*x
)
3693 if (x
->expr_type
!= EXPR_CONSTANT
)
3696 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3697 mpfr_nan_p (x
->value
.real
));
3701 /* Performs a shift on its first argument. Depending on the last
3702 argument, the shift can be arithmetic, i.e. with filling from the
3703 left like in the SHIFTA intrinsic. */
3705 simplify_shift (gfc_expr
*e
, gfc_expr
*s
, const char *name
,
3706 bool arithmetic
, int direction
)
3709 int ashift
, *bits
, i
, k
, bitsize
, shift
;
3711 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3714 gfc_extract_int (s
, &shift
);
3716 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
3717 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3719 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3723 mpz_set (result
->value
.integer
, e
->value
.integer
);
3727 if (direction
> 0 && shift
< 0)
3729 /* Left shift, as in SHIFTL. */
3730 gfc_error ("Second argument of %s is negative at %L", name
, &e
->where
);
3731 return &gfc_bad_expr
;
3733 else if (direction
< 0)
3735 /* Right shift, as in SHIFTR or SHIFTA. */
3738 gfc_error ("Second argument of %s is negative at %L",
3740 return &gfc_bad_expr
;
3746 ashift
= (shift
>= 0 ? shift
: -shift
);
3748 if (ashift
> bitsize
)
3750 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3751 "at %L", name
, &e
->where
);
3752 return &gfc_bad_expr
;
3755 bits
= XCNEWVEC (int, bitsize
);
3757 for (i
= 0; i
< bitsize
; i
++)
3758 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3763 for (i
= 0; i
< shift
; i
++)
3764 mpz_clrbit (result
->value
.integer
, i
);
3766 for (i
= 0; i
< bitsize
- shift
; i
++)
3769 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3771 mpz_setbit (result
->value
.integer
, i
+ shift
);
3777 if (arithmetic
&& bits
[bitsize
- 1])
3778 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3779 mpz_setbit (result
->value
.integer
, i
);
3781 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3782 mpz_clrbit (result
->value
.integer
, i
);
3784 for (i
= bitsize
- 1; i
>= ashift
; i
--)
3787 mpz_clrbit (result
->value
.integer
, i
- ashift
);
3789 mpz_setbit (result
->value
.integer
, i
- ashift
);
3793 gfc_convert_mpz_to_signed (result
->value
.integer
, bitsize
);
3801 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
3803 return simplify_shift (e
, s
, "ISHFT", false, 0);
3808 gfc_simplify_lshift (gfc_expr
*e
, gfc_expr
*s
)
3810 return simplify_shift (e
, s
, "LSHIFT", false, 1);
3815 gfc_simplify_rshift (gfc_expr
*e
, gfc_expr
*s
)
3817 return simplify_shift (e
, s
, "RSHIFT", true, -1);
3822 gfc_simplify_shifta (gfc_expr
*e
, gfc_expr
*s
)
3824 return simplify_shift (e
, s
, "SHIFTA", true, -1);
3829 gfc_simplify_shiftl (gfc_expr
*e
, gfc_expr
*s
)
3831 return simplify_shift (e
, s
, "SHIFTL", false, 1);
3836 gfc_simplify_shiftr (gfc_expr
*e
, gfc_expr
*s
)
3838 return simplify_shift (e
, s
, "SHIFTR", false, -1);
3843 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
3846 int shift
, ashift
, isize
, ssize
, delta
, k
;
3849 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3852 gfc_extract_int (s
, &shift
);
3854 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3855 isize
= gfc_integer_kinds
[k
].bit_size
;
3859 if (sz
->expr_type
!= EXPR_CONSTANT
)
3862 gfc_extract_int (sz
, &ssize
);
3875 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3876 "BIT_SIZE of first argument at %C");
3878 gfc_error ("Absolute value of SHIFT shall be less than or equal "
3880 return &gfc_bad_expr
;
3883 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3885 mpz_set (result
->value
.integer
, e
->value
.integer
);
3890 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
3892 bits
= XCNEWVEC (int, ssize
);
3894 for (i
= 0; i
< ssize
; i
++)
3895 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3897 delta
= ssize
- ashift
;
3901 for (i
= 0; i
< delta
; i
++)
3904 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3906 mpz_setbit (result
->value
.integer
, i
+ shift
);
3909 for (i
= delta
; i
< ssize
; i
++)
3912 mpz_clrbit (result
->value
.integer
, i
- delta
);
3914 mpz_setbit (result
->value
.integer
, i
- delta
);
3919 for (i
= 0; i
< ashift
; i
++)
3922 mpz_clrbit (result
->value
.integer
, i
+ delta
);
3924 mpz_setbit (result
->value
.integer
, i
+ delta
);
3927 for (i
= ashift
; i
< ssize
; i
++)
3930 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3932 mpz_setbit (result
->value
.integer
, i
+ shift
);
3936 gfc_convert_mpz_to_signed (result
->value
.integer
, isize
);
3944 gfc_simplify_kind (gfc_expr
*e
)
3946 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, e
->ts
.kind
);
3951 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
3952 gfc_array_spec
*as
, gfc_ref
*ref
, bool coarray
)
3954 gfc_expr
*l
, *u
, *result
;
3957 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3958 gfc_default_integer_kind
);
3960 return &gfc_bad_expr
;
3962 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3964 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3965 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3966 if (!coarray
&& array
->expr_type
!= EXPR_VARIABLE
)
3970 gfc_expr
* dim
= result
;
3971 mpz_set_si (dim
->value
.integer
, d
);
3973 result
= simplify_size (array
, dim
, k
);
3974 gfc_free_expr (dim
);
3979 mpz_set_si (result
->value
.integer
, 1);
3984 /* Otherwise, we have a variable expression. */
3985 gcc_assert (array
->expr_type
== EXPR_VARIABLE
);
3988 if (!gfc_resolve_array_spec (as
, 0))
3991 /* The last dimension of an assumed-size array is special. */
3992 if ((!coarray
&& d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
3993 || (coarray
&& d
== as
->rank
+ as
->corank
3994 && (!upper
|| flag_coarray
== GFC_FCOARRAY_SINGLE
)))
3996 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
3998 gfc_free_expr (result
);
3999 return gfc_copy_expr (as
->lower
[d
-1]);
4005 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
4007 /* Then, we need to know the extent of the given dimension. */
4008 if (coarray
|| (ref
->u
.ar
.type
== AR_FULL
&& !ref
->next
))
4010 gfc_expr
*declared_bound
;
4012 bool constant_lbound
, constant_ubound
;
4017 gcc_assert (l
!= NULL
);
4019 constant_lbound
= l
->expr_type
== EXPR_CONSTANT
;
4020 constant_ubound
= u
&& u
->expr_type
== EXPR_CONSTANT
;
4022 empty_bound
= upper
? 0 : 1;
4023 declared_bound
= upper
? u
: l
;
4025 if ((!upper
&& !constant_lbound
)
4026 || (upper
&& !constant_ubound
))
4031 /* For {L,U}BOUND, the value depends on whether the array
4032 is empty. We can nevertheless simplify if the declared bound
4033 has the same value as that of an empty array, in which case
4034 the result isn't dependent on the array emptyness. */
4035 if (mpz_cmp_si (declared_bound
->value
.integer
, empty_bound
) == 0)
4036 mpz_set_si (result
->value
.integer
, empty_bound
);
4037 else if (!constant_lbound
|| !constant_ubound
)
4038 /* Array emptyness can't be determined, we can't simplify. */
4040 else if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
4041 mpz_set_si (result
->value
.integer
, empty_bound
);
4043 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
4046 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
4052 if (!gfc_ref_dimen_size (&ref
->u
.ar
, d
- 1, &result
->value
.integer
, NULL
))
4056 mpz_set_si (result
->value
.integer
, (long int) 1);
4060 return range_check (result
, upper
? "UBOUND" : "LBOUND");
4063 gfc_free_expr (result
);
4069 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
4075 if (array
->ts
.type
== BT_CLASS
)
4078 if (array
->expr_type
!= EXPR_VARIABLE
)
4085 /* Follow any component references. */
4086 as
= array
->symtree
->n
.sym
->as
;
4087 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
4092 switch (ref
->u
.ar
.type
)
4099 /* We're done because 'as' has already been set in the
4100 previous iteration. */
4114 as
= ref
->u
.c
.component
->as
;
4126 if (as
&& (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_RANK
4127 || (as
->type
== AS_ASSUMED_SHAPE
&& upper
)))
4131 || (as
->type
!= AS_DEFERRED
4132 && array
->expr_type
== EXPR_VARIABLE
4133 && !gfc_expr_attr (array
).allocatable
4134 && !gfc_expr_attr (array
).pointer
));
4138 /* Multi-dimensional bounds. */
4139 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
4143 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
4144 if (upper
&& as
&& as
->type
== AS_ASSUMED_SIZE
)
4146 /* An error message will be emitted in
4147 check_assumed_size_reference (resolve.c). */
4148 return &gfc_bad_expr
;
4151 /* Simplify the bounds for each dimension. */
4152 for (d
= 0; d
< array
->rank
; d
++)
4154 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
, ref
,
4156 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
4160 for (j
= 0; j
< d
; j
++)
4161 gfc_free_expr (bounds
[j
]);
4166 /* Allocate the result expression. */
4167 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
4168 gfc_default_integer_kind
);
4170 return &gfc_bad_expr
;
4172 e
= gfc_get_array_expr (BT_INTEGER
, k
, &array
->where
);
4174 /* The result is a rank 1 array; its size is the rank of the first
4175 argument to {L,U}BOUND. */
4177 e
->shape
= gfc_get_shape (1);
4178 mpz_init_set_ui (e
->shape
[0], array
->rank
);
4180 /* Create the constructor for this array. */
4181 for (d
= 0; d
< array
->rank
; d
++)
4182 gfc_constructor_append_expr (&e
->value
.constructor
,
4183 bounds
[d
], &e
->where
);
4189 /* A DIM argument is specified. */
4190 if (dim
->expr_type
!= EXPR_CONSTANT
)
4193 d
= mpz_get_si (dim
->value
.integer
);
4195 if ((d
< 1 || d
> array
->rank
)
4196 || (d
== array
->rank
&& as
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
4198 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
4199 return &gfc_bad_expr
;
4202 if (as
&& as
->type
== AS_ASSUMED_RANK
)
4205 return simplify_bound_dim (array
, kind
, d
, upper
, as
, ref
, false);
4211 simplify_cobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
4217 if (array
->expr_type
!= EXPR_VARIABLE
)
4220 /* Follow any component references. */
4221 as
= (array
->ts
.type
== BT_CLASS
&& array
->ts
.u
.derived
->components
)
4222 ? array
->ts
.u
.derived
->components
->as
4223 : array
->symtree
->n
.sym
->as
;
4224 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
4229 switch (ref
->u
.ar
.type
)
4232 if (ref
->u
.ar
.as
->corank
> 0)
4234 gcc_assert (as
== ref
->u
.ar
.as
);
4241 /* We're done because 'as' has already been set in the
4242 previous iteration. */
4256 as
= ref
->u
.c
.component
->as
;
4269 if (as
->cotype
== AS_DEFERRED
|| as
->cotype
== AS_ASSUMED_SHAPE
)
4274 /* Multi-dimensional cobounds. */
4275 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
4279 /* Simplify the cobounds for each dimension. */
4280 for (d
= 0; d
< as
->corank
; d
++)
4282 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1 + as
->rank
,
4283 upper
, as
, ref
, true);
4284 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
4288 for (j
= 0; j
< d
; j
++)
4289 gfc_free_expr (bounds
[j
]);
4294 /* Allocate the result expression. */
4295 e
= gfc_get_expr ();
4296 e
->where
= array
->where
;
4297 e
->expr_type
= EXPR_ARRAY
;
4298 e
->ts
.type
= BT_INTEGER
;
4299 k
= get_kind (BT_INTEGER
, kind
, upper
? "UCOBOUND" : "LCOBOUND",
4300 gfc_default_integer_kind
);
4304 return &gfc_bad_expr
;
4308 /* The result is a rank 1 array; its size is the rank of the first
4309 argument to {L,U}COBOUND. */
4311 e
->shape
= gfc_get_shape (1);
4312 mpz_init_set_ui (e
->shape
[0], as
->corank
);
4314 /* Create the constructor for this array. */
4315 for (d
= 0; d
< as
->corank
; d
++)
4316 gfc_constructor_append_expr (&e
->value
.constructor
,
4317 bounds
[d
], &e
->where
);
4322 /* A DIM argument is specified. */
4323 if (dim
->expr_type
!= EXPR_CONSTANT
)
4326 d
= mpz_get_si (dim
->value
.integer
);
4328 if (d
< 1 || d
> as
->corank
)
4330 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
4331 return &gfc_bad_expr
;
4334 return simplify_bound_dim (array
, kind
, d
+as
->rank
, upper
, as
, ref
, true);
4340 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4342 return simplify_bound (array
, dim
, kind
, 0);
4347 gfc_simplify_lcobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4349 return simplify_cobound (array
, dim
, kind
, 0);
4353 gfc_simplify_leadz (gfc_expr
*e
)
4355 unsigned long lz
, bs
;
4358 if (e
->expr_type
!= EXPR_CONSTANT
)
4361 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4362 bs
= gfc_integer_kinds
[i
].bit_size
;
4363 if (mpz_cmp_si (e
->value
.integer
, 0) == 0)
4365 else if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
4368 lz
= bs
- mpz_sizeinbase (e
->value
.integer
, 2);
4370 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, lz
);
4375 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
4378 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
4381 return &gfc_bad_expr
;
4383 if (e
->expr_type
== EXPR_CONSTANT
)
4385 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
4386 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
4387 return range_check (result
, "LEN");
4389 else if (e
->ts
.u
.cl
!= NULL
&& e
->ts
.u
.cl
->length
!= NULL
4390 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
4391 && e
->ts
.u
.cl
->length
->ts
.type
== BT_INTEGER
)
4393 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
4394 mpz_set (result
->value
.integer
, e
->ts
.u
.cl
->length
->value
.integer
);
4395 return range_check (result
, "LEN");
4397 else if (e
->expr_type
== EXPR_VARIABLE
&& e
->ts
.type
== BT_CHARACTER
4398 && e
->symtree
->n
.sym
4399 && e
->symtree
->n
.sym
->ts
.type
!= BT_DERIVED
4400 && e
->symtree
->n
.sym
->assoc
&& e
->symtree
->n
.sym
->assoc
->target
4401 && e
->symtree
->n
.sym
->assoc
->target
->ts
.type
== BT_DERIVED
4402 && e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
4403 && UNLIMITED_POLY (e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
))
4405 /* The expression in assoc->target points to a ref to the _data component
4406 of the unlimited polymorphic entity. To get the _len component the last
4407 _data ref needs to be stripped and a ref to the _len component added. */
4408 return gfc_get_len_component (e
->symtree
->n
.sym
->assoc
->target
);
4415 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
4419 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
4422 return &gfc_bad_expr
;
4424 if (e
->expr_type
!= EXPR_CONSTANT
)
4427 len
= e
->value
.character
.length
;
4428 for (count
= 0, i
= 1; i
<= len
; i
++)
4429 if (e
->value
.character
.string
[len
- i
] == ' ')
4434 result
= gfc_get_int_expr (k
, &e
->where
, len
- count
);
4435 return range_check (result
, "LEN_TRIM");
4439 gfc_simplify_lgamma (gfc_expr
*x
)
4444 if (x
->expr_type
!= EXPR_CONSTANT
)
4447 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4448 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
4450 return range_check (result
, "LGAMMA");
4455 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
4457 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4460 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4461 gfc_compare_string (a
, b
) >= 0);
4466 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
4468 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4471 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4472 gfc_compare_string (a
, b
) > 0);
4477 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
4479 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4482 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4483 gfc_compare_string (a
, b
) <= 0);
4488 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
4490 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4493 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4494 gfc_compare_string (a
, b
) < 0);
4499 gfc_simplify_log (gfc_expr
*x
)
4503 if (x
->expr_type
!= EXPR_CONSTANT
)
4506 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4511 if (mpfr_sgn (x
->value
.real
) <= 0)
4513 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4514 "to zero", &x
->where
);
4515 gfc_free_expr (result
);
4516 return &gfc_bad_expr
;
4519 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4523 if (mpfr_zero_p (mpc_realref (x
->value
.complex))
4524 && mpfr_zero_p (mpc_imagref (x
->value
.complex)))
4526 gfc_error ("Complex argument of LOG at %L cannot be zero",
4528 gfc_free_expr (result
);
4529 return &gfc_bad_expr
;
4532 gfc_set_model_kind (x
->ts
.kind
);
4533 mpc_log (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
4537 gfc_internal_error ("gfc_simplify_log: bad type");
4540 return range_check (result
, "LOG");
4545 gfc_simplify_log10 (gfc_expr
*x
)
4549 if (x
->expr_type
!= EXPR_CONSTANT
)
4552 if (mpfr_sgn (x
->value
.real
) <= 0)
4554 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4555 "to zero", &x
->where
);
4556 return &gfc_bad_expr
;
4559 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4560 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4562 return range_check (result
, "LOG10");
4567 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
4571 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
4573 return &gfc_bad_expr
;
4575 if (e
->expr_type
!= EXPR_CONSTANT
)
4578 return gfc_get_logical_expr (kind
, &e
->where
, e
->value
.logical
);
4583 gfc_simplify_matmul (gfc_expr
*matrix_a
, gfc_expr
*matrix_b
)
4586 int row
, result_rows
, col
, result_columns
;
4587 int stride_a
, offset_a
, stride_b
, offset_b
;
4589 if (!is_constant_array_expr (matrix_a
)
4590 || !is_constant_array_expr (matrix_b
))
4593 gcc_assert (gfc_compare_types (&matrix_a
->ts
, &matrix_b
->ts
));
4594 result
= gfc_get_array_expr (matrix_a
->ts
.type
,
4598 if (matrix_a
->rank
== 1 && matrix_b
->rank
== 2)
4601 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4603 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4606 result
->shape
= gfc_get_shape (result
->rank
);
4607 mpz_init_set_si (result
->shape
[0], result_columns
);
4609 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 1)
4611 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4613 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4617 result
->shape
= gfc_get_shape (result
->rank
);
4618 mpz_init_set_si (result
->shape
[0], result_rows
);
4620 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 2)
4622 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4623 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4624 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4625 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4628 result
->shape
= gfc_get_shape (result
->rank
);
4629 mpz_init_set_si (result
->shape
[0], result_rows
);
4630 mpz_init_set_si (result
->shape
[1], result_columns
);
4635 offset_a
= offset_b
= 0;
4636 for (col
= 0; col
< result_columns
; ++col
)
4640 for (row
= 0; row
< result_rows
; ++row
)
4642 gfc_expr
*e
= compute_dot_product (matrix_a
, stride_a
, offset_a
,
4643 matrix_b
, 1, offset_b
, false);
4644 gfc_constructor_append_expr (&result
->value
.constructor
,
4650 offset_b
+= stride_b
;
4658 gfc_simplify_maskr (gfc_expr
*i
, gfc_expr
*kind_arg
)
4663 if (i
->expr_type
!= EXPR_CONSTANT
)
4666 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKR", gfc_default_integer_kind
);
4668 return &gfc_bad_expr
;
4669 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4671 bool fail
= gfc_extract_int (i
, &arg
);
4674 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4676 /* MASKR(n) = 2^n - 1 */
4677 mpz_set_ui (result
->value
.integer
, 1);
4678 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
, arg
);
4679 mpz_sub_ui (result
->value
.integer
, result
->value
.integer
, 1);
4681 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4688 gfc_simplify_maskl (gfc_expr
*i
, gfc_expr
*kind_arg
)
4694 if (i
->expr_type
!= EXPR_CONSTANT
)
4697 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKL", gfc_default_integer_kind
);
4699 return &gfc_bad_expr
;
4700 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4702 bool fail
= gfc_extract_int (i
, &arg
);
4705 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4707 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4708 mpz_init_set_ui (z
, 1);
4709 mpz_mul_2exp (z
, z
, gfc_integer_kinds
[k
].bit_size
);
4710 mpz_set_ui (result
->value
.integer
, 1);
4711 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
,
4712 gfc_integer_kinds
[k
].bit_size
- arg
);
4713 mpz_sub (result
->value
.integer
, z
, result
->value
.integer
);
4716 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4723 gfc_simplify_merge (gfc_expr
*tsource
, gfc_expr
*fsource
, gfc_expr
*mask
)
4726 gfc_constructor
*tsource_ctor
, *fsource_ctor
, *mask_ctor
;
4728 if (mask
->expr_type
== EXPR_CONSTANT
)
4729 return gfc_get_parentheses (gfc_copy_expr (mask
->value
.logical
4730 ? tsource
: fsource
));
4732 if (!mask
->rank
|| !is_constant_array_expr (mask
)
4733 || !is_constant_array_expr (tsource
) || !is_constant_array_expr (fsource
))
4736 result
= gfc_get_array_expr (tsource
->ts
.type
, tsource
->ts
.kind
,
4738 if (tsource
->ts
.type
== BT_DERIVED
)
4739 result
->ts
.u
.derived
= tsource
->ts
.u
.derived
;
4740 else if (tsource
->ts
.type
== BT_CHARACTER
)
4741 result
->ts
.u
.cl
= tsource
->ts
.u
.cl
;
4743 tsource_ctor
= gfc_constructor_first (tsource
->value
.constructor
);
4744 fsource_ctor
= gfc_constructor_first (fsource
->value
.constructor
);
4745 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4749 if (mask_ctor
->expr
->value
.logical
)
4750 gfc_constructor_append_expr (&result
->value
.constructor
,
4751 gfc_copy_expr (tsource_ctor
->expr
),
4754 gfc_constructor_append_expr (&result
->value
.constructor
,
4755 gfc_copy_expr (fsource_ctor
->expr
),
4757 tsource_ctor
= gfc_constructor_next (tsource_ctor
);
4758 fsource_ctor
= gfc_constructor_next (fsource_ctor
);
4759 mask_ctor
= gfc_constructor_next (mask_ctor
);
4762 result
->shape
= gfc_get_shape (1);
4763 gfc_array_size (result
, &result
->shape
[0]);
4770 gfc_simplify_merge_bits (gfc_expr
*i
, gfc_expr
*j
, gfc_expr
*mask_expr
)
4772 mpz_t arg1
, arg2
, mask
;
4775 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
4776 || mask_expr
->expr_type
!= EXPR_CONSTANT
)
4779 result
= gfc_get_constant_expr (BT_INTEGER
, i
->ts
.kind
, &i
->where
);
4781 /* Convert all argument to unsigned. */
4782 mpz_init_set (arg1
, i
->value
.integer
);
4783 mpz_init_set (arg2
, j
->value
.integer
);
4784 mpz_init_set (mask
, mask_expr
->value
.integer
);
4786 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4787 mpz_and (arg1
, arg1
, mask
);
4788 mpz_com (mask
, mask
);
4789 mpz_and (arg2
, arg2
, mask
);
4790 mpz_ior (result
->value
.integer
, arg1
, arg2
);
4800 /* Selects between current value and extremum for simplify_min_max
4801 and simplify_minval_maxval. */
4803 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
)
4807 switch (arg
->ts
.type
)
4810 ret
= mpz_cmp (arg
->value
.integer
,
4811 extremum
->value
.integer
) * sign
;
4813 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
4817 if (mpfr_nan_p (extremum
->value
.real
))
4820 mpfr_set (extremum
->value
.real
, arg
->value
.real
, GFC_RND_MODE
);
4822 else if (mpfr_nan_p (arg
->value
.real
))
4826 ret
= mpfr_cmp (arg
->value
.real
, extremum
->value
.real
) * sign
;
4828 mpfr_set (extremum
->value
.real
, arg
->value
.real
, GFC_RND_MODE
);
4833 #define LENGTH(x) ((x)->value.character.length)
4834 #define STRING(x) ((x)->value.character.string)
4835 if (LENGTH (extremum
) < LENGTH(arg
))
4837 gfc_char_t
*tmp
= STRING(extremum
);
4839 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
4840 memcpy (STRING(extremum
), tmp
,
4841 LENGTH(extremum
) * sizeof (gfc_char_t
));
4842 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
4843 LENGTH(arg
) - LENGTH(extremum
));
4844 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
4845 LENGTH(extremum
) = LENGTH(arg
);
4848 ret
= gfc_compare_string (arg
, extremum
) * sign
;
4851 free (STRING(extremum
));
4852 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
4853 memcpy (STRING(extremum
), STRING(arg
),
4854 LENGTH(arg
) * sizeof (gfc_char_t
));
4855 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
4856 LENGTH(extremum
) - LENGTH(arg
));
4857 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
4864 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4870 /* This function is special since MAX() can take any number of
4871 arguments. The simplified expression is a rewritten version of the
4872 argument list containing at most one constant element. Other
4873 constant elements are deleted. Because the argument list has
4874 already been checked, this function always succeeds. sign is 1 for
4875 MAX(), -1 for MIN(). */
4878 simplify_min_max (gfc_expr
*expr
, int sign
)
4880 gfc_actual_arglist
*arg
, *last
, *extremum
;
4881 gfc_intrinsic_sym
* specific
;
4885 specific
= expr
->value
.function
.isym
;
4887 arg
= expr
->value
.function
.actual
;
4889 for (; arg
; last
= arg
, arg
= arg
->next
)
4891 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
4894 if (extremum
== NULL
)
4900 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
4902 /* Delete the extra constant argument. */
4903 last
->next
= arg
->next
;
4906 gfc_free_actual_arglist (arg
);
4910 /* If there is one value left, replace the function call with the
4912 if (expr
->value
.function
.actual
->next
!= NULL
)
4915 /* Convert to the correct type and kind. */
4916 if (expr
->ts
.type
!= BT_UNKNOWN
)
4917 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4918 expr
->ts
.type
, expr
->ts
.kind
);
4920 if (specific
->ts
.type
!= BT_UNKNOWN
)
4921 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4922 specific
->ts
.type
, specific
->ts
.kind
);
4924 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
4929 gfc_simplify_min (gfc_expr
*e
)
4931 return simplify_min_max (e
, -1);
4936 gfc_simplify_max (gfc_expr
*e
)
4938 return simplify_min_max (e
, 1);
4941 /* Helper function for gfc_simplify_minval. */
4944 gfc_min (gfc_expr
*op1
, gfc_expr
*op2
)
4946 min_max_choose (op1
, op2
, -1);
4947 gfc_free_expr (op1
);
4951 /* Simplify minval for constant arrays. */
4954 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4956 return simplify_transformation (array
, dim
, mask
, INT_MAX
, gfc_min
);
4959 /* Helper function for gfc_simplify_maxval. */
4962 gfc_max (gfc_expr
*op1
, gfc_expr
*op2
)
4964 min_max_choose (op1
, op2
, 1);
4965 gfc_free_expr (op1
);
4970 /* Simplify maxval for constant arrays. */
4973 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4975 return simplify_transformation (array
, dim
, mask
, INT_MIN
, gfc_max
);
4979 /* Transform minloc or maxloc of an array, according to MASK,
4980 to the scalar result. This code is mostly identical to
4981 simplify_transformation_to_scalar. */
4984 simplify_minmaxloc_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
4985 gfc_expr
*extremum
, int sign
)
4988 gfc_constructor
*array_ctor
, *mask_ctor
;
4991 mpz_set_si (result
->value
.integer
, 0);
4994 /* Shortcut for constant .FALSE. MASK. */
4996 && mask
->expr_type
== EXPR_CONSTANT
4997 && !mask
->value
.logical
)
5000 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5001 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
5002 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5006 mpz_init_set_si (count
, 0);
5009 mpz_add_ui (count
, count
, 1);
5010 a
= array_ctor
->expr
;
5011 array_ctor
= gfc_constructor_next (array_ctor
);
5012 /* A constant MASK equals .TRUE. here and can be ignored. */
5015 m
= mask_ctor
->expr
;
5016 mask_ctor
= gfc_constructor_next (mask_ctor
);
5017 if (!m
->value
.logical
)
5020 if (min_max_choose (a
, extremum
, sign
) > 0)
5021 mpz_set (result
->value
.integer
, count
);
5024 gfc_free_expr (extremum
);
5028 /* Simplify minloc / maxloc in the absence of a dim argument. */
5031 simplify_minmaxloc_nodim (gfc_expr
*result
, gfc_expr
*extremum
,
5032 gfc_expr
*array
, gfc_expr
*mask
, int sign
)
5034 ssize_t res
[GFC_MAX_DIMENSIONS
];
5036 gfc_constructor
*result_ctor
, *array_ctor
, *mask_ctor
;
5037 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
5038 sstride
[GFC_MAX_DIMENSIONS
];
5043 for (i
= 0; i
<array
->rank
; i
++)
5046 /* Shortcut for constant .FALSE. MASK. */
5048 && mask
->expr_type
== EXPR_CONSTANT
5049 && !mask
->value
.logical
)
5052 for (i
= 0; i
< array
->rank
; i
++)
5055 sstride
[i
] = (i
== 0) ? 1 : sstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
5056 extent
[i
] = mpz_get_si (array
->shape
[i
]);
5061 continue_loop
= true;
5062 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5063 if (mask
&& mask
->rank
> 0)
5064 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5068 /* Loop over the array elements (and mask), keeping track of
5069 the indices to return. */
5070 while (continue_loop
)
5074 a
= array_ctor
->expr
;
5077 m
= mask_ctor
->expr
;
5078 ma
= m
->value
.logical
;
5079 mask_ctor
= gfc_constructor_next (mask_ctor
);
5084 if (ma
&& min_max_choose (a
, extremum
, sign
) > 0)
5086 for (i
= 0; i
<array
->rank
; i
++)
5089 array_ctor
= gfc_constructor_next (array_ctor
);
5091 } while (count
[0] != extent
[0]);
5095 /* When we get to the end of a dimension, reset it and increment
5096 the next dimension. */
5099 if (n
>= array
->rank
)
5101 continue_loop
= false;
5106 } while (count
[n
] == extent
[n
]);
5110 gfc_free_expr (extremum
);
5111 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5112 for (i
= 0; i
<array
->rank
; i
++)
5115 r_expr
= result_ctor
->expr
;
5116 mpz_set_si (r_expr
->value
.integer
, res
[i
] + 1);
5117 result_ctor
= gfc_constructor_next (result_ctor
);
5122 /* Helper function for gfc_simplify_minmaxloc - build an array
5123 expression with n elements. */
5126 new_array (bt type
, int kind
, int n
, locus
*where
)
5131 result
= gfc_get_array_expr (type
, kind
, where
);
5133 result
->shape
= gfc_get_shape(1);
5134 mpz_init_set_si (result
->shape
[0], n
);
5135 for (i
= 0; i
< n
; i
++)
5137 gfc_constructor_append_expr (&result
->value
.constructor
,
5138 gfc_get_constant_expr (type
, kind
, where
),
5145 /* Simplify minloc and maxloc. This code is mostly identical to
5146 simplify_transformation_to_array. */
5149 simplify_minmaxloc_to_array (gfc_expr
*result
, gfc_expr
*array
,
5150 gfc_expr
*dim
, gfc_expr
*mask
,
5151 gfc_expr
*extremum
, int sign
)
5154 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
5155 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
5156 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
5158 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
5159 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
5160 tmpstride
[GFC_MAX_DIMENSIONS
];
5162 /* Shortcut for constant .FALSE. MASK. */
5164 && mask
->expr_type
== EXPR_CONSTANT
5165 && !mask
->value
.logical
)
5168 /* Build an indexed table for array element expressions to minimize
5169 linked-list traversal. Masked elements are set to NULL. */
5170 gfc_array_size (array
, &size
);
5171 arraysize
= mpz_get_ui (size
);
5174 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
5176 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5178 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
5179 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5181 for (i
= 0; i
< arraysize
; ++i
)
5183 arrayvec
[i
] = array_ctor
->expr
;
5184 array_ctor
= gfc_constructor_next (array_ctor
);
5188 if (!mask_ctor
->expr
->value
.logical
)
5191 mask_ctor
= gfc_constructor_next (mask_ctor
);
5195 /* Same for the result expression. */
5196 gfc_array_size (result
, &size
);
5197 resultsize
= mpz_get_ui (size
);
5200 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
5201 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5202 for (i
= 0; i
< resultsize
; ++i
)
5204 resultvec
[i
] = result_ctor
->expr
;
5205 result_ctor
= gfc_constructor_next (result_ctor
);
5208 gfc_extract_int (dim
, &dim_index
);
5209 dim_index
-= 1; /* zero-base index */
5213 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
5216 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
5219 dim_extent
= mpz_get_si (array
->shape
[i
]);
5220 dim_stride
= tmpstride
[i
];
5224 extent
[n
] = mpz_get_si (array
->shape
[i
]);
5225 sstride
[n
] = tmpstride
[i
];
5226 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
5236 ex
= gfc_copy_expr (extremum
);
5237 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
5239 if (*src
&& min_max_choose (*src
, ex
, sign
) > 0)
5240 mpz_set_si ((*dest
)->value
.integer
, n
+ 1);
5249 while (!done
&& count
[n
] == extent
[n
])
5252 base
-= sstride
[n
] * extent
[n
];
5253 dest
-= dstride
[n
] * extent
[n
];
5256 if (n
< result
->rank
)
5258 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
5259 times, we'd warn for the last iteration, because the
5260 array index will have already been incremented to the
5261 array sizes, and we can't tell that this must make
5262 the test against result->rank false, because ranks
5263 must not exceed GFC_MAX_DIMENSIONS. */
5264 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray
-bounds
)
5275 /* Place updated expression in result constructor. */
5276 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5277 for (i
= 0; i
< resultsize
; ++i
)
5279 result_ctor
->expr
= resultvec
[i
];
5280 result_ctor
= gfc_constructor_next (result_ctor
);
5289 /* Simplify minloc and maxloc for constant arrays. */
5292 gfc_simplify_minmaxloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
5293 gfc_expr
*kind
, int sign
)
5300 if (!is_constant_array_expr (array
)
5301 || !gfc_is_constant_expr (dim
))
5305 && !is_constant_array_expr (mask
)
5306 && mask
->expr_type
!= EXPR_CONSTANT
)
5311 if (gfc_extract_int (kind
, &ikind
, -1))
5315 ikind
= gfc_default_integer_kind
;
5324 extremum
= gfc_get_constant_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
5325 init_result_expr (extremum
, init_val
, array
);
5329 result
= transformational_result (array
, dim
, BT_INTEGER
,
5330 ikind
, &array
->where
);
5331 init_result_expr (result
, 0, array
);
5333 if (array
->rank
== 1)
5334 return simplify_minmaxloc_to_scalar (result
, array
, mask
, extremum
, sign
);
5336 return simplify_minmaxloc_to_array (result
, array
, dim
, mask
, extremum
, sign
);
5340 result
= new_array (BT_INTEGER
, ikind
, array
->rank
, &array
->where
);
5341 return simplify_minmaxloc_nodim (result
, extremum
, array
, mask
, sign
);
5346 gfc_simplify_minloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
, gfc_expr
*kind
)
5348 return gfc_simplify_minmaxloc (array
, dim
, mask
, kind
, -1);
5352 gfc_simplify_maxloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
, gfc_expr
*kind
)
5354 return gfc_simplify_minmaxloc (array
, dim
, mask
, kind
, 1);
5358 gfc_simplify_maxexponent (gfc_expr
*x
)
5360 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5361 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
5362 gfc_real_kinds
[i
].max_exponent
);
5367 gfc_simplify_minexponent (gfc_expr
*x
)
5369 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5370 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
5371 gfc_real_kinds
[i
].min_exponent
);
5376 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
5381 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
5384 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
5385 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
5390 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
5392 /* Result is processor-dependent. */
5393 gfc_error ("Second argument MOD at %L is zero", &a
->where
);
5394 gfc_free_expr (result
);
5395 return &gfc_bad_expr
;
5397 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
5401 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
5403 /* Result is processor-dependent. */
5404 gfc_error ("Second argument of MOD at %L is zero", &p
->where
);
5405 gfc_free_expr (result
);
5406 return &gfc_bad_expr
;
5409 gfc_set_model_kind (kind
);
5410 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
5415 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
5418 return range_check (result
, "MOD");
5423 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
5428 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
5431 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
5432 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
5437 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
5439 /* Result is processor-dependent. This processor just opts
5440 to not handle it at all. */
5441 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
5442 gfc_free_expr (result
);
5443 return &gfc_bad_expr
;
5445 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
5450 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
5452 /* Result is processor-dependent. */
5453 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
5454 gfc_free_expr (result
);
5455 return &gfc_bad_expr
;
5458 gfc_set_model_kind (kind
);
5459 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
5461 if (mpfr_cmp_ui (result
->value
.real
, 0) != 0)
5463 if (mpfr_signbit (a
->value
.real
) != mpfr_signbit (p
->value
.real
))
5464 mpfr_add (result
->value
.real
, result
->value
.real
, p
->value
.real
,
5468 mpfr_copysign (result
->value
.real
, result
->value
.real
,
5469 p
->value
.real
, GFC_RND_MODE
);
5473 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
5476 return range_check (result
, "MODULO");
5481 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
5484 mp_exp_t emin
, emax
;
5487 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
5490 result
= gfc_copy_expr (x
);
5492 /* Save current values of emin and emax. */
5493 emin
= mpfr_get_emin ();
5494 emax
= mpfr_get_emax ();
5496 /* Set emin and emax for the current model number. */
5497 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
5498 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
5499 mpfr_get_prec(result
->value
.real
) + 1);
5500 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
5501 mpfr_check_range (result
->value
.real
, 0, GMP_RNDU
);
5503 if (mpfr_sgn (s
->value
.real
) > 0)
5505 mpfr_nextabove (result
->value
.real
);
5506 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
5510 mpfr_nextbelow (result
->value
.real
);
5511 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
5514 mpfr_set_emin (emin
);
5515 mpfr_set_emax (emax
);
5517 /* Only NaN can occur. Do not use range check as it gives an
5518 error for denormal numbers. */
5519 if (mpfr_nan_p (result
->value
.real
) && flag_range_check
)
5521 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
5522 gfc_free_expr (result
);
5523 return &gfc_bad_expr
;
5531 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
5533 gfc_expr
*itrunc
, *result
;
5536 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
5538 return &gfc_bad_expr
;
5540 if (e
->expr_type
!= EXPR_CONSTANT
)
5543 itrunc
= gfc_copy_expr (e
);
5544 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
5546 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
5547 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
5549 gfc_free_expr (itrunc
);
5551 return range_check (result
, name
);
5556 gfc_simplify_new_line (gfc_expr
*e
)
5560 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 1);
5561 result
->value
.character
.string
[0] = '\n';
5568 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
5570 return simplify_nint ("NINT", e
, k
);
5575 gfc_simplify_idnint (gfc_expr
*e
)
5577 return simplify_nint ("IDNINT", e
, NULL
);
5582 add_squared (gfc_expr
*result
, gfc_expr
*e
)
5586 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
5587 gcc_assert (result
->ts
.type
== BT_REAL
5588 && result
->expr_type
== EXPR_CONSTANT
);
5590 gfc_set_model_kind (result
->ts
.kind
);
5592 mpfr_pow_ui (tmp
, e
->value
.real
, 2, GFC_RND_MODE
);
5593 mpfr_add (result
->value
.real
, result
->value
.real
, tmp
,
5602 do_sqrt (gfc_expr
*result
, gfc_expr
*e
)
5604 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
5605 gcc_assert (result
->ts
.type
== BT_REAL
5606 && result
->expr_type
== EXPR_CONSTANT
);
5608 mpfr_set (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
5609 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
5615 gfc_simplify_norm2 (gfc_expr
*e
, gfc_expr
*dim
)
5619 if (!is_constant_array_expr (e
)
5620 || (dim
!= NULL
&& !gfc_is_constant_expr (dim
)))
5623 result
= transformational_result (e
, dim
, e
->ts
.type
, e
->ts
.kind
, &e
->where
);
5624 init_result_expr (result
, 0, NULL
);
5626 if (!dim
|| e
->rank
== 1)
5628 result
= simplify_transformation_to_scalar (result
, e
, NULL
,
5630 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
5633 result
= simplify_transformation_to_array (result
, e
, dim
, NULL
,
5634 add_squared
, &do_sqrt
);
5641 gfc_simplify_not (gfc_expr
*e
)
5645 if (e
->expr_type
!= EXPR_CONSTANT
)
5648 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
5649 mpz_com (result
->value
.integer
, e
->value
.integer
);
5651 return range_check (result
, "NOT");
5656 gfc_simplify_null (gfc_expr
*mold
)
5662 result
= gfc_copy_expr (mold
);
5663 result
->expr_type
= EXPR_NULL
;
5666 result
= gfc_get_null_expr (NULL
);
5673 gfc_simplify_num_images (gfc_expr
*distance ATTRIBUTE_UNUSED
, gfc_expr
*failed
)
5677 if (flag_coarray
== GFC_FCOARRAY_NONE
)
5679 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
5680 return &gfc_bad_expr
;
5683 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
5686 if (failed
&& failed
->expr_type
!= EXPR_CONSTANT
)
5689 /* FIXME: gfc_current_locus is wrong. */
5690 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
5691 &gfc_current_locus
);
5693 if (failed
&& failed
->value
.logical
!= 0)
5694 mpz_set_si (result
->value
.integer
, 0);
5696 mpz_set_si (result
->value
.integer
, 1);
5703 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
5708 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
5711 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
5716 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
5717 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
5718 return range_check (result
, "OR");
5721 return gfc_get_logical_expr (kind
, &x
->where
,
5722 x
->value
.logical
|| y
->value
.logical
);
5730 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
5733 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
5735 if (!is_constant_array_expr (array
)
5736 || !is_constant_array_expr (vector
)
5737 || (!gfc_is_constant_expr (mask
)
5738 && !is_constant_array_expr (mask
)))
5741 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
5742 if (array
->ts
.type
== BT_DERIVED
)
5743 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
5745 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5746 vector_ctor
= vector
5747 ? gfc_constructor_first (vector
->value
.constructor
)
5750 if (mask
->expr_type
== EXPR_CONSTANT
5751 && mask
->value
.logical
)
5753 /* Copy all elements of ARRAY to RESULT. */
5756 gfc_constructor_append_expr (&result
->value
.constructor
,
5757 gfc_copy_expr (array_ctor
->expr
),
5760 array_ctor
= gfc_constructor_next (array_ctor
);
5761 vector_ctor
= gfc_constructor_next (vector_ctor
);
5764 else if (mask
->expr_type
== EXPR_ARRAY
)
5766 /* Copy only those elements of ARRAY to RESULT whose
5767 MASK equals .TRUE.. */
5768 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5771 if (mask_ctor
->expr
->value
.logical
)
5773 gfc_constructor_append_expr (&result
->value
.constructor
,
5774 gfc_copy_expr (array_ctor
->expr
),
5776 vector_ctor
= gfc_constructor_next (vector_ctor
);
5779 array_ctor
= gfc_constructor_next (array_ctor
);
5780 mask_ctor
= gfc_constructor_next (mask_ctor
);
5784 /* Append any left-over elements from VECTOR to RESULT. */
5787 gfc_constructor_append_expr (&result
->value
.constructor
,
5788 gfc_copy_expr (vector_ctor
->expr
),
5790 vector_ctor
= gfc_constructor_next (vector_ctor
);
5793 result
->shape
= gfc_get_shape (1);
5794 gfc_array_size (result
, &result
->shape
[0]);
5796 if (array
->ts
.type
== BT_CHARACTER
)
5797 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
5804 do_xor (gfc_expr
*result
, gfc_expr
*e
)
5806 gcc_assert (e
->ts
.type
== BT_LOGICAL
&& e
->expr_type
== EXPR_CONSTANT
);
5807 gcc_assert (result
->ts
.type
== BT_LOGICAL
5808 && result
->expr_type
== EXPR_CONSTANT
);
5810 result
->value
.logical
= result
->value
.logical
!= e
->value
.logical
;
5817 gfc_simplify_parity (gfc_expr
*e
, gfc_expr
*dim
)
5819 return simplify_transformation (e
, dim
, NULL
, 0, do_xor
);
5824 gfc_simplify_popcnt (gfc_expr
*e
)
5829 if (e
->expr_type
!= EXPR_CONSTANT
)
5832 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5834 /* Convert argument to unsigned, then count the '1' bits. */
5835 mpz_init_set (x
, e
->value
.integer
);
5836 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
5837 res
= mpz_popcount (x
);
5840 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, res
);
5845 gfc_simplify_poppar (gfc_expr
*e
)
5850 if (e
->expr_type
!= EXPR_CONSTANT
)
5853 popcnt
= gfc_simplify_popcnt (e
);
5854 gcc_assert (popcnt
);
5856 bool fail
= gfc_extract_int (popcnt
, &i
);
5859 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
% 2);
5864 gfc_simplify_precision (gfc_expr
*e
)
5866 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5867 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
,
5868 gfc_real_kinds
[i
].precision
);
5873 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
5875 return simplify_transformation (array
, dim
, mask
, 1, gfc_multiply
);
5880 gfc_simplify_radix (gfc_expr
*e
)
5883 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5888 i
= gfc_integer_kinds
[i
].radix
;
5892 i
= gfc_real_kinds
[i
].radix
;
5899 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
5904 gfc_simplify_range (gfc_expr
*e
)
5907 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5912 i
= gfc_integer_kinds
[i
].range
;
5917 i
= gfc_real_kinds
[i
].range
;
5924 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
5929 gfc_simplify_rank (gfc_expr
*e
)
5935 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, e
->rank
);
5940 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
5942 gfc_expr
*result
= NULL
;
5945 if (e
->ts
.type
== BT_COMPLEX
)
5946 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
5948 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
5951 return &gfc_bad_expr
;
5953 if (e
->expr_type
!= EXPR_CONSTANT
)
5956 if (convert_boz (e
, kind
) == &gfc_bad_expr
)
5957 return &gfc_bad_expr
;
5959 result
= gfc_convert_constant (e
, BT_REAL
, kind
);
5960 if (result
== &gfc_bad_expr
)
5961 return &gfc_bad_expr
;
5963 return range_check (result
, "REAL");
5968 gfc_simplify_realpart (gfc_expr
*e
)
5972 if (e
->expr_type
!= EXPR_CONSTANT
)
5975 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
5976 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
5978 return range_check (result
, "REALPART");
5982 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
5987 bool have_length
= false;
5989 /* If NCOPIES isn't a constant, there's nothing we can do. */
5990 if (n
->expr_type
!= EXPR_CONSTANT
)
5993 /* If NCOPIES is negative, it's an error. */
5994 if (mpz_sgn (n
->value
.integer
) < 0)
5996 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
5998 return &gfc_bad_expr
;
6001 /* If we don't know the character length, we can do no more. */
6002 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
6003 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
6005 len
= gfc_mpz_get_hwi (e
->ts
.u
.cl
->length
->value
.integer
);
6008 else if (e
->expr_type
== EXPR_CONSTANT
6009 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
6011 len
= e
->value
.character
.length
;
6016 /* If the source length is 0, any value of NCOPIES is valid
6017 and everything behaves as if NCOPIES == 0. */
6020 mpz_set_ui (ncopies
, 0);
6022 mpz_set (ncopies
, n
->value
.integer
);
6024 /* Check that NCOPIES isn't too large. */
6030 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
6032 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
6036 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
6037 e
->ts
.u
.cl
->length
->value
.integer
);
6042 gfc_mpz_set_hwi (mlen
, len
);
6043 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
6047 /* The check itself. */
6048 if (mpz_cmp (ncopies
, max
) > 0)
6051 mpz_clear (ncopies
);
6052 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
6054 return &gfc_bad_expr
;
6059 mpz_clear (ncopies
);
6061 /* For further simplification, we need the character string to be
6063 if (e
->expr_type
!= EXPR_CONSTANT
)
6068 (e
->ts
.u
.cl
->length
&&
6069 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
) != 0))
6071 bool fail
= gfc_extract_hwi (n
, &ncop
);
6078 return gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 0);
6080 len
= e
->value
.character
.length
;
6081 gfc_charlen_t nlen
= ncop
* len
;
6083 /* Here's a semi-arbitrary limit. If the string is longer than 32 MB
6084 (8 * 2**20 elements * 4 bytes (wide chars) per element) defer to
6085 runtime instead of consuming (unbounded) memory and CPU at
6090 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, nlen
);
6091 for (size_t i
= 0; i
< (size_t) ncop
; i
++)
6092 for (size_t j
= 0; j
< (size_t) len
; j
++)
6093 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
6095 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
6100 /* This one is a bear, but mainly has to do with shuffling elements. */
6103 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
6104 gfc_expr
*pad
, gfc_expr
*order_exp
)
6106 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
6107 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
6111 gfc_expr
*e
, *result
;
6113 /* Check that argument expression types are OK. */
6114 if (!is_constant_array_expr (source
)
6115 || !is_constant_array_expr (shape_exp
)
6116 || !is_constant_array_expr (pad
)
6117 || !is_constant_array_expr (order_exp
))
6120 if (source
->shape
== NULL
)
6123 /* Proceed with simplification, unpacking the array. */
6130 e
= gfc_constructor_lookup_expr (shape_exp
->value
.constructor
, rank
);
6134 gfc_extract_int (e
, &shape
[rank
]);
6136 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
6137 gcc_assert (shape
[rank
] >= 0);
6142 gcc_assert (rank
> 0);
6144 /* Now unpack the order array if present. */
6145 if (order_exp
== NULL
)
6147 for (i
= 0; i
< rank
; i
++)
6152 for (i
= 0; i
< rank
; i
++)
6155 for (i
= 0; i
< rank
; i
++)
6157 e
= gfc_constructor_lookup_expr (order_exp
->value
.constructor
, i
);
6160 gfc_extract_int (e
, &order
[i
]);
6162 gcc_assert (order
[i
] >= 1 && order
[i
] <= rank
);
6164 gcc_assert (x
[order
[i
]] == 0);
6169 /* Count the elements in the source and padding arrays. */
6174 gfc_array_size (pad
, &size
);
6175 npad
= mpz_get_ui (size
);
6179 gfc_array_size (source
, &size
);
6180 nsource
= mpz_get_ui (size
);
6183 /* If it weren't for that pesky permutation we could just loop
6184 through the source and round out any shortage with pad elements.
6185 But no, someone just had to have the compiler do something the
6186 user should be doing. */
6188 for (i
= 0; i
< rank
; i
++)
6191 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6193 if (source
->ts
.type
== BT_DERIVED
)
6194 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6195 result
->rank
= rank
;
6196 result
->shape
= gfc_get_shape (rank
);
6197 for (i
= 0; i
< rank
; i
++)
6198 mpz_init_set_ui (result
->shape
[i
], shape
[i
]);
6200 while (nsource
> 0 || npad
> 0)
6202 /* Figure out which element to extract. */
6203 mpz_set_ui (index
, 0);
6205 for (i
= rank
- 1; i
>= 0; i
--)
6207 mpz_add_ui (index
, index
, x
[order
[i
]]);
6209 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
6212 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
6213 gfc_internal_error ("Reshaped array too large at %C");
6215 j
= mpz_get_ui (index
);
6218 e
= gfc_constructor_lookup_expr (source
->value
.constructor
, j
);
6228 e
= gfc_constructor_lookup_expr (pad
->value
.constructor
, j
);
6232 gfc_constructor_append_expr (&result
->value
.constructor
,
6233 gfc_copy_expr (e
), &e
->where
);
6235 /* Calculate the next element. */
6239 if (++x
[i
] < shape
[i
])
6255 gfc_simplify_rrspacing (gfc_expr
*x
)
6261 if (x
->expr_type
!= EXPR_CONSTANT
)
6264 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
6266 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6268 /* RRSPACING(+/- 0.0) = 0.0 */
6269 if (mpfr_zero_p (x
->value
.real
))
6271 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
6275 /* RRSPACING(inf) = NaN */
6276 if (mpfr_inf_p (x
->value
.real
))
6278 mpfr_set_nan (result
->value
.real
);
6282 /* RRSPACING(NaN) = same NaN */
6283 if (mpfr_nan_p (x
->value
.real
))
6285 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6289 /* | x * 2**(-e) | * 2**p. */
6290 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6291 e
= - (long int) mpfr_get_exp (x
->value
.real
);
6292 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
6294 p
= (long int) gfc_real_kinds
[i
].digits
;
6295 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
6297 return range_check (result
, "RRSPACING");
6302 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
6304 int k
, neg_flag
, power
, exp_range
;
6305 mpfr_t scale
, radix
;
6308 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
6311 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6313 if (mpfr_zero_p (x
->value
.real
))
6315 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
6319 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
6321 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
6323 /* This check filters out values of i that would overflow an int. */
6324 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
6325 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
6327 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
6328 gfc_free_expr (result
);
6329 return &gfc_bad_expr
;
6332 /* Compute scale = radix ** power. */
6333 power
= mpz_get_si (i
->value
.integer
);
6343 gfc_set_model_kind (x
->ts
.kind
);
6346 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
6347 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
6350 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
6352 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
6354 mpfr_clears (scale
, radix
, NULL
);
6356 return range_check (result
, "SCALE");
6360 /* Variants of strspn and strcspn that operate on wide characters. */
6363 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
6366 const gfc_char_t
*c
;
6370 for (c
= s2
; *c
; c
++)
6384 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
6387 const gfc_char_t
*c
;
6391 for (c
= s2
; *c
; c
++)
6406 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
6411 size_t indx
, len
, lenc
;
6412 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
6415 return &gfc_bad_expr
;
6417 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
6418 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
6421 if (b
!= NULL
&& b
->value
.logical
!= 0)
6426 len
= e
->value
.character
.length
;
6427 lenc
= c
->value
.character
.length
;
6429 if (len
== 0 || lenc
== 0)
6437 indx
= wide_strcspn (e
->value
.character
.string
,
6438 c
->value
.character
.string
) + 1;
6445 for (indx
= len
; indx
> 0; indx
--)
6447 for (i
= 0; i
< lenc
; i
++)
6449 if (c
->value
.character
.string
[i
]
6450 == e
->value
.character
.string
[indx
- 1])
6459 result
= gfc_get_int_expr (k
, &e
->where
, indx
);
6460 return range_check (result
, "SCAN");
6465 gfc_simplify_selected_char_kind (gfc_expr
*e
)
6469 if (e
->expr_type
!= EXPR_CONSTANT
)
6472 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
6473 || gfc_compare_with_Cstring (e
, "default", false) == 0)
6475 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
6480 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
6485 gfc_simplify_selected_int_kind (gfc_expr
*e
)
6489 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
))
6494 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
6495 if (gfc_integer_kinds
[i
].range
>= range
6496 && gfc_integer_kinds
[i
].kind
< kind
)
6497 kind
= gfc_integer_kinds
[i
].kind
;
6499 if (kind
== INT_MAX
)
6502 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
6507 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
, gfc_expr
*rdx
)
6509 int range
, precision
, radix
, i
, kind
, found_precision
, found_range
,
6511 locus
*loc
= &gfc_current_locus
;
6517 if (p
->expr_type
!= EXPR_CONSTANT
6518 || gfc_extract_int (p
, &precision
))
6527 if (q
->expr_type
!= EXPR_CONSTANT
6528 || gfc_extract_int (q
, &range
))
6539 if (rdx
->expr_type
!= EXPR_CONSTANT
6540 || gfc_extract_int (rdx
, &radix
))
6548 found_precision
= 0;
6552 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
6554 if (gfc_real_kinds
[i
].precision
>= precision
)
6555 found_precision
= 1;
6557 if (gfc_real_kinds
[i
].range
>= range
)
6560 if (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
6563 if (gfc_real_kinds
[i
].precision
>= precision
6564 && gfc_real_kinds
[i
].range
>= range
6565 && (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
6566 && gfc_real_kinds
[i
].kind
< kind
)
6567 kind
= gfc_real_kinds
[i
].kind
;
6570 if (kind
== INT_MAX
)
6572 if (found_radix
&& found_range
&& !found_precision
)
6574 else if (found_radix
&& found_precision
&& !found_range
)
6576 else if (found_radix
&& !found_precision
&& !found_range
)
6578 else if (found_radix
)
6584 return gfc_get_int_expr (gfc_default_integer_kind
, loc
, kind
);
6589 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
6592 mpfr_t exp
, absv
, log2
, pow2
, frac
;
6595 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
6598 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6600 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
6601 SET_EXPONENT (NaN) = same NaN */
6602 if (mpfr_zero_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
6604 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6608 /* SET_EXPONENT (inf) = NaN */
6609 if (mpfr_inf_p (x
->value
.real
))
6611 mpfr_set_nan (result
->value
.real
);
6615 gfc_set_model_kind (x
->ts
.kind
);
6622 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
6623 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
6625 mpfr_trunc (log2
, log2
);
6626 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
6628 /* Old exponent value, and fraction. */
6629 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
6631 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
6634 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
6635 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
6637 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
6639 return range_check (result
, "SET_EXPONENT");
6644 gfc_simplify_shape (gfc_expr
*source
, gfc_expr
*kind
)
6646 mpz_t shape
[GFC_MAX_DIMENSIONS
];
6647 gfc_expr
*result
, *e
, *f
;
6651 int k
= get_kind (BT_INTEGER
, kind
, "SHAPE", gfc_default_integer_kind
);
6653 if (source
->rank
== -1)
6656 result
= gfc_get_array_expr (BT_INTEGER
, k
, &source
->where
);
6658 if (source
->rank
== 0)
6661 if (source
->expr_type
== EXPR_VARIABLE
)
6663 ar
= gfc_find_array_ref (source
);
6664 t
= gfc_array_ref_shape (ar
, shape
);
6666 else if (source
->shape
)
6669 for (n
= 0; n
< source
->rank
; n
++)
6671 mpz_init (shape
[n
]);
6672 mpz_set (shape
[n
], source
->shape
[n
]);
6678 for (n
= 0; n
< source
->rank
; n
++)
6680 e
= gfc_get_constant_expr (BT_INTEGER
, k
, &source
->where
);
6683 mpz_set (e
->value
.integer
, shape
[n
]);
6686 mpz_set_ui (e
->value
.integer
, n
+ 1);
6688 f
= simplify_size (source
, e
, k
);
6692 gfc_free_expr (result
);
6699 if (e
== &gfc_bad_expr
|| range_check (e
, "SHAPE") == &gfc_bad_expr
)
6701 gfc_free_expr (result
);
6703 gfc_clear_shape (shape
, source
->rank
);
6704 return &gfc_bad_expr
;
6707 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
6711 gfc_clear_shape (shape
, source
->rank
);
6718 simplify_size (gfc_expr
*array
, gfc_expr
*dim
, int k
)
6721 gfc_expr
*return_value
;
6724 /* For unary operations, the size of the result is given by the size
6725 of the operand. For binary ones, it's the size of the first operand
6726 unless it is scalar, then it is the size of the second. */
6727 if (array
->expr_type
== EXPR_OP
&& !array
->value
.op
.uop
)
6729 gfc_expr
* replacement
;
6730 gfc_expr
* simplified
;
6732 switch (array
->value
.op
.op
)
6734 /* Unary operations. */
6736 case INTRINSIC_UPLUS
:
6737 case INTRINSIC_UMINUS
:
6738 case INTRINSIC_PARENTHESES
:
6739 replacement
= array
->value
.op
.op1
;
6742 /* Binary operations. If any one of the operands is scalar, take
6743 the other one's size. If both of them are arrays, it does not
6744 matter -- try to find one with known shape, if possible. */
6746 if (array
->value
.op
.op1
->rank
== 0)
6747 replacement
= array
->value
.op
.op2
;
6748 else if (array
->value
.op
.op2
->rank
== 0)
6749 replacement
= array
->value
.op
.op1
;
6752 simplified
= simplify_size (array
->value
.op
.op1
, dim
, k
);
6756 replacement
= array
->value
.op
.op2
;
6761 /* Try to reduce it directly if possible. */
6762 simplified
= simplify_size (replacement
, dim
, k
);
6764 /* Otherwise, we build a new SIZE call. This is hopefully at least
6765 simpler than the original one. */
6768 gfc_expr
*kind
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, k
);
6769 simplified
= gfc_build_intrinsic_call (gfc_current_ns
,
6770 GFC_ISYM_SIZE
, "size",
6772 gfc_copy_expr (replacement
),
6773 gfc_copy_expr (dim
),
6781 if (!gfc_array_size (array
, &size
))
6786 if (dim
->expr_type
!= EXPR_CONSTANT
)
6789 d
= mpz_get_ui (dim
->value
.integer
) - 1;
6790 if (!gfc_array_dimen_size (array
, d
, &size
))
6794 return_value
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
6795 mpz_set (return_value
->value
.integer
, size
);
6798 return return_value
;
6803 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6806 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
6809 return &gfc_bad_expr
;
6811 result
= simplify_size (array
, dim
, k
);
6812 if (result
== NULL
|| result
== &gfc_bad_expr
)
6815 return range_check (result
, "SIZE");
6819 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
6820 multiplied by the array size. */
6823 gfc_simplify_sizeof (gfc_expr
*x
)
6825 gfc_expr
*result
= NULL
;
6828 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6831 if (x
->ts
.type
== BT_CHARACTER
6832 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6833 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6836 if (x
->rank
&& x
->expr_type
!= EXPR_ARRAY
6837 && !gfc_array_size (x
, &array_size
))
6840 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_index_integer_kind
,
6842 mpz_set_si (result
->value
.integer
, gfc_target_expr_size (x
));
6848 /* STORAGE_SIZE returns the size in bits of a single array element. */
6851 gfc_simplify_storage_size (gfc_expr
*x
,
6854 gfc_expr
*result
= NULL
;
6857 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6860 if (x
->ts
.type
== BT_CHARACTER
&& x
->expr_type
!= EXPR_CONSTANT
6861 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6862 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6865 k
= get_kind (BT_INTEGER
, kind
, "STORAGE_SIZE", gfc_default_integer_kind
);
6867 return &gfc_bad_expr
;
6869 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
6871 mpz_set_si (result
->value
.integer
, gfc_element_size (x
));
6872 mpz_mul_ui (result
->value
.integer
, result
->value
.integer
, BITS_PER_UNIT
);
6874 return range_check (result
, "STORAGE_SIZE");
6879 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
6883 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6886 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6891 mpz_abs (result
->value
.integer
, x
->value
.integer
);
6892 if (mpz_sgn (y
->value
.integer
) < 0)
6893 mpz_neg (result
->value
.integer
, result
->value
.integer
);
6898 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
6901 mpfr_setsign (result
->value
.real
, x
->value
.real
,
6902 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
6906 gfc_internal_error ("Bad type in gfc_simplify_sign");
6914 gfc_simplify_sin (gfc_expr
*x
)
6918 if (x
->expr_type
!= EXPR_CONSTANT
)
6921 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6926 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6930 gfc_set_model (x
->value
.real
);
6931 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6935 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
6938 return range_check (result
, "SIN");
6943 gfc_simplify_sinh (gfc_expr
*x
)
6947 if (x
->expr_type
!= EXPR_CONSTANT
)
6950 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6955 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6959 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6966 return range_check (result
, "SINH");
6970 /* The argument is always a double precision real that is converted to
6971 single precision. TODO: Rounding! */
6974 gfc_simplify_sngl (gfc_expr
*a
)
6978 if (a
->expr_type
!= EXPR_CONSTANT
)
6981 result
= gfc_real2real (a
, gfc_default_real_kind
);
6982 return range_check (result
, "SNGL");
6987 gfc_simplify_spacing (gfc_expr
*x
)
6993 if (x
->expr_type
!= EXPR_CONSTANT
)
6996 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
6997 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6999 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
7000 if (mpfr_zero_p (x
->value
.real
))
7002 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
7006 /* SPACING(inf) = NaN */
7007 if (mpfr_inf_p (x
->value
.real
))
7009 mpfr_set_nan (result
->value
.real
);
7013 /* SPACING(NaN) = same NaN */
7014 if (mpfr_nan_p (x
->value
.real
))
7016 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7020 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
7021 are the radix, exponent of x, and precision. This excludes the
7022 possibility of subnormal numbers. Fortran 2003 states the result is
7023 b**max(e - p, emin - 1). */
7025 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
7026 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
7027 en
= en
> ep
? en
: ep
;
7029 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
7030 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
7032 return range_check (result
, "SPACING");
7037 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
7039 gfc_expr
*result
= NULL
;
7040 int nelem
, i
, j
, dim
, ncopies
;
7043 if ((!gfc_is_constant_expr (source
)
7044 && !is_constant_array_expr (source
))
7045 || !gfc_is_constant_expr (dim_expr
)
7046 || !gfc_is_constant_expr (ncopies_expr
))
7049 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
7050 gfc_extract_int (dim_expr
, &dim
);
7051 dim
-= 1; /* zero-base DIM */
7053 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
7054 gfc_extract_int (ncopies_expr
, &ncopies
);
7055 ncopies
= MAX (ncopies
, 0);
7057 /* Do not allow the array size to exceed the limit for an array
7059 if (source
->expr_type
== EXPR_ARRAY
)
7061 if (!gfc_array_size (source
, &size
))
7062 gfc_internal_error ("Failure getting length of a constant array.");
7065 mpz_init_set_ui (size
, 1);
7067 nelem
= mpz_get_si (size
) * ncopies
;
7068 if (nelem
> flag_max_array_constructor
)
7070 if (gfc_current_ns
->sym_root
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
7072 gfc_error ("The number of elements (%d) in the array constructor "
7073 "at %L requires an increase of the allowed %d upper "
7074 "limit. See %<-fmax-array-constructor%> option.",
7075 nelem
, &source
->where
, flag_max_array_constructor
);
7076 return &gfc_bad_expr
;
7082 if (source
->expr_type
== EXPR_CONSTANT
)
7084 gcc_assert (dim
== 0);
7086 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
7088 if (source
->ts
.type
== BT_DERIVED
)
7089 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
7091 result
->shape
= gfc_get_shape (result
->rank
);
7092 mpz_init_set_si (result
->shape
[0], ncopies
);
7094 for (i
= 0; i
< ncopies
; ++i
)
7095 gfc_constructor_append_expr (&result
->value
.constructor
,
7096 gfc_copy_expr (source
), NULL
);
7098 else if (source
->expr_type
== EXPR_ARRAY
)
7100 int offset
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
7101 gfc_constructor
*source_ctor
;
7103 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
7104 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
7106 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
7108 if (source
->ts
.type
== BT_DERIVED
)
7109 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
7110 result
->rank
= source
->rank
+ 1;
7111 result
->shape
= gfc_get_shape (result
->rank
);
7113 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
7116 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
7118 mpz_init_set_si (result
->shape
[i
], ncopies
);
7120 extent
[i
] = mpz_get_si (result
->shape
[i
]);
7121 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
7125 for (source_ctor
= gfc_constructor_first (source
->value
.constructor
);
7126 source_ctor
; source_ctor
= gfc_constructor_next (source_ctor
))
7128 for (i
= 0; i
< ncopies
; ++i
)
7129 gfc_constructor_insert_expr (&result
->value
.constructor
,
7130 gfc_copy_expr (source_ctor
->expr
),
7131 NULL
, offset
+ i
* rstride
[dim
]);
7133 offset
+= (dim
== 0 ? ncopies
: 1);
7138 gfc_error ("Simplification of SPREAD at %C not yet implemented");
7139 return &gfc_bad_expr
;
7142 if (source
->ts
.type
== BT_CHARACTER
)
7143 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
7150 gfc_simplify_sqrt (gfc_expr
*e
)
7152 gfc_expr
*result
= NULL
;
7154 if (e
->expr_type
!= EXPR_CONSTANT
)
7160 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
7162 gfc_error ("Argument of SQRT at %L has a negative value",
7164 return &gfc_bad_expr
;
7166 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
7167 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
7171 gfc_set_model (e
->value
.real
);
7173 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
7174 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
7178 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
7181 return range_check (result
, "SQRT");
7186 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
7188 return simplify_transformation (array
, dim
, mask
, 0, gfc_add
);
7193 gfc_simplify_cotan (gfc_expr
*x
)
7198 if (x
->expr_type
!= EXPR_CONSTANT
)
7201 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
7206 mpfr_cot (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7210 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
7211 val
= &result
->value
.complex;
7212 mpc_init2 (swp
, mpfr_get_default_prec ());
7213 mpc_cos (swp
, x
->value
.complex, GFC_MPC_RND_MODE
);
7214 mpc_sin (*val
, x
->value
.complex, GFC_MPC_RND_MODE
);
7215 mpc_div (*val
, swp
, *val
, GFC_MPC_RND_MODE
);
7223 return range_check (result
, "COTAN");
7228 gfc_simplify_tan (gfc_expr
*x
)
7232 if (x
->expr_type
!= EXPR_CONSTANT
)
7235 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
7240 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7244 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
7251 return range_check (result
, "TAN");
7256 gfc_simplify_tanh (gfc_expr
*x
)
7260 if (x
->expr_type
!= EXPR_CONSTANT
)
7263 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
7268 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7272 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
7279 return range_check (result
, "TANH");
7284 gfc_simplify_tiny (gfc_expr
*e
)
7289 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
7291 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
7292 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
7299 gfc_simplify_trailz (gfc_expr
*e
)
7301 unsigned long tz
, bs
;
7304 if (e
->expr_type
!= EXPR_CONSTANT
)
7307 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
7308 bs
= gfc_integer_kinds
[i
].bit_size
;
7309 tz
= mpz_scan1 (e
->value
.integer
, 0);
7311 return gfc_get_int_expr (gfc_default_integer_kind
,
7312 &e
->where
, MIN (tz
, bs
));
7317 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
7320 gfc_expr
*mold_element
;
7325 unsigned char *buffer
;
7326 size_t result_length
;
7329 if (!gfc_is_constant_expr (source
)
7330 || (gfc_init_expr_flag
&& !gfc_is_constant_expr (mold
))
7331 || !gfc_is_constant_expr (size
))
7334 if (!gfc_calculate_transfer_sizes (source
, mold
, size
, &source_size
,
7335 &result_size
, &result_length
))
7338 /* Calculate the size of the source. */
7339 if (source
->expr_type
== EXPR_ARRAY
&& !gfc_array_size (source
, &tmp
))
7340 gfc_internal_error ("Failure getting length of a constant array.");
7342 /* Create an empty new expression with the appropriate characteristics. */
7343 result
= gfc_get_constant_expr (mold
->ts
.type
, mold
->ts
.kind
,
7345 result
->ts
= mold
->ts
;
7347 mold_element
= (mold
->expr_type
== EXPR_ARRAY
&& mold
->value
.constructor
)
7348 ? gfc_constructor_first (mold
->value
.constructor
)->expr
7351 /* Set result character length, if needed. Note that this needs to be
7352 set even for array expressions, in order to pass this information into
7353 gfc_target_interpret_expr. */
7354 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
7355 result
->value
.character
.length
= mold_element
->value
.character
.length
;
7357 /* Set the number of elements in the result, and determine its size. */
7359 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
7361 result
->expr_type
= EXPR_ARRAY
;
7363 result
->shape
= gfc_get_shape (1);
7364 mpz_init_set_ui (result
->shape
[0], result_length
);
7369 /* Allocate the buffer to store the binary version of the source. */
7370 buffer_size
= MAX (source_size
, result_size
);
7371 buffer
= (unsigned char*)alloca (buffer_size
);
7372 memset (buffer
, 0, buffer_size
);
7374 /* Now write source to the buffer. */
7375 gfc_target_encode_expr (source
, buffer
, buffer_size
);
7377 /* And read the buffer back into the new expression. */
7378 gfc_target_interpret_expr (buffer
, buffer_size
, result
, false);
7385 gfc_simplify_transpose (gfc_expr
*matrix
)
7387 int row
, matrix_rows
, col
, matrix_cols
;
7390 if (!is_constant_array_expr (matrix
))
7393 gcc_assert (matrix
->rank
== 2);
7395 result
= gfc_get_array_expr (matrix
->ts
.type
, matrix
->ts
.kind
,
7398 result
->shape
= gfc_get_shape (result
->rank
);
7399 mpz_set (result
->shape
[0], matrix
->shape
[1]);
7400 mpz_set (result
->shape
[1], matrix
->shape
[0]);
7402 if (matrix
->ts
.type
== BT_CHARACTER
)
7403 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
7404 else if (matrix
->ts
.type
== BT_DERIVED
)
7405 result
->ts
.u
.derived
= matrix
->ts
.u
.derived
;
7407 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
7408 matrix_cols
= mpz_get_si (matrix
->shape
[1]);
7409 for (row
= 0; row
< matrix_rows
; ++row
)
7410 for (col
= 0; col
< matrix_cols
; ++col
)
7412 gfc_expr
*e
= gfc_constructor_lookup_expr (matrix
->value
.constructor
,
7413 col
* matrix_rows
+ row
);
7414 gfc_constructor_insert_expr (&result
->value
.constructor
,
7415 gfc_copy_expr (e
), &matrix
->where
,
7416 row
* matrix_cols
+ col
);
7424 gfc_simplify_trim (gfc_expr
*e
)
7427 int count
, i
, len
, lentrim
;
7429 if (e
->expr_type
!= EXPR_CONSTANT
)
7432 len
= e
->value
.character
.length
;
7433 for (count
= 0, i
= 1; i
<= len
; ++i
)
7435 if (e
->value
.character
.string
[len
- i
] == ' ')
7441 lentrim
= len
- count
;
7443 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, lentrim
);
7444 for (i
= 0; i
< lentrim
; i
++)
7445 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
7452 gfc_simplify_image_index (gfc_expr
*coarray
, gfc_expr
*sub
)
7457 gfc_constructor
*sub_cons
;
7461 if (!is_constant_array_expr (sub
))
7464 /* Follow any component references. */
7465 as
= coarray
->symtree
->n
.sym
->as
;
7466 for (ref
= coarray
->ref
; ref
; ref
= ref
->next
)
7467 if (ref
->type
== REF_COMPONENT
)
7470 if (as
->type
== AS_DEFERRED
)
7473 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
7474 the cosubscript addresses the first image. */
7476 sub_cons
= gfc_constructor_first (sub
->value
.constructor
);
7479 for (d
= 1; d
<= as
->corank
; d
++)
7484 gcc_assert (sub_cons
!= NULL
);
7486 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 0, as
,
7488 if (ca_bound
== NULL
)
7491 if (ca_bound
== &gfc_bad_expr
)
7494 cmp
= mpz_cmp (ca_bound
->value
.integer
, sub_cons
->expr
->value
.integer
);
7498 gfc_free_expr (ca_bound
);
7499 sub_cons
= gfc_constructor_next (sub_cons
);
7503 first_image
= false;
7507 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
7508 "SUB has %ld and COARRAY lower bound is %ld)",
7510 mpz_get_si (sub_cons
->expr
->value
.integer
),
7511 mpz_get_si (ca_bound
->value
.integer
));
7512 gfc_free_expr (ca_bound
);
7513 return &gfc_bad_expr
;
7516 gfc_free_expr (ca_bound
);
7518 /* Check whether upperbound is valid for the multi-images case. */
7521 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 1, as
,
7523 if (ca_bound
== &gfc_bad_expr
)
7526 if (ca_bound
&& ca_bound
->expr_type
== EXPR_CONSTANT
7527 && mpz_cmp (ca_bound
->value
.integer
,
7528 sub_cons
->expr
->value
.integer
) < 0)
7530 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
7531 "SUB has %ld and COARRAY upper bound is %ld)",
7533 mpz_get_si (sub_cons
->expr
->value
.integer
),
7534 mpz_get_si (ca_bound
->value
.integer
));
7535 gfc_free_expr (ca_bound
);
7536 return &gfc_bad_expr
;
7540 gfc_free_expr (ca_bound
);
7543 sub_cons
= gfc_constructor_next (sub_cons
);
7546 gcc_assert (sub_cons
== NULL
);
7548 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
&& !first_image
)
7551 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
7552 &gfc_current_locus
);
7554 mpz_set_si (result
->value
.integer
, 1);
7556 mpz_set_si (result
->value
.integer
, 0);
7562 gfc_simplify_image_status (gfc_expr
*image
, gfc_expr
*team ATTRIBUTE_UNUSED
)
7564 if (flag_coarray
== GFC_FCOARRAY_NONE
)
7566 gfc_current_locus
= *gfc_current_intrinsic_where
;
7567 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
7568 return &gfc_bad_expr
;
7571 /* Simplification is possible for fcoarray = single only. For all other modes
7572 the result depends on runtime conditions. */
7573 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
7576 if (gfc_is_constant_expr (image
))
7579 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
7581 if (mpz_get_si (image
->value
.integer
) == 1)
7582 mpz_set_si (result
->value
.integer
, 0);
7584 mpz_set_si (result
->value
.integer
, GFC_STAT_STOPPED_IMAGE
);
7593 gfc_simplify_this_image (gfc_expr
*coarray
, gfc_expr
*dim
,
7594 gfc_expr
*distance ATTRIBUTE_UNUSED
)
7596 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
7599 /* If no coarray argument has been passed or when the first argument
7600 is actually a distance argment. */
7601 if (coarray
== NULL
|| !gfc_is_coarray (coarray
))
7604 /* FIXME: gfc_current_locus is wrong. */
7605 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
7606 &gfc_current_locus
);
7607 mpz_set_si (result
->value
.integer
, 1);
7611 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
7612 return simplify_cobound (coarray
, dim
, NULL
, 0);
7617 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
7619 return simplify_bound (array
, dim
, kind
, 1);
7623 gfc_simplify_ucobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
7625 return simplify_cobound (array
, dim
, kind
, 1);
7630 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
7632 gfc_expr
*result
, *e
;
7633 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
7635 if (!is_constant_array_expr (vector
)
7636 || !is_constant_array_expr (mask
)
7637 || (!gfc_is_constant_expr (field
)
7638 && !is_constant_array_expr (field
)))
7641 result
= gfc_get_array_expr (vector
->ts
.type
, vector
->ts
.kind
,
7643 if (vector
->ts
.type
== BT_DERIVED
)
7644 result
->ts
.u
.derived
= vector
->ts
.u
.derived
;
7645 result
->rank
= mask
->rank
;
7646 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
7648 if (vector
->ts
.type
== BT_CHARACTER
)
7649 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
7651 vector_ctor
= gfc_constructor_first (vector
->value
.constructor
);
7652 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
7654 = field
->expr_type
== EXPR_ARRAY
7655 ? gfc_constructor_first (field
->value
.constructor
)
7660 if (mask_ctor
->expr
->value
.logical
)
7662 gcc_assert (vector_ctor
);
7663 e
= gfc_copy_expr (vector_ctor
->expr
);
7664 vector_ctor
= gfc_constructor_next (vector_ctor
);
7666 else if (field
->expr_type
== EXPR_ARRAY
)
7667 e
= gfc_copy_expr (field_ctor
->expr
);
7669 e
= gfc_copy_expr (field
);
7671 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
7673 mask_ctor
= gfc_constructor_next (mask_ctor
);
7674 field_ctor
= gfc_constructor_next (field_ctor
);
7682 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
7686 size_t index
, len
, lenset
;
7688 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
7691 return &gfc_bad_expr
;
7693 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
7694 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
7697 if (b
!= NULL
&& b
->value
.logical
!= 0)
7702 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &s
->where
);
7704 len
= s
->value
.character
.length
;
7705 lenset
= set
->value
.character
.length
;
7709 mpz_set_ui (result
->value
.integer
, 0);
7717 mpz_set_ui (result
->value
.integer
, 1);
7721 index
= wide_strspn (s
->value
.character
.string
,
7722 set
->value
.character
.string
) + 1;
7731 mpz_set_ui (result
->value
.integer
, len
);
7734 for (index
= len
; index
> 0; index
--)
7736 for (i
= 0; i
< lenset
; i
++)
7738 if (s
->value
.character
.string
[index
- 1]
7739 == set
->value
.character
.string
[i
])
7747 mpz_set_ui (result
->value
.integer
, index
);
7753 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
7758 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
7761 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
7766 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
7767 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
7768 return range_check (result
, "XOR");
7771 return gfc_get_logical_expr (kind
, &x
->where
,
7772 (x
->value
.logical
&& !y
->value
.logical
)
7773 || (!x
->value
.logical
&& y
->value
.logical
));
7781 /****************** Constant simplification *****************/
7783 /* Master function to convert one constant to another. While this is
7784 used as a simplification function, it requires the destination type
7785 and kind information which is supplied by a special case in
7789 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
7791 gfc_expr
*g
, *result
, *(*f
) (gfc_expr
*, int);
7806 f
= gfc_int2complex
;
7826 f
= gfc_real2complex
;
7837 f
= gfc_complex2int
;
7840 f
= gfc_complex2real
;
7843 f
= gfc_complex2complex
;
7869 f
= gfc_hollerith2int
;
7873 f
= gfc_hollerith2real
;
7877 f
= gfc_hollerith2complex
;
7881 f
= gfc_hollerith2character
;
7885 f
= gfc_hollerith2logical
;
7894 if (type
== BT_CHARACTER
)
7895 f
= gfc_character2character
;
7902 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
7907 switch (e
->expr_type
)
7910 result
= f (e
, kind
);
7912 return &gfc_bad_expr
;
7916 if (!gfc_is_constant_expr (e
))
7919 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
7920 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
7921 result
->rank
= e
->rank
;
7923 for (c
= gfc_constructor_first (e
->value
.constructor
);
7924 c
; c
= gfc_constructor_next (c
))
7927 if (c
->iterator
== NULL
)
7928 tmp
= f (c
->expr
, kind
);
7931 g
= gfc_convert_constant (c
->expr
, type
, kind
);
7932 if (g
== &gfc_bad_expr
)
7934 gfc_free_expr (result
);
7942 gfc_free_expr (result
);
7946 gfc_constructor_append_expr (&result
->value
.constructor
,
7960 /* Function for converting character constants. */
7962 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
7967 if (!gfc_is_constant_expr (e
))
7970 if (e
->expr_type
== EXPR_CONSTANT
)
7972 /* Simple case of a scalar. */
7973 result
= gfc_get_constant_expr (BT_CHARACTER
, kind
, &e
->where
);
7975 return &gfc_bad_expr
;
7977 result
->value
.character
.length
= e
->value
.character
.length
;
7978 result
->value
.character
.string
7979 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
7980 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
7981 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
7983 /* Check we only have values representable in the destination kind. */
7984 for (i
= 0; i
< result
->value
.character
.length
; i
++)
7985 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
7988 gfc_error ("Character %qs in string at %L cannot be converted "
7989 "into character kind %d",
7990 gfc_print_wide_char (result
->value
.character
.string
[i
]),
7992 gfc_free_expr (result
);
7993 return &gfc_bad_expr
;
7998 else if (e
->expr_type
== EXPR_ARRAY
)
8000 /* For an array constructor, we convert each constructor element. */
8003 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
8004 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
8005 result
->rank
= e
->rank
;
8006 result
->ts
.u
.cl
= e
->ts
.u
.cl
;
8008 for (c
= gfc_constructor_first (e
->value
.constructor
);
8009 c
; c
= gfc_constructor_next (c
))
8011 gfc_expr
*tmp
= gfc_convert_char_constant (c
->expr
, type
, kind
);
8012 if (tmp
== &gfc_bad_expr
)
8014 gfc_free_expr (result
);
8015 return &gfc_bad_expr
;
8020 gfc_free_expr (result
);
8024 gfc_constructor_append_expr (&result
->value
.constructor
,
8036 gfc_simplify_compiler_options (void)
8041 str
= gfc_get_option_string ();
8042 result
= gfc_get_character_expr (gfc_default_character_kind
,
8043 &gfc_current_locus
, str
, strlen (str
));
8050 gfc_simplify_compiler_version (void)
8055 len
= strlen ("GCC version ") + strlen (version_string
);
8056 buffer
= XALLOCAVEC (char, len
+ 1);
8057 snprintf (buffer
, len
+ 1, "GCC version %s", version_string
);
8058 return gfc_get_character_expr (gfc_default_character_kind
,
8059 &gfc_current_locus
, buffer
, len
);
8062 /* Simplification routines for intrinsics of IEEE modules. */
8065 simplify_ieee_selected_real_kind (gfc_expr
*expr
)
8067 gfc_actual_arglist
*arg
;
8068 gfc_expr
*p
= NULL
, *q
= NULL
, *rdx
= NULL
;
8070 arg
= expr
->value
.function
.actual
;
8074 q
= arg
->next
->expr
;
8075 if (arg
->next
->next
)
8076 rdx
= arg
->next
->next
->expr
;
8079 /* Currently, if IEEE is supported and this module is built, it means
8080 all our floating-point types conform to IEEE. Hence, we simply handle
8081 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
8082 return gfc_simplify_selected_real_kind (p
, q
, rdx
);
8086 simplify_ieee_support (gfc_expr
*expr
)
8088 /* We consider that if the IEEE modules are loaded, we have full support
8089 for flags, halting and rounding, which are the three functions
8090 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
8091 expressions. One day, we will need libgfortran to detect support and
8092 communicate it back to us, allowing for partial support. */
8094 return gfc_get_logical_expr (gfc_default_logical_kind
, &expr
->where
,
8099 matches_ieee_function_name (gfc_symbol
*sym
, const char *name
)
8101 int n
= strlen(name
);
8103 if (!strncmp(sym
->name
, name
, n
))
8106 /* If a generic was used and renamed, we need more work to find out.
8107 Compare the specific name. */
8108 if (sym
->generic
&& !strncmp(sym
->generic
->sym
->name
, name
, n
))
8115 gfc_simplify_ieee_functions (gfc_expr
*expr
)
8117 gfc_symbol
* sym
= expr
->symtree
->n
.sym
;
8119 if (matches_ieee_function_name(sym
, "ieee_selected_real_kind"))
8120 return simplify_ieee_selected_real_kind (expr
);
8121 else if (matches_ieee_function_name(sym
, "ieee_support_flag")
8122 || matches_ieee_function_name(sym
, "ieee_support_halting")
8123 || matches_ieee_function_name(sym
, "ieee_support_rounding"))
8124 return simplify_ieee_support (expr
);