1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2013 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"
27 #include "intrinsic.h"
28 #include "target-memory.h"
29 #include "constructor.h"
30 #include "tm.h" /* For BITS_PER_UNIT. */
31 #include "version.h" /* For version_string. */
34 gfc_expr gfc_bad_expr
;
37 /* Note that 'simplification' is not just transforming expressions.
38 For functions that are not simplified at compile time, range
39 checking is done if possible.
41 The return convention is that each simplification function returns:
43 A new expression node corresponding to the simplified arguments.
44 The original arguments are destroyed by the caller, and must not
45 be a part of the new expression.
47 NULL pointer indicating that no simplification was possible and
48 the original expression should remain intact.
50 An expression pointer to gfc_bad_expr (a static placeholder)
51 indicating that some error has prevented simplification. The
52 error is generated within the function and should be propagated
55 By the time a simplification function gets control, it has been
56 decided that the function call is really supposed to be the
57 intrinsic. No type checking is strictly necessary, since only
58 valid types will be passed on. On the other hand, a simplification
59 subroutine may have to look at the type of an argument as part of
62 Array arguments are only passed to these subroutines that implement
63 the simplification of transformational intrinsics.
65 The functions in this file don't have much comment with them, but
66 everything is reasonably straight-forward. The Standard, chapter 13
67 is the best comment you'll find for this file anyway. */
69 /* Range checks an expression node. If all goes well, returns the
70 node, otherwise returns &gfc_bad_expr and frees the node. */
73 range_check (gfc_expr
*result
, const char *name
)
78 if (result
->expr_type
!= EXPR_CONSTANT
)
81 switch (gfc_range_check (result
))
87 gfc_error ("Result of %s overflows its kind at %L", name
,
92 gfc_error ("Result of %s underflows its kind at %L", name
,
97 gfc_error ("Result of %s is NaN at %L", name
, &result
->where
);
101 gfc_error ("Result of %s gives range error for its kind at %L", name
,
106 gfc_free_expr (result
);
107 return &gfc_bad_expr
;
111 /* A helper function that gets an optional and possibly missing
112 kind parameter. Returns the kind, -1 if something went wrong. */
115 get_kind (bt type
, gfc_expr
*k
, const char *name
, int default_kind
)
122 if (k
->expr_type
!= EXPR_CONSTANT
)
124 gfc_error ("KIND parameter of %s at %L must be an initialization "
125 "expression", name
, &k
->where
);
129 if (gfc_extract_int (k
, &kind
) != NULL
130 || gfc_validate_kind (type
, kind
, true) < 0)
132 gfc_error ("Invalid KIND parameter of %s at %L", name
, &k
->where
);
140 /* Converts an mpz_t signed variable into an unsigned one, assuming
141 two's complement representations and a binary width of bitsize.
142 The conversion is a no-op unless x is negative; otherwise, it can
143 be accomplished by masking out the high bits. */
146 convert_mpz_to_unsigned (mpz_t x
, int bitsize
)
152 /* Confirm that no bits above the signed range are unset. */
153 gcc_assert (mpz_scan0 (x
, bitsize
-1) == ULONG_MAX
);
155 mpz_init_set_ui (mask
, 1);
156 mpz_mul_2exp (mask
, mask
, bitsize
);
157 mpz_sub_ui (mask
, mask
, 1);
159 mpz_and (x
, x
, mask
);
165 /* Confirm that no bits above the signed range are set. */
166 gcc_assert (mpz_scan1 (x
, bitsize
-1) == ULONG_MAX
);
171 /* Converts an mpz_t unsigned variable into a signed one, assuming
172 two's complement representations and a binary width of bitsize.
173 If the bitsize-1 bit is set, this is taken as a sign bit and
174 the number is converted to the corresponding negative number. */
177 convert_mpz_to_signed (mpz_t x
, int bitsize
)
181 /* Confirm that no bits above the unsigned range are set. */
182 gcc_assert (mpz_scan1 (x
, bitsize
) == ULONG_MAX
);
184 if (mpz_tstbit (x
, bitsize
- 1) == 1)
186 mpz_init_set_ui (mask
, 1);
187 mpz_mul_2exp (mask
, mask
, bitsize
);
188 mpz_sub_ui (mask
, mask
, 1);
190 /* We negate the number by hand, zeroing the high bits, that is
191 make it the corresponding positive number, and then have it
192 negated by GMP, giving the correct representation of the
195 mpz_add_ui (x
, x
, 1);
196 mpz_and (x
, x
, mask
);
205 /* In-place convert BOZ to REAL of the specified kind. */
208 convert_boz (gfc_expr
*x
, int kind
)
210 if (x
&& x
->ts
.type
== BT_INTEGER
&& x
->is_boz
)
217 if (!gfc_convert_boz (x
, &ts
))
218 return &gfc_bad_expr
;
225 /* Test that the expression is an constant array. */
228 is_constant_array_expr (gfc_expr
*e
)
235 if (e
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (e
))
238 for (c
= gfc_constructor_first (e
->value
.constructor
);
239 c
; c
= gfc_constructor_next (c
))
240 if (c
->expr
->expr_type
!= EXPR_CONSTANT
241 && c
->expr
->expr_type
!= EXPR_STRUCTURE
)
248 /* Initialize a transformational result expression with a given value. */
251 init_result_expr (gfc_expr
*e
, int init
, gfc_expr
*array
)
253 if (e
&& e
->expr_type
== EXPR_ARRAY
)
255 gfc_constructor
*ctor
= gfc_constructor_first (e
->value
.constructor
);
258 init_result_expr (ctor
->expr
, init
, array
);
259 ctor
= gfc_constructor_next (ctor
);
262 else if (e
&& e
->expr_type
== EXPR_CONSTANT
)
264 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
271 e
->value
.logical
= (init
? 1 : 0);
276 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].min_int
);
277 else if (init
== INT_MAX
)
278 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].huge
);
280 mpz_set_si (e
->value
.integer
, init
);
286 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
287 mpfr_neg (e
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
289 else if (init
== INT_MAX
)
290 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
292 mpfr_set_si (e
->value
.real
, init
, GFC_RND_MODE
);
296 mpc_set_si (e
->value
.complex, init
, GFC_MPC_RND_MODE
);
302 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
303 gfc_extract_int (len
, &length
);
304 string
= gfc_get_wide_string (length
+ 1);
305 gfc_wide_memset (string
, 0, length
);
307 else if (init
== INT_MAX
)
309 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
310 gfc_extract_int (len
, &length
);
311 string
= gfc_get_wide_string (length
+ 1);
312 gfc_wide_memset (string
, 255, length
);
317 string
= gfc_get_wide_string (1);
320 string
[length
] = '\0';
321 e
->value
.character
.length
= length
;
322 e
->value
.character
.string
= string
;
334 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul. */
337 compute_dot_product (gfc_expr
*matrix_a
, int stride_a
, int offset_a
,
338 gfc_expr
*matrix_b
, int stride_b
, int offset_b
)
340 gfc_expr
*result
, *a
, *b
;
342 result
= gfc_get_constant_expr (matrix_a
->ts
.type
, matrix_a
->ts
.kind
,
344 init_result_expr (result
, 0, NULL
);
346 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
347 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
350 /* Copying of expressions is required as operands are free'd
351 by the gfc_arith routines. */
352 switch (result
->ts
.type
)
355 result
= gfc_or (result
,
356 gfc_and (gfc_copy_expr (a
),
363 result
= gfc_add (result
,
364 gfc_multiply (gfc_copy_expr (a
),
372 offset_a
+= stride_a
;
373 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
375 offset_b
+= stride_b
;
376 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
383 /* Build a result expression for transformational intrinsics,
387 transformational_result (gfc_expr
*array
, gfc_expr
*dim
, bt type
,
388 int kind
, locus
* where
)
393 if (!dim
|| array
->rank
== 1)
394 return gfc_get_constant_expr (type
, kind
, where
);
396 result
= gfc_get_array_expr (type
, kind
, where
);
397 result
->shape
= gfc_copy_shape_excluding (array
->shape
, array
->rank
, dim
);
398 result
->rank
= array
->rank
- 1;
400 /* gfc_array_size() would count the number of elements in the constructor,
401 we have not built those yet. */
403 for (i
= 0; i
< result
->rank
; ++i
)
404 nelem
*= mpz_get_ui (result
->shape
[i
]);
406 for (i
= 0; i
< nelem
; ++i
)
408 gfc_constructor_append_expr (&result
->value
.constructor
,
409 gfc_get_constant_expr (type
, kind
, where
),
417 typedef gfc_expr
* (*transformational_op
)(gfc_expr
*, gfc_expr
*);
419 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
420 of COUNT intrinsic is .TRUE..
422 Interface and implementation mimics arith functions as
423 gfc_add, gfc_multiply, etc. */
425 static gfc_expr
* gfc_count (gfc_expr
*op1
, gfc_expr
*op2
)
429 gcc_assert (op1
->ts
.type
== BT_INTEGER
);
430 gcc_assert (op2
->ts
.type
== BT_LOGICAL
);
431 gcc_assert (op2
->value
.logical
);
433 result
= gfc_copy_expr (op1
);
434 mpz_add_ui (result
->value
.integer
, result
->value
.integer
, 1);
442 /* Transforms an ARRAY with operation OP, according to MASK, to a
443 scalar RESULT. E.g. called if
445 REAL, PARAMETER :: array(n, m) = ...
446 REAL, PARAMETER :: s = SUM(array)
448 where OP == gfc_add(). */
451 simplify_transformation_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
452 transformational_op op
)
455 gfc_constructor
*array_ctor
, *mask_ctor
;
457 /* Shortcut for constant .FALSE. MASK. */
459 && mask
->expr_type
== EXPR_CONSTANT
460 && !mask
->value
.logical
)
463 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
465 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
466 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
470 a
= array_ctor
->expr
;
471 array_ctor
= gfc_constructor_next (array_ctor
);
473 /* A constant MASK equals .TRUE. here and can be ignored. */
477 mask_ctor
= gfc_constructor_next (mask_ctor
);
478 if (!m
->value
.logical
)
482 result
= op (result
, gfc_copy_expr (a
));
488 /* Transforms an ARRAY with operation OP, according to MASK, to an
489 array RESULT. E.g. called if
491 REAL, PARAMETER :: array(n, m) = ...
492 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
494 where OP == gfc_multiply(). The result might be post processed using post_op. */
497 simplify_transformation_to_array (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*dim
,
498 gfc_expr
*mask
, transformational_op op
,
499 transformational_op post_op
)
502 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
503 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
504 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
506 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
507 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
508 tmpstride
[GFC_MAX_DIMENSIONS
];
510 /* Shortcut for constant .FALSE. MASK. */
512 && mask
->expr_type
== EXPR_CONSTANT
513 && !mask
->value
.logical
)
516 /* Build an indexed table for array element expressions to minimize
517 linked-list traversal. Masked elements are set to NULL. */
518 gfc_array_size (array
, &size
);
519 arraysize
= mpz_get_ui (size
);
522 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
524 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
526 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
527 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
529 for (i
= 0; i
< arraysize
; ++i
)
531 arrayvec
[i
] = array_ctor
->expr
;
532 array_ctor
= gfc_constructor_next (array_ctor
);
536 if (!mask_ctor
->expr
->value
.logical
)
539 mask_ctor
= gfc_constructor_next (mask_ctor
);
543 /* Same for the result expression. */
544 gfc_array_size (result
, &size
);
545 resultsize
= mpz_get_ui (size
);
548 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
549 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
550 for (i
= 0; i
< resultsize
; ++i
)
552 resultvec
[i
] = result_ctor
->expr
;
553 result_ctor
= gfc_constructor_next (result_ctor
);
556 gfc_extract_int (dim
, &dim_index
);
557 dim_index
-= 1; /* zero-base index */
561 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
564 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
567 dim_extent
= mpz_get_si (array
->shape
[i
]);
568 dim_stride
= tmpstride
[i
];
572 extent
[n
] = mpz_get_si (array
->shape
[i
]);
573 sstride
[n
] = tmpstride
[i
];
574 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
583 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
585 *dest
= op (*dest
, gfc_copy_expr (*src
));
592 while (!done
&& count
[n
] == extent
[n
])
595 base
-= sstride
[n
] * extent
[n
];
596 dest
-= dstride
[n
] * extent
[n
];
599 if (n
< result
->rank
)
610 /* Place updated expression in result constructor. */
611 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
612 for (i
= 0; i
< resultsize
; ++i
)
615 result_ctor
->expr
= post_op (result_ctor
->expr
, resultvec
[i
]);
617 result_ctor
->expr
= resultvec
[i
];
618 result_ctor
= gfc_constructor_next (result_ctor
);
628 simplify_transformation (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
629 int init_val
, transformational_op op
)
633 if (!is_constant_array_expr (array
)
634 || !gfc_is_constant_expr (dim
))
638 && !is_constant_array_expr (mask
)
639 && mask
->expr_type
!= EXPR_CONSTANT
)
642 result
= transformational_result (array
, dim
, array
->ts
.type
,
643 array
->ts
.kind
, &array
->where
);
644 init_result_expr (result
, init_val
, NULL
);
646 return !dim
|| array
->rank
== 1 ?
647 simplify_transformation_to_scalar (result
, array
, mask
, op
) :
648 simplify_transformation_to_array (result
, array
, dim
, mask
, op
, NULL
);
652 /********************** Simplification functions *****************************/
655 gfc_simplify_abs (gfc_expr
*e
)
659 if (e
->expr_type
!= EXPR_CONSTANT
)
665 result
= gfc_get_constant_expr (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
666 mpz_abs (result
->value
.integer
, e
->value
.integer
);
667 return range_check (result
, "IABS");
670 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
671 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
672 return range_check (result
, "ABS");
675 gfc_set_model_kind (e
->ts
.kind
);
676 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
677 mpc_abs (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
678 return range_check (result
, "CABS");
681 gfc_internal_error ("gfc_simplify_abs(): Bad type");
687 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
691 bool too_large
= false;
693 if (e
->expr_type
!= EXPR_CONSTANT
)
696 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
698 return &gfc_bad_expr
;
700 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
702 gfc_error ("Argument of %s function at %L is negative", name
,
704 return &gfc_bad_expr
;
707 if (ascii
&& gfc_option
.warn_surprising
708 && mpz_cmp_si (e
->value
.integer
, 127) > 0)
709 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
712 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
717 mpz_init_set_ui (t
, 2);
718 mpz_pow_ui (t
, t
, 32);
719 mpz_sub_ui (t
, t
, 1);
720 if (mpz_cmp (e
->value
.integer
, t
) > 0)
727 gfc_error ("Argument of %s function at %L is too large for the "
728 "collating sequence of kind %d", name
, &e
->where
, kind
);
729 return &gfc_bad_expr
;
732 result
= gfc_get_character_expr (kind
, &e
->where
, NULL
, 1);
733 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
740 /* We use the processor's collating sequence, because all
741 systems that gfortran currently works on are ASCII. */
744 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
746 return simplify_achar_char (e
, k
, "ACHAR", true);
751 gfc_simplify_acos (gfc_expr
*x
)
755 if (x
->expr_type
!= EXPR_CONSTANT
)
761 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
762 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
764 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
766 return &gfc_bad_expr
;
768 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
769 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
773 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
774 mpc_acos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
778 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
781 return range_check (result
, "ACOS");
785 gfc_simplify_acosh (gfc_expr
*x
)
789 if (x
->expr_type
!= EXPR_CONSTANT
)
795 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
797 gfc_error ("Argument of ACOSH at %L must not be less than 1",
799 return &gfc_bad_expr
;
802 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
803 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
807 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
808 mpc_acosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
812 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
815 return range_check (result
, "ACOSH");
819 gfc_simplify_adjustl (gfc_expr
*e
)
825 if (e
->expr_type
!= EXPR_CONSTANT
)
828 len
= e
->value
.character
.length
;
830 for (count
= 0, i
= 0; i
< len
; ++i
)
832 ch
= e
->value
.character
.string
[i
];
838 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
839 for (i
= 0; i
< len
- count
; ++i
)
840 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
847 gfc_simplify_adjustr (gfc_expr
*e
)
853 if (e
->expr_type
!= EXPR_CONSTANT
)
856 len
= e
->value
.character
.length
;
858 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
860 ch
= e
->value
.character
.string
[i
];
866 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
867 for (i
= 0; i
< count
; ++i
)
868 result
->value
.character
.string
[i
] = ' ';
870 for (i
= count
; i
< len
; ++i
)
871 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
878 gfc_simplify_aimag (gfc_expr
*e
)
882 if (e
->expr_type
!= EXPR_CONSTANT
)
885 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
886 mpfr_set (result
->value
.real
, mpc_imagref (e
->value
.complex), GFC_RND_MODE
);
888 return range_check (result
, "AIMAG");
893 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
895 gfc_expr
*rtrunc
, *result
;
898 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
900 return &gfc_bad_expr
;
902 if (e
->expr_type
!= EXPR_CONSTANT
)
905 rtrunc
= gfc_copy_expr (e
);
906 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
908 result
= gfc_real2real (rtrunc
, kind
);
910 gfc_free_expr (rtrunc
);
912 return range_check (result
, "AINT");
917 gfc_simplify_all (gfc_expr
*mask
, gfc_expr
*dim
)
919 return simplify_transformation (mask
, dim
, NULL
, true, gfc_and
);
924 gfc_simplify_dint (gfc_expr
*e
)
926 gfc_expr
*rtrunc
, *result
;
928 if (e
->expr_type
!= EXPR_CONSTANT
)
931 rtrunc
= gfc_copy_expr (e
);
932 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
934 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
936 gfc_free_expr (rtrunc
);
938 return range_check (result
, "DINT");
943 gfc_simplify_dreal (gfc_expr
*e
)
945 gfc_expr
*result
= NULL
;
947 if (e
->expr_type
!= EXPR_CONSTANT
)
950 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
951 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
953 return range_check (result
, "DREAL");
958 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
963 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
965 return &gfc_bad_expr
;
967 if (e
->expr_type
!= EXPR_CONSTANT
)
970 result
= gfc_get_constant_expr (e
->ts
.type
, kind
, &e
->where
);
971 mpfr_round (result
->value
.real
, e
->value
.real
);
973 return range_check (result
, "ANINT");
978 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
983 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
986 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
991 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
992 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
993 return range_check (result
, "AND");
996 return gfc_get_logical_expr (kind
, &x
->where
,
997 x
->value
.logical
&& y
->value
.logical
);
1006 gfc_simplify_any (gfc_expr
*mask
, gfc_expr
*dim
)
1008 return simplify_transformation (mask
, dim
, NULL
, false, gfc_or
);
1013 gfc_simplify_dnint (gfc_expr
*e
)
1017 if (e
->expr_type
!= EXPR_CONSTANT
)
1020 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &e
->where
);
1021 mpfr_round (result
->value
.real
, e
->value
.real
);
1023 return range_check (result
, "DNINT");
1028 gfc_simplify_asin (gfc_expr
*x
)
1032 if (x
->expr_type
!= EXPR_CONSTANT
)
1038 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1039 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1041 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1043 return &gfc_bad_expr
;
1045 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1046 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1050 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1051 mpc_asin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1055 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1058 return range_check (result
, "ASIN");
1063 gfc_simplify_asinh (gfc_expr
*x
)
1067 if (x
->expr_type
!= EXPR_CONSTANT
)
1070 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1075 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1079 mpc_asinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1083 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1086 return range_check (result
, "ASINH");
1091 gfc_simplify_atan (gfc_expr
*x
)
1095 if (x
->expr_type
!= EXPR_CONSTANT
)
1098 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1103 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1107 mpc_atan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1111 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1114 return range_check (result
, "ATAN");
1119 gfc_simplify_atanh (gfc_expr
*x
)
1123 if (x
->expr_type
!= EXPR_CONSTANT
)
1129 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
1130 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
1132 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1134 return &gfc_bad_expr
;
1136 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1137 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1141 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1142 mpc_atanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1146 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1149 return range_check (result
, "ATANH");
1154 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
1158 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1161 if (mpfr_sgn (y
->value
.real
) == 0 && mpfr_sgn (x
->value
.real
) == 0)
1163 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1164 "second argument must not be zero", &x
->where
);
1165 return &gfc_bad_expr
;
1168 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1169 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1171 return range_check (result
, "ATAN2");
1176 gfc_simplify_bessel_j0 (gfc_expr
*x
)
1180 if (x
->expr_type
!= EXPR_CONSTANT
)
1183 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1184 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1186 return range_check (result
, "BESSEL_J0");
1191 gfc_simplify_bessel_j1 (gfc_expr
*x
)
1195 if (x
->expr_type
!= EXPR_CONSTANT
)
1198 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1199 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1201 return range_check (result
, "BESSEL_J1");
1206 gfc_simplify_bessel_jn (gfc_expr
*order
, gfc_expr
*x
)
1211 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1214 n
= mpz_get_si (order
->value
.integer
);
1215 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1216 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1218 return range_check (result
, "BESSEL_JN");
1222 /* Simplify transformational form of JN and YN. */
1225 gfc_simplify_bessel_n2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
,
1232 mpfr_t x2rev
, last1
, last2
;
1234 if (x
->expr_type
!= EXPR_CONSTANT
|| order1
->expr_type
!= EXPR_CONSTANT
1235 || order2
->expr_type
!= EXPR_CONSTANT
)
1238 n1
= mpz_get_si (order1
->value
.integer
);
1239 n2
= mpz_get_si (order2
->value
.integer
);
1240 result
= gfc_get_array_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1242 result
->shape
= gfc_get_shape (1);
1243 mpz_init_set_ui (result
->shape
[0], MAX (n2
-n1
+1, 0));
1248 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1249 YN(N, 0.0) = -Inf. */
1251 if (mpfr_cmp_ui (x
->value
.real
, 0.0) == 0)
1253 if (!jn
&& gfc_option
.flag_range_check
)
1255 gfc_error ("Result of BESSEL_YN is -INF at %L", &result
->where
);
1256 gfc_free_expr (result
);
1257 return &gfc_bad_expr
;
1262 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1263 mpfr_set_ui (e
->value
.real
, 1, GFC_RND_MODE
);
1264 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1269 for (i
= n1
; i
<= n2
; i
++)
1271 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1273 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
1275 mpfr_set_inf (e
->value
.real
, -1);
1276 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1283 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1284 are stable for downward recursion and Neumann functions are stable
1285 for upward recursion. It is
1287 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1288 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1289 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1291 gfc_set_model_kind (x
->ts
.kind
);
1293 /* Get first recursion anchor. */
1297 mpfr_jn (last1
, n2
, x
->value
.real
, GFC_RND_MODE
);
1299 mpfr_yn (last1
, n1
, x
->value
.real
, GFC_RND_MODE
);
1301 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1302 mpfr_set (e
->value
.real
, last1
, GFC_RND_MODE
);
1303 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1307 gfc_free_expr (result
);
1308 return &gfc_bad_expr
;
1310 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1318 /* Get second recursion anchor. */
1322 mpfr_jn (last2
, n2
-1, x
->value
.real
, GFC_RND_MODE
);
1324 mpfr_yn (last2
, n1
+1, x
->value
.real
, GFC_RND_MODE
);
1326 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1327 mpfr_set (e
->value
.real
, last2
, GFC_RND_MODE
);
1328 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1333 gfc_free_expr (result
);
1334 return &gfc_bad_expr
;
1337 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
, -2);
1339 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1348 /* Start actual recursion. */
1351 mpfr_ui_div (x2rev
, 2, x
->value
.real
, GFC_RND_MODE
);
1353 for (i
= 2; i
<= n2
-n1
; i
++)
1355 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1357 /* Special case: For YN, if the previous N gave -INF, set
1358 also N+1 to -INF. */
1359 if (!jn
&& !gfc_option
.flag_range_check
&& mpfr_inf_p (last2
))
1361 mpfr_set_inf (e
->value
.real
, -1);
1362 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1367 mpfr_mul_si (e
->value
.real
, x2rev
, jn
? (n2
-i
+1) : (n1
+i
-1),
1369 mpfr_mul (e
->value
.real
, e
->value
.real
, last2
, GFC_RND_MODE
);
1370 mpfr_sub (e
->value
.real
, e
->value
.real
, last1
, GFC_RND_MODE
);
1372 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1374 /* Range_check frees "e" in that case. */
1380 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
,
1383 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1385 mpfr_set (last1
, last2
, GFC_RND_MODE
);
1386 mpfr_set (last2
, e
->value
.real
, GFC_RND_MODE
);
1399 gfc_free_expr (result
);
1400 return &gfc_bad_expr
;
1405 gfc_simplify_bessel_jn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1407 return gfc_simplify_bessel_n2 (order1
, order2
, x
, true);
1412 gfc_simplify_bessel_y0 (gfc_expr
*x
)
1416 if (x
->expr_type
!= EXPR_CONSTANT
)
1419 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1420 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1422 return range_check (result
, "BESSEL_Y0");
1427 gfc_simplify_bessel_y1 (gfc_expr
*x
)
1431 if (x
->expr_type
!= EXPR_CONSTANT
)
1434 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1435 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1437 return range_check (result
, "BESSEL_Y1");
1442 gfc_simplify_bessel_yn (gfc_expr
*order
, gfc_expr
*x
)
1447 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1450 n
= mpz_get_si (order
->value
.integer
);
1451 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1452 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1454 return range_check (result
, "BESSEL_YN");
1459 gfc_simplify_bessel_yn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1461 return gfc_simplify_bessel_n2 (order1
, order2
, x
, false);
1466 gfc_simplify_bit_size (gfc_expr
*e
)
1468 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1469 return gfc_get_int_expr (e
->ts
.kind
, &e
->where
,
1470 gfc_integer_kinds
[i
].bit_size
);
1475 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
1479 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
1482 if (gfc_extract_int (bit
, &b
) != NULL
|| b
< 0)
1483 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
, false);
1485 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
,
1486 mpz_tstbit (e
->value
.integer
, b
));
1491 compare_bitwise (gfc_expr
*i
, gfc_expr
*j
)
1496 gcc_assert (i
->ts
.type
== BT_INTEGER
);
1497 gcc_assert (j
->ts
.type
== BT_INTEGER
);
1499 mpz_init_set (x
, i
->value
.integer
);
1500 k
= gfc_validate_kind (i
->ts
.type
, i
->ts
.kind
, false);
1501 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
1503 mpz_init_set (y
, j
->value
.integer
);
1504 k
= gfc_validate_kind (j
->ts
.type
, j
->ts
.kind
, false);
1505 convert_mpz_to_unsigned (y
, gfc_integer_kinds
[k
].bit_size
);
1507 res
= mpz_cmp (x
, y
);
1515 gfc_simplify_bge (gfc_expr
*i
, gfc_expr
*j
)
1517 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1520 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1521 compare_bitwise (i
, j
) >= 0);
1526 gfc_simplify_bgt (gfc_expr
*i
, gfc_expr
*j
)
1528 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1531 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1532 compare_bitwise (i
, j
) > 0);
1537 gfc_simplify_ble (gfc_expr
*i
, gfc_expr
*j
)
1539 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1542 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1543 compare_bitwise (i
, j
) <= 0);
1548 gfc_simplify_blt (gfc_expr
*i
, gfc_expr
*j
)
1550 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1553 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1554 compare_bitwise (i
, j
) < 0);
1559 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
1561 gfc_expr
*ceil
, *result
;
1564 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
1566 return &gfc_bad_expr
;
1568 if (e
->expr_type
!= EXPR_CONSTANT
)
1571 ceil
= gfc_copy_expr (e
);
1572 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
1574 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
1575 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
, &e
->where
);
1577 gfc_free_expr (ceil
);
1579 return range_check (result
, "CEILING");
1584 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
1586 return simplify_achar_char (e
, k
, "CHAR", false);
1590 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1593 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
1597 if (convert_boz (x
, kind
) == &gfc_bad_expr
)
1598 return &gfc_bad_expr
;
1600 if (convert_boz (y
, kind
) == &gfc_bad_expr
)
1601 return &gfc_bad_expr
;
1603 if (x
->expr_type
!= EXPR_CONSTANT
1604 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1607 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &x
->where
);
1612 mpc_set_z (result
->value
.complex, x
->value
.integer
, GFC_MPC_RND_MODE
);
1616 mpc_set_fr (result
->value
.complex, x
->value
.real
, GFC_RND_MODE
);
1620 mpc_set (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1624 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1628 return range_check (result
, name
);
1633 mpfr_set_z (mpc_imagref (result
->value
.complex),
1634 y
->value
.integer
, GFC_RND_MODE
);
1638 mpfr_set (mpc_imagref (result
->value
.complex),
1639 y
->value
.real
, GFC_RND_MODE
);
1643 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1646 return range_check (result
, name
);
1651 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
1655 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_complex_kind
);
1657 return &gfc_bad_expr
;
1659 return simplify_cmplx ("CMPLX", x
, y
, kind
);
1664 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
1668 if (x
->ts
.type
== BT_INTEGER
&& y
->ts
.type
== BT_INTEGER
)
1669 kind
= gfc_default_complex_kind
;
1670 else if (x
->ts
.type
== BT_REAL
|| y
->ts
.type
== BT_INTEGER
)
1672 else if (x
->ts
.type
== BT_INTEGER
|| y
->ts
.type
== BT_REAL
)
1674 else if (x
->ts
.type
== BT_REAL
&& y
->ts
.type
== BT_REAL
)
1675 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
1679 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
1684 gfc_simplify_conjg (gfc_expr
*e
)
1688 if (e
->expr_type
!= EXPR_CONSTANT
)
1691 result
= gfc_copy_expr (e
);
1692 mpc_conj (result
->value
.complex, result
->value
.complex, GFC_MPC_RND_MODE
);
1694 return range_check (result
, "CONJG");
1699 gfc_simplify_cos (gfc_expr
*x
)
1703 if (x
->expr_type
!= EXPR_CONSTANT
)
1706 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1711 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1715 gfc_set_model_kind (x
->ts
.kind
);
1716 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1720 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1723 return range_check (result
, "COS");
1728 gfc_simplify_cosh (gfc_expr
*x
)
1732 if (x
->expr_type
!= EXPR_CONSTANT
)
1735 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1740 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1744 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1751 return range_check (result
, "COSH");
1756 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
1760 if (!is_constant_array_expr (mask
)
1761 || !gfc_is_constant_expr (dim
)
1762 || !gfc_is_constant_expr (kind
))
1765 result
= transformational_result (mask
, dim
,
1767 get_kind (BT_INTEGER
, kind
, "COUNT",
1768 gfc_default_integer_kind
),
1771 init_result_expr (result
, 0, NULL
);
1773 /* Passing MASK twice, once as data array, once as mask.
1774 Whenever gfc_count is called, '1' is added to the result. */
1775 return !dim
|| mask
->rank
== 1 ?
1776 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
1777 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
, NULL
);
1782 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
1784 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
1789 gfc_simplify_dble (gfc_expr
*e
)
1791 gfc_expr
*result
= NULL
;
1793 if (e
->expr_type
!= EXPR_CONSTANT
)
1796 if (convert_boz (e
, gfc_default_double_kind
) == &gfc_bad_expr
)
1797 return &gfc_bad_expr
;
1799 result
= gfc_convert_constant (e
, BT_REAL
, gfc_default_double_kind
);
1800 if (result
== &gfc_bad_expr
)
1801 return &gfc_bad_expr
;
1803 return range_check (result
, "DBLE");
1808 gfc_simplify_digits (gfc_expr
*x
)
1812 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
1817 digits
= gfc_integer_kinds
[i
].digits
;
1822 digits
= gfc_real_kinds
[i
].digits
;
1829 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, digits
);
1834 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
1839 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1842 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1843 result
= gfc_get_constant_expr (x
->ts
.type
, kind
, &x
->where
);
1848 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
1849 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1851 mpz_set_ui (result
->value
.integer
, 0);
1856 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
1857 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
1860 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
1865 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1868 return range_check (result
, "DIM");
1873 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
1875 if (!is_constant_array_expr (vector_a
)
1876 || !is_constant_array_expr (vector_b
))
1879 gcc_assert (vector_a
->rank
== 1);
1880 gcc_assert (vector_b
->rank
== 1);
1881 gcc_assert (gfc_compare_types (&vector_a
->ts
, &vector_b
->ts
));
1883 return compute_dot_product (vector_a
, 1, 0, vector_b
, 1, 0);
1888 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
1890 gfc_expr
*a1
, *a2
, *result
;
1892 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1895 a1
= gfc_real2real (x
, gfc_default_double_kind
);
1896 a2
= gfc_real2real (y
, gfc_default_double_kind
);
1898 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &x
->where
);
1899 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
1904 return range_check (result
, "DPROD");
1909 simplify_dshift (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
,
1913 int i
, k
, size
, shift
;
1915 if (arg1
->expr_type
!= EXPR_CONSTANT
|| arg2
->expr_type
!= EXPR_CONSTANT
1916 || shiftarg
->expr_type
!= EXPR_CONSTANT
)
1919 k
= gfc_validate_kind (BT_INTEGER
, arg1
->ts
.kind
, false);
1920 size
= gfc_integer_kinds
[k
].bit_size
;
1922 gfc_extract_int (shiftarg
, &shift
);
1924 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
1926 shift
= size
- shift
;
1928 result
= gfc_get_constant_expr (BT_INTEGER
, arg1
->ts
.kind
, &arg1
->where
);
1929 mpz_set_ui (result
->value
.integer
, 0);
1931 for (i
= 0; i
< shift
; i
++)
1932 if (mpz_tstbit (arg2
->value
.integer
, size
- shift
+ i
))
1933 mpz_setbit (result
->value
.integer
, i
);
1935 for (i
= 0; i
< size
- shift
; i
++)
1936 if (mpz_tstbit (arg1
->value
.integer
, i
))
1937 mpz_setbit (result
->value
.integer
, shift
+ i
);
1939 /* Convert to a signed value. */
1940 convert_mpz_to_signed (result
->value
.integer
, size
);
1947 gfc_simplify_dshiftr (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
1949 return simplify_dshift (arg1
, arg2
, shiftarg
, true);
1954 gfc_simplify_dshiftl (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
1956 return simplify_dshift (arg1
, arg2
, shiftarg
, false);
1961 gfc_simplify_erf (gfc_expr
*x
)
1965 if (x
->expr_type
!= EXPR_CONSTANT
)
1968 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1969 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1971 return range_check (result
, "ERF");
1976 gfc_simplify_erfc (gfc_expr
*x
)
1980 if (x
->expr_type
!= EXPR_CONSTANT
)
1983 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1984 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1986 return range_check (result
, "ERFC");
1990 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
1992 #define MAX_ITER 200
1993 #define ARG_LIMIT 12
1995 /* Calculate ERFC_SCALED directly by its definition:
1997 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
1999 using a large precision for intermediate results. This is used for all
2000 but large values of the argument. */
2002 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2007 prec
= mpfr_get_default_prec ();
2008 mpfr_set_default_prec (10 * prec
);
2013 mpfr_set (a
, arg
, GFC_RND_MODE
);
2014 mpfr_sqr (b
, a
, GFC_RND_MODE
);
2015 mpfr_exp (b
, b
, GFC_RND_MODE
);
2016 mpfr_erfc (a
, a
, GFC_RND_MODE
);
2017 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
2019 mpfr_set (res
, a
, GFC_RND_MODE
);
2020 mpfr_set_default_prec (prec
);
2026 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2028 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2029 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2032 This is used for large values of the argument. Intermediate calculations
2033 are performed with twice the precision. We don't do a fixed number of
2034 iterations of the sum, but stop when it has converged to the required
2037 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2039 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
2044 prec
= mpfr_get_default_prec ();
2045 mpfr_set_default_prec (2 * prec
);
2055 mpfr_init (sumtrunc
);
2056 mpfr_set_prec (oldsum
, prec
);
2057 mpfr_set_prec (sumtrunc
, prec
);
2059 mpfr_set (x
, arg
, GFC_RND_MODE
);
2060 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
2061 mpz_set_ui (num
, 1);
2063 mpfr_set (u
, x
, GFC_RND_MODE
);
2064 mpfr_sqr (u
, u
, GFC_RND_MODE
);
2065 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
2066 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
2068 for (i
= 1; i
< MAX_ITER
; i
++)
2070 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
2072 mpz_mul_ui (num
, num
, 2 * i
- 1);
2075 mpfr_set (w
, u
, GFC_RND_MODE
);
2076 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
2078 mpfr_set_z (v
, num
, GFC_RND_MODE
);
2079 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
2081 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
2083 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
2084 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
2088 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2090 gcc_assert (i
< MAX_ITER
);
2092 /* Divide by x * sqrt(Pi). */
2093 mpfr_const_pi (u
, GFC_RND_MODE
);
2094 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
2095 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
2096 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
2098 mpfr_set (res
, sum
, GFC_RND_MODE
);
2099 mpfr_set_default_prec (prec
);
2101 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
2107 gfc_simplify_erfc_scaled (gfc_expr
*x
)
2111 if (x
->expr_type
!= EXPR_CONSTANT
)
2114 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2115 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
2116 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
2118 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
2120 return range_check (result
, "ERFC_SCALED");
2128 gfc_simplify_epsilon (gfc_expr
*e
)
2133 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2135 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
2136 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
2138 return range_check (result
, "EPSILON");
2143 gfc_simplify_exp (gfc_expr
*x
)
2147 if (x
->expr_type
!= EXPR_CONSTANT
)
2150 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2155 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2159 gfc_set_model_kind (x
->ts
.kind
);
2160 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
2164 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2167 return range_check (result
, "EXP");
2172 gfc_simplify_exponent (gfc_expr
*x
)
2177 if (x
->expr_type
!= EXPR_CONSTANT
)
2180 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2183 gfc_set_model (x
->value
.real
);
2185 if (mpfr_sgn (x
->value
.real
) == 0)
2187 mpz_set_ui (result
->value
.integer
, 0);
2191 i
= (int) mpfr_get_exp (x
->value
.real
);
2192 mpz_set_si (result
->value
.integer
, i
);
2194 return range_check (result
, "EXPONENT");
2199 gfc_simplify_float (gfc_expr
*a
)
2203 if (a
->expr_type
!= EXPR_CONSTANT
)
2208 if (convert_boz (a
, gfc_default_real_kind
) == &gfc_bad_expr
)
2209 return &gfc_bad_expr
;
2211 result
= gfc_copy_expr (a
);
2214 result
= gfc_int2real (a
, gfc_default_real_kind
);
2216 return range_check (result
, "FLOAT");
2221 is_last_ref_vtab (gfc_expr
*e
)
2224 gfc_component
*comp
= NULL
;
2226 if (e
->expr_type
!= EXPR_VARIABLE
)
2229 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
2230 if (ref
->type
== REF_COMPONENT
)
2231 comp
= ref
->u
.c
.component
;
2233 if (!e
->ref
|| !comp
)
2234 return e
->symtree
->n
.sym
->attr
.vtab
;
2236 if (comp
->name
[0] == '_' && strcmp (comp
->name
, "_vptr") == 0)
2244 gfc_simplify_extends_type_of (gfc_expr
*a
, gfc_expr
*mold
)
2246 /* Avoid simplification of resolved symbols. */
2247 if (is_last_ref_vtab (a
) || is_last_ref_vtab (mold
))
2250 if (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_DERIVED
)
2251 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2252 gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2255 if (UNLIMITED_POLY (a
) || UNLIMITED_POLY (mold
))
2258 /* Return .false. if the dynamic type can never be the same. */
2259 if ((a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_CLASS
2260 && !gfc_type_is_extension_of
2261 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2262 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2263 && !gfc_type_is_extension_of
2264 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2265 mold
->ts
.u
.derived
->components
->ts
.u
.derived
))
2266 || (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_CLASS
2267 && !gfc_type_is_extension_of
2269 mold
->ts
.u
.derived
->components
->ts
.u
.derived
)
2270 && !gfc_type_is_extension_of
2271 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2273 || (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2274 && !gfc_type_is_extension_of
2275 (mold
->ts
.u
.derived
,
2276 a
->ts
.u
.derived
->components
->ts
.u
.derived
)))
2277 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2279 if (mold
->ts
.type
== BT_DERIVED
2280 && gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2281 a
->ts
.u
.derived
->components
->ts
.u
.derived
))
2282 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, true);
2289 gfc_simplify_same_type_as (gfc_expr
*a
, gfc_expr
*b
)
2291 /* Avoid simplification of resolved symbols. */
2292 if (is_last_ref_vtab (a
) || is_last_ref_vtab (b
))
2295 /* Return .false. if the dynamic type can never be the
2297 if ((a
->ts
.type
== BT_CLASS
|| b
->ts
.type
== BT_CLASS
)
2298 && !gfc_type_compatible (&a
->ts
, &b
->ts
)
2299 && !gfc_type_compatible (&b
->ts
, &a
->ts
))
2300 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2302 if (a
->ts
.type
!= BT_DERIVED
|| b
->ts
.type
!= BT_DERIVED
)
2305 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2306 gfc_compare_derived_types (a
->ts
.u
.derived
,
2312 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
2318 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
2320 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2322 if (e
->expr_type
!= EXPR_CONSTANT
)
2325 gfc_set_model_kind (kind
);
2328 mpfr_floor (floor
, e
->value
.real
);
2330 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
2331 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
2335 return range_check (result
, "FLOOR");
2340 gfc_simplify_fraction (gfc_expr
*x
)
2343 mpfr_t absv
, exp
, pow2
;
2345 if (x
->expr_type
!= EXPR_CONSTANT
)
2348 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
2350 if (mpfr_sgn (x
->value
.real
) == 0)
2352 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2356 gfc_set_model_kind (x
->ts
.kind
);
2361 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
2362 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
2364 mpfr_trunc (exp
, exp
);
2365 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
2367 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
2369 mpfr_div (result
->value
.real
, absv
, pow2
, GFC_RND_MODE
);
2371 mpfr_clears (exp
, absv
, pow2
, NULL
);
2373 return range_check (result
, "FRACTION");
2378 gfc_simplify_gamma (gfc_expr
*x
)
2382 if (x
->expr_type
!= EXPR_CONSTANT
)
2385 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2386 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2388 return range_check (result
, "GAMMA");
2393 gfc_simplify_huge (gfc_expr
*e
)
2398 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2399 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2404 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2408 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
2420 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
2424 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2427 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2428 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
2429 return range_check (result
, "HYPOT");
2433 /* We use the processor's collating sequence, because all
2434 systems that gfortran currently works on are ASCII. */
2437 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
2443 if (e
->expr_type
!= EXPR_CONSTANT
)
2446 if (e
->value
.character
.length
!= 1)
2448 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
2449 return &gfc_bad_expr
;
2452 index
= e
->value
.character
.string
[0];
2454 if (gfc_option
.warn_surprising
&& index
> 127)
2455 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2458 k
= get_kind (BT_INTEGER
, kind
, "IACHAR", gfc_default_integer_kind
);
2460 return &gfc_bad_expr
;
2462 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2464 return range_check (result
, "IACHAR");
2469 do_bit_and (gfc_expr
*result
, gfc_expr
*e
)
2471 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2472 gcc_assert (result
->ts
.type
== BT_INTEGER
2473 && result
->expr_type
== EXPR_CONSTANT
);
2475 mpz_and (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2481 gfc_simplify_iall (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2483 return simplify_transformation (array
, dim
, mask
, -1, do_bit_and
);
2488 do_bit_ior (gfc_expr
*result
, gfc_expr
*e
)
2490 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2491 gcc_assert (result
->ts
.type
== BT_INTEGER
2492 && result
->expr_type
== EXPR_CONSTANT
);
2494 mpz_ior (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2500 gfc_simplify_iany (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2502 return simplify_transformation (array
, dim
, mask
, 0, do_bit_ior
);
2507 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
2511 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2514 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2515 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2517 return range_check (result
, "IAND");
2522 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
2527 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2530 gfc_extract_int (y
, &pos
);
2532 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2534 result
= gfc_copy_expr (x
);
2536 convert_mpz_to_unsigned (result
->value
.integer
,
2537 gfc_integer_kinds
[k
].bit_size
);
2539 mpz_clrbit (result
->value
.integer
, pos
);
2541 convert_mpz_to_signed (result
->value
.integer
,
2542 gfc_integer_kinds
[k
].bit_size
);
2549 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
2556 if (x
->expr_type
!= EXPR_CONSTANT
2557 || y
->expr_type
!= EXPR_CONSTANT
2558 || z
->expr_type
!= EXPR_CONSTANT
)
2561 gfc_extract_int (y
, &pos
);
2562 gfc_extract_int (z
, &len
);
2564 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
2566 bitsize
= gfc_integer_kinds
[k
].bit_size
;
2568 if (pos
+ len
> bitsize
)
2570 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2571 "bit size at %L", &y
->where
);
2572 return &gfc_bad_expr
;
2575 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2576 convert_mpz_to_unsigned (result
->value
.integer
,
2577 gfc_integer_kinds
[k
].bit_size
);
2579 bits
= XCNEWVEC (int, bitsize
);
2581 for (i
= 0; i
< bitsize
; i
++)
2584 for (i
= 0; i
< len
; i
++)
2585 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
2587 for (i
= 0; i
< bitsize
; i
++)
2590 mpz_clrbit (result
->value
.integer
, i
);
2591 else if (bits
[i
] == 1)
2592 mpz_setbit (result
->value
.integer
, i
);
2594 gfc_internal_error ("IBITS: Bad bit");
2599 convert_mpz_to_signed (result
->value
.integer
,
2600 gfc_integer_kinds
[k
].bit_size
);
2607 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
2612 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2615 gfc_extract_int (y
, &pos
);
2617 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2619 result
= gfc_copy_expr (x
);
2621 convert_mpz_to_unsigned (result
->value
.integer
,
2622 gfc_integer_kinds
[k
].bit_size
);
2624 mpz_setbit (result
->value
.integer
, pos
);
2626 convert_mpz_to_signed (result
->value
.integer
,
2627 gfc_integer_kinds
[k
].bit_size
);
2634 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
2640 if (e
->expr_type
!= EXPR_CONSTANT
)
2643 if (e
->value
.character
.length
!= 1)
2645 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
2646 return &gfc_bad_expr
;
2649 index
= e
->value
.character
.string
[0];
2651 k
= get_kind (BT_INTEGER
, kind
, "ICHAR", gfc_default_integer_kind
);
2653 return &gfc_bad_expr
;
2655 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2657 return range_check (result
, "ICHAR");
2662 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
2666 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2669 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2670 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2672 return range_check (result
, "IEOR");
2677 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
2680 int back
, len
, lensub
;
2681 int i
, j
, k
, count
, index
= 0, start
;
2683 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
2684 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
2687 if (b
!= NULL
&& b
->value
.logical
!= 0)
2692 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
2694 return &gfc_bad_expr
;
2696 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
2698 len
= x
->value
.character
.length
;
2699 lensub
= y
->value
.character
.length
;
2703 mpz_set_si (result
->value
.integer
, 0);
2711 mpz_set_si (result
->value
.integer
, 1);
2714 else if (lensub
== 1)
2716 for (i
= 0; i
< len
; i
++)
2718 for (j
= 0; j
< lensub
; j
++)
2720 if (y
->value
.character
.string
[j
]
2721 == x
->value
.character
.string
[i
])
2731 for (i
= 0; i
< len
; i
++)
2733 for (j
= 0; j
< lensub
; j
++)
2735 if (y
->value
.character
.string
[j
]
2736 == x
->value
.character
.string
[i
])
2741 for (k
= 0; k
< lensub
; k
++)
2743 if (y
->value
.character
.string
[k
]
2744 == x
->value
.character
.string
[k
+ start
])
2748 if (count
== lensub
)
2763 mpz_set_si (result
->value
.integer
, len
+ 1);
2766 else if (lensub
== 1)
2768 for (i
= 0; i
< len
; i
++)
2770 for (j
= 0; j
< lensub
; j
++)
2772 if (y
->value
.character
.string
[j
]
2773 == x
->value
.character
.string
[len
- i
])
2775 index
= len
- i
+ 1;
2783 for (i
= 0; i
< len
; i
++)
2785 for (j
= 0; j
< lensub
; j
++)
2787 if (y
->value
.character
.string
[j
]
2788 == x
->value
.character
.string
[len
- i
])
2791 if (start
<= len
- lensub
)
2794 for (k
= 0; k
< lensub
; k
++)
2795 if (y
->value
.character
.string
[k
]
2796 == x
->value
.character
.string
[k
+ start
])
2799 if (count
== lensub
)
2816 mpz_set_si (result
->value
.integer
, index
);
2817 return range_check (result
, "INDEX");
2822 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
2824 gfc_expr
*result
= NULL
;
2826 if (e
->expr_type
!= EXPR_CONSTANT
)
2829 result
= gfc_convert_constant (e
, BT_INTEGER
, kind
);
2830 if (result
== &gfc_bad_expr
)
2831 return &gfc_bad_expr
;
2833 return range_check (result
, name
);
2838 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
2842 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
2844 return &gfc_bad_expr
;
2846 return simplify_intconv (e
, kind
, "INT");
2850 gfc_simplify_int2 (gfc_expr
*e
)
2852 return simplify_intconv (e
, 2, "INT2");
2857 gfc_simplify_int8 (gfc_expr
*e
)
2859 return simplify_intconv (e
, 8, "INT8");
2864 gfc_simplify_long (gfc_expr
*e
)
2866 return simplify_intconv (e
, 4, "LONG");
2871 gfc_simplify_ifix (gfc_expr
*e
)
2873 gfc_expr
*rtrunc
, *result
;
2875 if (e
->expr_type
!= EXPR_CONSTANT
)
2878 rtrunc
= gfc_copy_expr (e
);
2879 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
2881 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2883 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
2885 gfc_free_expr (rtrunc
);
2887 return range_check (result
, "IFIX");
2892 gfc_simplify_idint (gfc_expr
*e
)
2894 gfc_expr
*rtrunc
, *result
;
2896 if (e
->expr_type
!= EXPR_CONSTANT
)
2899 rtrunc
= gfc_copy_expr (e
);
2900 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
2902 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2904 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
2906 gfc_free_expr (rtrunc
);
2908 return range_check (result
, "IDINT");
2913 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
2917 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2920 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2921 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2923 return range_check (result
, "IOR");
2928 do_bit_xor (gfc_expr
*result
, gfc_expr
*e
)
2930 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2931 gcc_assert (result
->ts
.type
== BT_INTEGER
2932 && result
->expr_type
== EXPR_CONSTANT
);
2934 mpz_xor (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2940 gfc_simplify_iparity (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2942 return simplify_transformation (array
, dim
, mask
, 0, do_bit_xor
);
2947 gfc_simplify_is_iostat_end (gfc_expr
*x
)
2949 if (x
->expr_type
!= EXPR_CONSTANT
)
2952 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
2953 mpz_cmp_si (x
->value
.integer
,
2954 LIBERROR_END
) == 0);
2959 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
2961 if (x
->expr_type
!= EXPR_CONSTANT
)
2964 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
2965 mpz_cmp_si (x
->value
.integer
,
2966 LIBERROR_EOR
) == 0);
2971 gfc_simplify_isnan (gfc_expr
*x
)
2973 if (x
->expr_type
!= EXPR_CONSTANT
)
2976 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
2977 mpfr_nan_p (x
->value
.real
));
2981 /* Performs a shift on its first argument. Depending on the last
2982 argument, the shift can be arithmetic, i.e. with filling from the
2983 left like in the SHIFTA intrinsic. */
2985 simplify_shift (gfc_expr
*e
, gfc_expr
*s
, const char *name
,
2986 bool arithmetic
, int direction
)
2989 int ashift
, *bits
, i
, k
, bitsize
, shift
;
2991 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
2994 gfc_extract_int (s
, &shift
);
2996 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
2997 bitsize
= gfc_integer_kinds
[k
].bit_size
;
2999 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3003 mpz_set (result
->value
.integer
, e
->value
.integer
);
3007 if (direction
> 0 && shift
< 0)
3009 /* Left shift, as in SHIFTL. */
3010 gfc_error ("Second argument of %s is negative at %L", name
, &e
->where
);
3011 return &gfc_bad_expr
;
3013 else if (direction
< 0)
3015 /* Right shift, as in SHIFTR or SHIFTA. */
3018 gfc_error ("Second argument of %s is negative at %L",
3020 return &gfc_bad_expr
;
3026 ashift
= (shift
>= 0 ? shift
: -shift
);
3028 if (ashift
> bitsize
)
3030 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3031 "at %L", name
, &e
->where
);
3032 return &gfc_bad_expr
;
3035 bits
= XCNEWVEC (int, bitsize
);
3037 for (i
= 0; i
< bitsize
; i
++)
3038 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3043 for (i
= 0; i
< shift
; i
++)
3044 mpz_clrbit (result
->value
.integer
, i
);
3046 for (i
= 0; i
< bitsize
- shift
; i
++)
3049 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3051 mpz_setbit (result
->value
.integer
, i
+ shift
);
3057 if (arithmetic
&& bits
[bitsize
- 1])
3058 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3059 mpz_setbit (result
->value
.integer
, i
);
3061 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3062 mpz_clrbit (result
->value
.integer
, i
);
3064 for (i
= bitsize
- 1; i
>= ashift
; i
--)
3067 mpz_clrbit (result
->value
.integer
, i
- ashift
);
3069 mpz_setbit (result
->value
.integer
, i
- ashift
);
3073 convert_mpz_to_signed (result
->value
.integer
, bitsize
);
3081 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
3083 return simplify_shift (e
, s
, "ISHFT", false, 0);
3088 gfc_simplify_lshift (gfc_expr
*e
, gfc_expr
*s
)
3090 return simplify_shift (e
, s
, "LSHIFT", false, 1);
3095 gfc_simplify_rshift (gfc_expr
*e
, gfc_expr
*s
)
3097 return simplify_shift (e
, s
, "RSHIFT", true, -1);
3102 gfc_simplify_shifta (gfc_expr
*e
, gfc_expr
*s
)
3104 return simplify_shift (e
, s
, "SHIFTA", true, -1);
3109 gfc_simplify_shiftl (gfc_expr
*e
, gfc_expr
*s
)
3111 return simplify_shift (e
, s
, "SHIFTL", false, 1);
3116 gfc_simplify_shiftr (gfc_expr
*e
, gfc_expr
*s
)
3118 return simplify_shift (e
, s
, "SHIFTR", false, -1);
3123 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
3126 int shift
, ashift
, isize
, ssize
, delta
, k
;
3129 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3132 gfc_extract_int (s
, &shift
);
3134 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3135 isize
= gfc_integer_kinds
[k
].bit_size
;
3139 if (sz
->expr_type
!= EXPR_CONSTANT
)
3142 gfc_extract_int (sz
, &ssize
);
3156 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3157 "BIT_SIZE of first argument at %L", &s
->where
);
3158 return &gfc_bad_expr
;
3161 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3163 mpz_set (result
->value
.integer
, e
->value
.integer
);
3168 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
3170 bits
= XCNEWVEC (int, ssize
);
3172 for (i
= 0; i
< ssize
; i
++)
3173 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3175 delta
= ssize
- ashift
;
3179 for (i
= 0; i
< delta
; i
++)
3182 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3184 mpz_setbit (result
->value
.integer
, i
+ shift
);
3187 for (i
= delta
; i
< ssize
; i
++)
3190 mpz_clrbit (result
->value
.integer
, i
- delta
);
3192 mpz_setbit (result
->value
.integer
, i
- delta
);
3197 for (i
= 0; i
< ashift
; i
++)
3200 mpz_clrbit (result
->value
.integer
, i
+ delta
);
3202 mpz_setbit (result
->value
.integer
, i
+ delta
);
3205 for (i
= ashift
; i
< ssize
; i
++)
3208 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3210 mpz_setbit (result
->value
.integer
, i
+ shift
);
3214 convert_mpz_to_signed (result
->value
.integer
, isize
);
3222 gfc_simplify_kind (gfc_expr
*e
)
3224 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, e
->ts
.kind
);
3229 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
3230 gfc_array_spec
*as
, gfc_ref
*ref
, bool coarray
)
3232 gfc_expr
*l
, *u
, *result
;
3235 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3236 gfc_default_integer_kind
);
3238 return &gfc_bad_expr
;
3240 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3242 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3243 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3244 if (!coarray
&& array
->expr_type
!= EXPR_VARIABLE
)
3248 gfc_expr
* dim
= result
;
3249 mpz_set_si (dim
->value
.integer
, d
);
3251 result
= gfc_simplify_size (array
, dim
, kind
);
3252 gfc_free_expr (dim
);
3257 mpz_set_si (result
->value
.integer
, 1);
3262 /* Otherwise, we have a variable expression. */
3263 gcc_assert (array
->expr_type
== EXPR_VARIABLE
);
3266 if (!gfc_resolve_array_spec (as
, 0))
3269 /* The last dimension of an assumed-size array is special. */
3270 if ((!coarray
&& d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
3271 || (coarray
&& d
== as
->rank
+ as
->corank
3272 && (!upper
|| gfc_option
.coarray
== GFC_FCOARRAY_SINGLE
)))
3274 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
3276 gfc_free_expr (result
);
3277 return gfc_copy_expr (as
->lower
[d
-1]);
3283 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3285 /* Then, we need to know the extent of the given dimension. */
3286 if (coarray
|| ref
->u
.ar
.type
== AR_FULL
)
3291 if (l
->expr_type
!= EXPR_CONSTANT
|| u
== NULL
3292 || u
->expr_type
!= EXPR_CONSTANT
)
3295 if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
3299 mpz_set_si (result
->value
.integer
, 0);
3301 mpz_set_si (result
->value
.integer
, 1);
3305 /* Nonzero extent. */
3307 mpz_set (result
->value
.integer
, u
->value
.integer
);
3309 mpz_set (result
->value
.integer
, l
->value
.integer
);
3316 if (!gfc_ref_dimen_size (&ref
->u
.ar
, d
- 1, &result
->value
.integer
, NULL
))
3320 mpz_set_si (result
->value
.integer
, (long int) 1);
3324 return range_check (result
, upper
? "UBOUND" : "LBOUND");
3327 gfc_free_expr (result
);
3333 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3339 if (array
->ts
.type
== BT_CLASS
)
3342 if (array
->expr_type
!= EXPR_VARIABLE
)
3349 /* Follow any component references. */
3350 as
= array
->symtree
->n
.sym
->as
;
3351 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3356 switch (ref
->u
.ar
.type
)
3363 /* We're done because 'as' has already been set in the
3364 previous iteration. */
3381 as
= ref
->u
.c
.component
->as
;
3393 if (as
&& (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_SHAPE
3394 || as
->type
== AS_ASSUMED_RANK
))
3399 /* Multi-dimensional bounds. */
3400 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3404 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3405 if (upper
&& as
&& as
->type
== AS_ASSUMED_SIZE
)
3407 /* An error message will be emitted in
3408 check_assumed_size_reference (resolve.c). */
3409 return &gfc_bad_expr
;
3412 /* Simplify the bounds for each dimension. */
3413 for (d
= 0; d
< array
->rank
; d
++)
3415 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
, ref
,
3417 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3421 for (j
= 0; j
< d
; j
++)
3422 gfc_free_expr (bounds
[j
]);
3427 /* Allocate the result expression. */
3428 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3429 gfc_default_integer_kind
);
3431 return &gfc_bad_expr
;
3433 e
= gfc_get_array_expr (BT_INTEGER
, k
, &array
->where
);
3435 /* The result is a rank 1 array; its size is the rank of the first
3436 argument to {L,U}BOUND. */
3438 e
->shape
= gfc_get_shape (1);
3439 mpz_init_set_ui (e
->shape
[0], array
->rank
);
3441 /* Create the constructor for this array. */
3442 for (d
= 0; d
< array
->rank
; d
++)
3443 gfc_constructor_append_expr (&e
->value
.constructor
,
3444 bounds
[d
], &e
->where
);
3450 /* A DIM argument is specified. */
3451 if (dim
->expr_type
!= EXPR_CONSTANT
)
3454 d
= mpz_get_si (dim
->value
.integer
);
3456 if ((d
< 1 || d
> array
->rank
)
3457 || (d
== array
->rank
&& as
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
3459 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3460 return &gfc_bad_expr
;
3463 if (as
&& as
->type
== AS_ASSUMED_RANK
)
3466 return simplify_bound_dim (array
, kind
, d
, upper
, as
, ref
, false);
3472 simplify_cobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3478 if (array
->expr_type
!= EXPR_VARIABLE
)
3481 /* Follow any component references. */
3482 as
= (array
->ts
.type
== BT_CLASS
&& array
->ts
.u
.derived
->components
)
3483 ? array
->ts
.u
.derived
->components
->as
3484 : array
->symtree
->n
.sym
->as
;
3485 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3490 switch (ref
->u
.ar
.type
)
3493 if (ref
->u
.ar
.as
->corank
> 0)
3495 gcc_assert (as
== ref
->u
.ar
.as
);
3502 /* We're done because 'as' has already been set in the
3503 previous iteration. */
3520 as
= ref
->u
.c
.component
->as
;
3533 if (as
->cotype
== AS_DEFERRED
|| as
->cotype
== AS_ASSUMED_SHAPE
)
3538 /* Multi-dimensional cobounds. */
3539 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3543 /* Simplify the cobounds for each dimension. */
3544 for (d
= 0; d
< as
->corank
; d
++)
3546 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1 + as
->rank
,
3547 upper
, as
, ref
, true);
3548 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3552 for (j
= 0; j
< d
; j
++)
3553 gfc_free_expr (bounds
[j
]);
3558 /* Allocate the result expression. */
3559 e
= gfc_get_expr ();
3560 e
->where
= array
->where
;
3561 e
->expr_type
= EXPR_ARRAY
;
3562 e
->ts
.type
= BT_INTEGER
;
3563 k
= get_kind (BT_INTEGER
, kind
, upper
? "UCOBOUND" : "LCOBOUND",
3564 gfc_default_integer_kind
);
3568 return &gfc_bad_expr
;
3572 /* The result is a rank 1 array; its size is the rank of the first
3573 argument to {L,U}COBOUND. */
3575 e
->shape
= gfc_get_shape (1);
3576 mpz_init_set_ui (e
->shape
[0], as
->corank
);
3578 /* Create the constructor for this array. */
3579 for (d
= 0; d
< as
->corank
; d
++)
3580 gfc_constructor_append_expr (&e
->value
.constructor
,
3581 bounds
[d
], &e
->where
);
3586 /* A DIM argument is specified. */
3587 if (dim
->expr_type
!= EXPR_CONSTANT
)
3590 d
= mpz_get_si (dim
->value
.integer
);
3592 if (d
< 1 || d
> as
->corank
)
3594 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3595 return &gfc_bad_expr
;
3598 return simplify_bound_dim (array
, kind
, d
+as
->rank
, upper
, as
, ref
, true);
3604 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3606 return simplify_bound (array
, dim
, kind
, 0);
3611 gfc_simplify_lcobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3613 return simplify_cobound (array
, dim
, kind
, 0);
3617 gfc_simplify_leadz (gfc_expr
*e
)
3619 unsigned long lz
, bs
;
3622 if (e
->expr_type
!= EXPR_CONSTANT
)
3625 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3626 bs
= gfc_integer_kinds
[i
].bit_size
;
3627 if (mpz_cmp_si (e
->value
.integer
, 0) == 0)
3629 else if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
3632 lz
= bs
- mpz_sizeinbase (e
->value
.integer
, 2);
3634 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, lz
);
3639 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
3642 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
3645 return &gfc_bad_expr
;
3647 if (e
->expr_type
== EXPR_CONSTANT
)
3649 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
3650 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
3651 return range_check (result
, "LEN");
3653 else if (e
->ts
.u
.cl
!= NULL
&& e
->ts
.u
.cl
->length
!= NULL
3654 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
3655 && e
->ts
.u
.cl
->length
->ts
.type
== BT_INTEGER
)
3657 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
3658 mpz_set (result
->value
.integer
, e
->ts
.u
.cl
->length
->value
.integer
);
3659 return range_check (result
, "LEN");
3667 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
3671 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
3674 return &gfc_bad_expr
;
3676 if (e
->expr_type
!= EXPR_CONSTANT
)
3679 len
= e
->value
.character
.length
;
3680 for (count
= 0, i
= 1; i
<= len
; i
++)
3681 if (e
->value
.character
.string
[len
- i
] == ' ')
3686 result
= gfc_get_int_expr (k
, &e
->where
, len
- count
);
3687 return range_check (result
, "LEN_TRIM");
3691 gfc_simplify_lgamma (gfc_expr
*x
)
3696 if (x
->expr_type
!= EXPR_CONSTANT
)
3699 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3700 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
3702 return range_check (result
, "LGAMMA");
3707 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
3709 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3712 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3713 gfc_compare_string (a
, b
) >= 0);
3718 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
3720 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3723 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3724 gfc_compare_string (a
, b
) > 0);
3729 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
3731 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3734 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3735 gfc_compare_string (a
, b
) <= 0);
3740 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
3742 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3745 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3746 gfc_compare_string (a
, b
) < 0);
3751 gfc_simplify_log (gfc_expr
*x
)
3755 if (x
->expr_type
!= EXPR_CONSTANT
)
3758 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3763 if (mpfr_sgn (x
->value
.real
) <= 0)
3765 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3766 "to zero", &x
->where
);
3767 gfc_free_expr (result
);
3768 return &gfc_bad_expr
;
3771 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3775 if ((mpfr_sgn (mpc_realref (x
->value
.complex)) == 0)
3776 && (mpfr_sgn (mpc_imagref (x
->value
.complex)) == 0))
3778 gfc_error ("Complex argument of LOG at %L cannot be zero",
3780 gfc_free_expr (result
);
3781 return &gfc_bad_expr
;
3784 gfc_set_model_kind (x
->ts
.kind
);
3785 mpc_log (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
3789 gfc_internal_error ("gfc_simplify_log: bad type");
3792 return range_check (result
, "LOG");
3797 gfc_simplify_log10 (gfc_expr
*x
)
3801 if (x
->expr_type
!= EXPR_CONSTANT
)
3804 if (mpfr_sgn (x
->value
.real
) <= 0)
3806 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3807 "to zero", &x
->where
);
3808 return &gfc_bad_expr
;
3811 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3812 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3814 return range_check (result
, "LOG10");
3819 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
3823 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
3825 return &gfc_bad_expr
;
3827 if (e
->expr_type
!= EXPR_CONSTANT
)
3830 return gfc_get_logical_expr (kind
, &e
->where
, e
->value
.logical
);
3835 gfc_simplify_matmul (gfc_expr
*matrix_a
, gfc_expr
*matrix_b
)
3838 int row
, result_rows
, col
, result_columns
;
3839 int stride_a
, offset_a
, stride_b
, offset_b
;
3841 if (!is_constant_array_expr (matrix_a
)
3842 || !is_constant_array_expr (matrix_b
))
3845 gcc_assert (gfc_compare_types (&matrix_a
->ts
, &matrix_b
->ts
));
3846 result
= gfc_get_array_expr (matrix_a
->ts
.type
,
3850 if (matrix_a
->rank
== 1 && matrix_b
->rank
== 2)
3853 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
3855 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
3858 result
->shape
= gfc_get_shape (result
->rank
);
3859 mpz_init_set_si (result
->shape
[0], result_columns
);
3861 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 1)
3863 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
3865 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
3869 result
->shape
= gfc_get_shape (result
->rank
);
3870 mpz_init_set_si (result
->shape
[0], result_rows
);
3872 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 2)
3874 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
3875 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
3876 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
3877 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
3880 result
->shape
= gfc_get_shape (result
->rank
);
3881 mpz_init_set_si (result
->shape
[0], result_rows
);
3882 mpz_init_set_si (result
->shape
[1], result_columns
);
3887 offset_a
= offset_b
= 0;
3888 for (col
= 0; col
< result_columns
; ++col
)
3892 for (row
= 0; row
< result_rows
; ++row
)
3894 gfc_expr
*e
= compute_dot_product (matrix_a
, stride_a
, offset_a
,
3895 matrix_b
, 1, offset_b
);
3896 gfc_constructor_append_expr (&result
->value
.constructor
,
3902 offset_b
+= stride_b
;
3910 gfc_simplify_maskr (gfc_expr
*i
, gfc_expr
*kind_arg
)
3916 if (i
->expr_type
!= EXPR_CONSTANT
)
3919 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKR", gfc_default_integer_kind
);
3921 return &gfc_bad_expr
;
3922 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
3924 s
= gfc_extract_int (i
, &arg
);
3927 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
3929 /* MASKR(n) = 2^n - 1 */
3930 mpz_set_ui (result
->value
.integer
, 1);
3931 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
, arg
);
3932 mpz_sub_ui (result
->value
.integer
, result
->value
.integer
, 1);
3934 convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
3941 gfc_simplify_maskl (gfc_expr
*i
, gfc_expr
*kind_arg
)
3948 if (i
->expr_type
!= EXPR_CONSTANT
)
3951 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKL", gfc_default_integer_kind
);
3953 return &gfc_bad_expr
;
3954 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
3956 s
= gfc_extract_int (i
, &arg
);
3959 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
3961 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
3962 mpz_init_set_ui (z
, 1);
3963 mpz_mul_2exp (z
, z
, gfc_integer_kinds
[k
].bit_size
);
3964 mpz_set_ui (result
->value
.integer
, 1);
3965 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
,
3966 gfc_integer_kinds
[k
].bit_size
- arg
);
3967 mpz_sub (result
->value
.integer
, z
, result
->value
.integer
);
3970 convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
3977 gfc_simplify_merge (gfc_expr
*tsource
, gfc_expr
*fsource
, gfc_expr
*mask
)
3980 gfc_constructor
*tsource_ctor
, *fsource_ctor
, *mask_ctor
;
3982 if (mask
->expr_type
== EXPR_CONSTANT
)
3983 return gfc_get_parentheses (gfc_copy_expr (mask
->value
.logical
3984 ? tsource
: fsource
));
3986 if (!mask
->rank
|| !is_constant_array_expr (mask
)
3987 || !is_constant_array_expr (tsource
) || !is_constant_array_expr (fsource
))
3990 result
= gfc_get_array_expr (tsource
->ts
.type
, tsource
->ts
.kind
,
3992 if (tsource
->ts
.type
== BT_DERIVED
)
3993 result
->ts
.u
.derived
= tsource
->ts
.u
.derived
;
3994 else if (tsource
->ts
.type
== BT_CHARACTER
)
3995 result
->ts
.u
.cl
= tsource
->ts
.u
.cl
;
3997 tsource_ctor
= gfc_constructor_first (tsource
->value
.constructor
);
3998 fsource_ctor
= gfc_constructor_first (fsource
->value
.constructor
);
3999 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4003 if (mask_ctor
->expr
->value
.logical
)
4004 gfc_constructor_append_expr (&result
->value
.constructor
,
4005 gfc_copy_expr (tsource_ctor
->expr
),
4008 gfc_constructor_append_expr (&result
->value
.constructor
,
4009 gfc_copy_expr (fsource_ctor
->expr
),
4011 tsource_ctor
= gfc_constructor_next (tsource_ctor
);
4012 fsource_ctor
= gfc_constructor_next (fsource_ctor
);
4013 mask_ctor
= gfc_constructor_next (mask_ctor
);
4016 result
->shape
= gfc_get_shape (1);
4017 gfc_array_size (result
, &result
->shape
[0]);
4024 gfc_simplify_merge_bits (gfc_expr
*i
, gfc_expr
*j
, gfc_expr
*mask_expr
)
4026 mpz_t arg1
, arg2
, mask
;
4029 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
4030 || mask_expr
->expr_type
!= EXPR_CONSTANT
)
4033 result
= gfc_get_constant_expr (BT_INTEGER
, i
->ts
.kind
, &i
->where
);
4035 /* Convert all argument to unsigned. */
4036 mpz_init_set (arg1
, i
->value
.integer
);
4037 mpz_init_set (arg2
, j
->value
.integer
);
4038 mpz_init_set (mask
, mask_expr
->value
.integer
);
4040 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4041 mpz_and (arg1
, arg1
, mask
);
4042 mpz_com (mask
, mask
);
4043 mpz_and (arg2
, arg2
, mask
);
4044 mpz_ior (result
->value
.integer
, arg1
, arg2
);
4054 /* Selects between current value and extremum for simplify_min_max
4055 and simplify_minval_maxval. */
4057 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
)
4059 switch (arg
->ts
.type
)
4062 if (mpz_cmp (arg
->value
.integer
,
4063 extremum
->value
.integer
) * sign
> 0)
4064 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
4068 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4070 mpfr_max (extremum
->value
.real
, extremum
->value
.real
,
4071 arg
->value
.real
, GFC_RND_MODE
);
4073 mpfr_min (extremum
->value
.real
, extremum
->value
.real
,
4074 arg
->value
.real
, GFC_RND_MODE
);
4078 #define LENGTH(x) ((x)->value.character.length)
4079 #define STRING(x) ((x)->value.character.string)
4080 if (LENGTH (extremum
) < LENGTH(arg
))
4082 gfc_char_t
*tmp
= STRING(extremum
);
4084 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
4085 memcpy (STRING(extremum
), tmp
,
4086 LENGTH(extremum
) * sizeof (gfc_char_t
));
4087 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
4088 LENGTH(arg
) - LENGTH(extremum
));
4089 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
4090 LENGTH(extremum
) = LENGTH(arg
);
4094 if (gfc_compare_string (arg
, extremum
) * sign
> 0)
4096 free (STRING(extremum
));
4097 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
4098 memcpy (STRING(extremum
), STRING(arg
),
4099 LENGTH(arg
) * sizeof (gfc_char_t
));
4100 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
4101 LENGTH(extremum
) - LENGTH(arg
));
4102 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
4109 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4114 /* This function is special since MAX() can take any number of
4115 arguments. The simplified expression is a rewritten version of the
4116 argument list containing at most one constant element. Other
4117 constant elements are deleted. Because the argument list has
4118 already been checked, this function always succeeds. sign is 1 for
4119 MAX(), -1 for MIN(). */
4122 simplify_min_max (gfc_expr
*expr
, int sign
)
4124 gfc_actual_arglist
*arg
, *last
, *extremum
;
4125 gfc_intrinsic_sym
* specific
;
4129 specific
= expr
->value
.function
.isym
;
4131 arg
= expr
->value
.function
.actual
;
4133 for (; arg
; last
= arg
, arg
= arg
->next
)
4135 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
4138 if (extremum
== NULL
)
4144 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
4146 /* Delete the extra constant argument. */
4147 last
->next
= arg
->next
;
4150 gfc_free_actual_arglist (arg
);
4154 /* If there is one value left, replace the function call with the
4156 if (expr
->value
.function
.actual
->next
!= NULL
)
4159 /* Convert to the correct type and kind. */
4160 if (expr
->ts
.type
!= BT_UNKNOWN
)
4161 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4162 expr
->ts
.type
, expr
->ts
.kind
);
4164 if (specific
->ts
.type
!= BT_UNKNOWN
)
4165 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4166 specific
->ts
.type
, specific
->ts
.kind
);
4168 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
4173 gfc_simplify_min (gfc_expr
*e
)
4175 return simplify_min_max (e
, -1);
4180 gfc_simplify_max (gfc_expr
*e
)
4182 return simplify_min_max (e
, 1);
4186 /* This is a simplified version of simplify_min_max to provide
4187 simplification of minval and maxval for a vector. */
4190 simplify_minval_maxval (gfc_expr
*expr
, int sign
)
4192 gfc_constructor
*c
, *extremum
;
4193 gfc_intrinsic_sym
* specific
;
4196 specific
= expr
->value
.function
.isym
;
4198 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4199 c
; c
= gfc_constructor_next (c
))
4201 if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
4204 if (extremum
== NULL
)
4210 min_max_choose (c
->expr
, extremum
->expr
, sign
);
4213 if (extremum
== NULL
)
4216 /* Convert to the correct type and kind. */
4217 if (expr
->ts
.type
!= BT_UNKNOWN
)
4218 return gfc_convert_constant (extremum
->expr
,
4219 expr
->ts
.type
, expr
->ts
.kind
);
4221 if (specific
->ts
.type
!= BT_UNKNOWN
)
4222 return gfc_convert_constant (extremum
->expr
,
4223 specific
->ts
.type
, specific
->ts
.kind
);
4225 return gfc_copy_expr (extremum
->expr
);
4230 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4232 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4235 return simplify_minval_maxval (array
, -1);
4240 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4242 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4245 return simplify_minval_maxval (array
, 1);
4250 gfc_simplify_maxexponent (gfc_expr
*x
)
4252 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4253 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4254 gfc_real_kinds
[i
].max_exponent
);
4259 gfc_simplify_minexponent (gfc_expr
*x
)
4261 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4262 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4263 gfc_real_kinds
[i
].min_exponent
);
4268 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
4273 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4276 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4277 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4282 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4284 /* Result is processor-dependent. */
4285 gfc_error ("Second argument MOD at %L is zero", &a
->where
);
4286 gfc_free_expr (result
);
4287 return &gfc_bad_expr
;
4289 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4293 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4295 /* Result is processor-dependent. */
4296 gfc_error ("Second argument of MOD at %L is zero", &p
->where
);
4297 gfc_free_expr (result
);
4298 return &gfc_bad_expr
;
4301 gfc_set_model_kind (kind
);
4302 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4307 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4310 return range_check (result
, "MOD");
4315 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
4320 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4323 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4324 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4329 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4331 /* Result is processor-dependent. This processor just opts
4332 to not handle it at all. */
4333 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
4334 gfc_free_expr (result
);
4335 return &gfc_bad_expr
;
4337 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4342 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4344 /* Result is processor-dependent. */
4345 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
4346 gfc_free_expr (result
);
4347 return &gfc_bad_expr
;
4350 gfc_set_model_kind (kind
);
4351 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4353 if (mpfr_cmp_ui (result
->value
.real
, 0) != 0)
4355 if (mpfr_signbit (a
->value
.real
) != mpfr_signbit (p
->value
.real
))
4356 mpfr_add (result
->value
.real
, result
->value
.real
, p
->value
.real
,
4360 mpfr_copysign (result
->value
.real
, result
->value
.real
,
4361 p
->value
.real
, GFC_RND_MODE
);
4365 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4368 return range_check (result
, "MODULO");
4372 /* Exists for the sole purpose of consistency with other intrinsics. */
4374 gfc_simplify_mvbits (gfc_expr
*f ATTRIBUTE_UNUSED
,
4375 gfc_expr
*fp ATTRIBUTE_UNUSED
,
4376 gfc_expr
*l ATTRIBUTE_UNUSED
,
4377 gfc_expr
*to ATTRIBUTE_UNUSED
,
4378 gfc_expr
*tp ATTRIBUTE_UNUSED
)
4385 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
4388 mp_exp_t emin
, emax
;
4391 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
4394 result
= gfc_copy_expr (x
);
4396 /* Save current values of emin and emax. */
4397 emin
= mpfr_get_emin ();
4398 emax
= mpfr_get_emax ();
4400 /* Set emin and emax for the current model number. */
4401 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
4402 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
4403 mpfr_get_prec(result
->value
.real
) + 1);
4404 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
4405 mpfr_check_range (result
->value
.real
, 0, GMP_RNDU
);
4407 if (mpfr_sgn (s
->value
.real
) > 0)
4409 mpfr_nextabove (result
->value
.real
);
4410 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
4414 mpfr_nextbelow (result
->value
.real
);
4415 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
4418 mpfr_set_emin (emin
);
4419 mpfr_set_emax (emax
);
4421 /* Only NaN can occur. Do not use range check as it gives an
4422 error for denormal numbers. */
4423 if (mpfr_nan_p (result
->value
.real
) && gfc_option
.flag_range_check
)
4425 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
4426 gfc_free_expr (result
);
4427 return &gfc_bad_expr
;
4435 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
4437 gfc_expr
*itrunc
, *result
;
4440 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
4442 return &gfc_bad_expr
;
4444 if (e
->expr_type
!= EXPR_CONSTANT
)
4447 itrunc
= gfc_copy_expr (e
);
4448 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
4450 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
4451 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
4453 gfc_free_expr (itrunc
);
4455 return range_check (result
, name
);
4460 gfc_simplify_new_line (gfc_expr
*e
)
4464 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 1);
4465 result
->value
.character
.string
[0] = '\n';
4472 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
4474 return simplify_nint ("NINT", e
, k
);
4479 gfc_simplify_idnint (gfc_expr
*e
)
4481 return simplify_nint ("IDNINT", e
, NULL
);
4486 add_squared (gfc_expr
*result
, gfc_expr
*e
)
4490 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4491 gcc_assert (result
->ts
.type
== BT_REAL
4492 && result
->expr_type
== EXPR_CONSTANT
);
4494 gfc_set_model_kind (result
->ts
.kind
);
4496 mpfr_pow_ui (tmp
, e
->value
.real
, 2, GFC_RND_MODE
);
4497 mpfr_add (result
->value
.real
, result
->value
.real
, tmp
,
4506 do_sqrt (gfc_expr
*result
, gfc_expr
*e
)
4508 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4509 gcc_assert (result
->ts
.type
== BT_REAL
4510 && result
->expr_type
== EXPR_CONSTANT
);
4512 mpfr_set (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
4513 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4519 gfc_simplify_norm2 (gfc_expr
*e
, gfc_expr
*dim
)
4523 if (!is_constant_array_expr (e
)
4524 || (dim
!= NULL
&& !gfc_is_constant_expr (dim
)))
4527 result
= transformational_result (e
, dim
, e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4528 init_result_expr (result
, 0, NULL
);
4530 if (!dim
|| e
->rank
== 1)
4532 result
= simplify_transformation_to_scalar (result
, e
, NULL
,
4534 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4537 result
= simplify_transformation_to_array (result
, e
, dim
, NULL
,
4538 add_squared
, &do_sqrt
);
4545 gfc_simplify_not (gfc_expr
*e
)
4549 if (e
->expr_type
!= EXPR_CONSTANT
)
4552 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4553 mpz_com (result
->value
.integer
, e
->value
.integer
);
4555 return range_check (result
, "NOT");
4560 gfc_simplify_null (gfc_expr
*mold
)
4566 result
= gfc_copy_expr (mold
);
4567 result
->expr_type
= EXPR_NULL
;
4570 result
= gfc_get_null_expr (NULL
);
4577 gfc_simplify_num_images (void)
4581 if (gfc_option
.coarray
== GFC_FCOARRAY_NONE
)
4583 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
4584 return &gfc_bad_expr
;
4587 if (gfc_option
.coarray
!= GFC_FCOARRAY_SINGLE
)
4590 /* FIXME: gfc_current_locus is wrong. */
4591 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
4592 &gfc_current_locus
);
4593 mpz_set_si (result
->value
.integer
, 1);
4599 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
4604 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
4607 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
4612 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
4613 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
4614 return range_check (result
, "OR");
4617 return gfc_get_logical_expr (kind
, &x
->where
,
4618 x
->value
.logical
|| y
->value
.logical
);
4626 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
4629 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
4631 if (!is_constant_array_expr (array
)
4632 || !is_constant_array_expr (vector
)
4633 || (!gfc_is_constant_expr (mask
)
4634 && !is_constant_array_expr (mask
)))
4637 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
4638 if (array
->ts
.type
== BT_DERIVED
)
4639 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
4641 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
4642 vector_ctor
= vector
4643 ? gfc_constructor_first (vector
->value
.constructor
)
4646 if (mask
->expr_type
== EXPR_CONSTANT
4647 && mask
->value
.logical
)
4649 /* Copy all elements of ARRAY to RESULT. */
4652 gfc_constructor_append_expr (&result
->value
.constructor
,
4653 gfc_copy_expr (array_ctor
->expr
),
4656 array_ctor
= gfc_constructor_next (array_ctor
);
4657 vector_ctor
= gfc_constructor_next (vector_ctor
);
4660 else if (mask
->expr_type
== EXPR_ARRAY
)
4662 /* Copy only those elements of ARRAY to RESULT whose
4663 MASK equals .TRUE.. */
4664 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4667 if (mask_ctor
->expr
->value
.logical
)
4669 gfc_constructor_append_expr (&result
->value
.constructor
,
4670 gfc_copy_expr (array_ctor
->expr
),
4672 vector_ctor
= gfc_constructor_next (vector_ctor
);
4675 array_ctor
= gfc_constructor_next (array_ctor
);
4676 mask_ctor
= gfc_constructor_next (mask_ctor
);
4680 /* Append any left-over elements from VECTOR to RESULT. */
4683 gfc_constructor_append_expr (&result
->value
.constructor
,
4684 gfc_copy_expr (vector_ctor
->expr
),
4686 vector_ctor
= gfc_constructor_next (vector_ctor
);
4689 result
->shape
= gfc_get_shape (1);
4690 gfc_array_size (result
, &result
->shape
[0]);
4692 if (array
->ts
.type
== BT_CHARACTER
)
4693 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
4700 do_xor (gfc_expr
*result
, gfc_expr
*e
)
4702 gcc_assert (e
->ts
.type
== BT_LOGICAL
&& e
->expr_type
== EXPR_CONSTANT
);
4703 gcc_assert (result
->ts
.type
== BT_LOGICAL
4704 && result
->expr_type
== EXPR_CONSTANT
);
4706 result
->value
.logical
= result
->value
.logical
!= e
->value
.logical
;
4713 gfc_simplify_parity (gfc_expr
*e
, gfc_expr
*dim
)
4715 return simplify_transformation (e
, dim
, NULL
, 0, do_xor
);
4720 gfc_simplify_popcnt (gfc_expr
*e
)
4725 if (e
->expr_type
!= EXPR_CONSTANT
)
4728 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4730 /* Convert argument to unsigned, then count the '1' bits. */
4731 mpz_init_set (x
, e
->value
.integer
);
4732 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
4733 res
= mpz_popcount (x
);
4736 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, res
);
4741 gfc_simplify_poppar (gfc_expr
*e
)
4747 if (e
->expr_type
!= EXPR_CONSTANT
)
4750 popcnt
= gfc_simplify_popcnt (e
);
4751 gcc_assert (popcnt
);
4753 s
= gfc_extract_int (popcnt
, &i
);
4756 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
% 2);
4761 gfc_simplify_precision (gfc_expr
*e
)
4763 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4764 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
,
4765 gfc_real_kinds
[i
].precision
);
4770 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
4772 return simplify_transformation (array
, dim
, mask
, 1, gfc_multiply
);
4777 gfc_simplify_radix (gfc_expr
*e
)
4780 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4785 i
= gfc_integer_kinds
[i
].radix
;
4789 i
= gfc_real_kinds
[i
].radix
;
4796 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
4801 gfc_simplify_range (gfc_expr
*e
)
4804 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4809 i
= gfc_integer_kinds
[i
].range
;
4814 i
= gfc_real_kinds
[i
].range
;
4821 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
4826 gfc_simplify_rank (gfc_expr
*e
)
4832 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, e
->rank
);
4837 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
4839 gfc_expr
*result
= NULL
;
4842 if (e
->ts
.type
== BT_COMPLEX
)
4843 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
4845 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
4848 return &gfc_bad_expr
;
4850 if (e
->expr_type
!= EXPR_CONSTANT
)
4853 if (convert_boz (e
, kind
) == &gfc_bad_expr
)
4854 return &gfc_bad_expr
;
4856 result
= gfc_convert_constant (e
, BT_REAL
, kind
);
4857 if (result
== &gfc_bad_expr
)
4858 return &gfc_bad_expr
;
4860 return range_check (result
, "REAL");
4865 gfc_simplify_realpart (gfc_expr
*e
)
4869 if (e
->expr_type
!= EXPR_CONSTANT
)
4872 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
4873 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
4875 return range_check (result
, "REALPART");
4879 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
4882 int i
, j
, len
, ncop
, nlen
;
4884 bool have_length
= false;
4886 /* If NCOPIES isn't a constant, there's nothing we can do. */
4887 if (n
->expr_type
!= EXPR_CONSTANT
)
4890 /* If NCOPIES is negative, it's an error. */
4891 if (mpz_sgn (n
->value
.integer
) < 0)
4893 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4895 return &gfc_bad_expr
;
4898 /* If we don't know the character length, we can do no more. */
4899 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
4900 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
4902 len
= mpz_get_si (e
->ts
.u
.cl
->length
->value
.integer
);
4905 else if (e
->expr_type
== EXPR_CONSTANT
4906 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
4908 len
= e
->value
.character
.length
;
4913 /* If the source length is 0, any value of NCOPIES is valid
4914 and everything behaves as if NCOPIES == 0. */
4917 mpz_set_ui (ncopies
, 0);
4919 mpz_set (ncopies
, n
->value
.integer
);
4921 /* Check that NCOPIES isn't too large. */
4927 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4929 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
4933 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
4934 e
->ts
.u
.cl
->length
->value
.integer
);
4938 mpz_init_set_si (mlen
, len
);
4939 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
4943 /* The check itself. */
4944 if (mpz_cmp (ncopies
, max
) > 0)
4947 mpz_clear (ncopies
);
4948 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4950 return &gfc_bad_expr
;
4955 mpz_clear (ncopies
);
4957 /* For further simplification, we need the character string to be
4959 if (e
->expr_type
!= EXPR_CONSTANT
)
4963 (e
->ts
.u
.cl
->length
&&
4964 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
)) != 0)
4966 const char *res
= gfc_extract_int (n
, &ncop
);
4967 gcc_assert (res
== NULL
);
4973 return gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 0);
4975 len
= e
->value
.character
.length
;
4978 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, nlen
);
4979 for (i
= 0; i
< ncop
; i
++)
4980 for (j
= 0; j
< len
; j
++)
4981 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
4983 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
4988 /* This one is a bear, but mainly has to do with shuffling elements. */
4991 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
4992 gfc_expr
*pad
, gfc_expr
*order_exp
)
4994 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
4995 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
4999 gfc_expr
*e
, *result
;
5001 /* Check that argument expression types are OK. */
5002 if (!is_constant_array_expr (source
)
5003 || !is_constant_array_expr (shape_exp
)
5004 || !is_constant_array_expr (pad
)
5005 || !is_constant_array_expr (order_exp
))
5008 /* Proceed with simplification, unpacking the array. */
5015 e
= gfc_constructor_lookup_expr (shape_exp
->value
.constructor
, rank
);
5019 gfc_extract_int (e
, &shape
[rank
]);
5021 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
5022 gcc_assert (shape
[rank
] >= 0);
5027 gcc_assert (rank
> 0);
5029 /* Now unpack the order array if present. */
5030 if (order_exp
== NULL
)
5032 for (i
= 0; i
< rank
; i
++)
5037 for (i
= 0; i
< rank
; i
++)
5040 for (i
= 0; i
< rank
; i
++)
5042 e
= gfc_constructor_lookup_expr (order_exp
->value
.constructor
, i
);
5045 gfc_extract_int (e
, &order
[i
]);
5047 gcc_assert (order
[i
] >= 1 && order
[i
] <= rank
);
5049 gcc_assert (x
[order
[i
]] == 0);
5054 /* Count the elements in the source and padding arrays. */
5059 gfc_array_size (pad
, &size
);
5060 npad
= mpz_get_ui (size
);
5064 gfc_array_size (source
, &size
);
5065 nsource
= mpz_get_ui (size
);
5068 /* If it weren't for that pesky permutation we could just loop
5069 through the source and round out any shortage with pad elements.
5070 But no, someone just had to have the compiler do something the
5071 user should be doing. */
5073 for (i
= 0; i
< rank
; i
++)
5076 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5078 if (source
->ts
.type
== BT_DERIVED
)
5079 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5080 result
->rank
= rank
;
5081 result
->shape
= gfc_get_shape (rank
);
5082 for (i
= 0; i
< rank
; i
++)
5083 mpz_init_set_ui (result
->shape
[i
], shape
[i
]);
5085 while (nsource
> 0 || npad
> 0)
5087 /* Figure out which element to extract. */
5088 mpz_set_ui (index
, 0);
5090 for (i
= rank
- 1; i
>= 0; i
--)
5092 mpz_add_ui (index
, index
, x
[order
[i
]]);
5094 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
5097 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
5098 gfc_internal_error ("Reshaped array too large at %C");
5100 j
= mpz_get_ui (index
);
5103 e
= gfc_constructor_lookup_expr (source
->value
.constructor
, j
);
5106 gcc_assert (npad
> 0);
5110 e
= gfc_constructor_lookup_expr (pad
->value
.constructor
, j
);
5114 gfc_constructor_append_expr (&result
->value
.constructor
,
5115 gfc_copy_expr (e
), &e
->where
);
5117 /* Calculate the next element. */
5121 if (++x
[i
] < shape
[i
])
5137 gfc_simplify_rrspacing (gfc_expr
*x
)
5143 if (x
->expr_type
!= EXPR_CONSTANT
)
5146 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
5148 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5149 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5151 /* Special case x = -0 and 0. */
5152 if (mpfr_sgn (result
->value
.real
) == 0)
5154 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5158 /* | x * 2**(-e) | * 2**p. */
5159 e
= - (long int) mpfr_get_exp (x
->value
.real
);
5160 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
5162 p
= (long int) gfc_real_kinds
[i
].digits
;
5163 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
5165 return range_check (result
, "RRSPACING");
5170 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
5172 int k
, neg_flag
, power
, exp_range
;
5173 mpfr_t scale
, radix
;
5176 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5179 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5181 if (mpfr_sgn (x
->value
.real
) == 0)
5183 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5187 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5189 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
5191 /* This check filters out values of i that would overflow an int. */
5192 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
5193 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
5195 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
5196 gfc_free_expr (result
);
5197 return &gfc_bad_expr
;
5200 /* Compute scale = radix ** power. */
5201 power
= mpz_get_si (i
->value
.integer
);
5211 gfc_set_model_kind (x
->ts
.kind
);
5214 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
5215 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
5218 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5220 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5222 mpfr_clears (scale
, radix
, NULL
);
5224 return range_check (result
, "SCALE");
5228 /* Variants of strspn and strcspn that operate on wide characters. */
5231 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5234 const gfc_char_t
*c
;
5238 for (c
= s2
; *c
; c
++)
5252 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5255 const gfc_char_t
*c
;
5259 for (c
= s2
; *c
; c
++)
5274 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
5279 size_t indx
, len
, lenc
;
5280 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
5283 return &gfc_bad_expr
;
5285 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
5286 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
5289 if (b
!= NULL
&& b
->value
.logical
!= 0)
5294 len
= e
->value
.character
.length
;
5295 lenc
= c
->value
.character
.length
;
5297 if (len
== 0 || lenc
== 0)
5305 indx
= wide_strcspn (e
->value
.character
.string
,
5306 c
->value
.character
.string
) + 1;
5313 for (indx
= len
; indx
> 0; indx
--)
5315 for (i
= 0; i
< lenc
; i
++)
5317 if (c
->value
.character
.string
[i
]
5318 == e
->value
.character
.string
[indx
- 1])
5327 result
= gfc_get_int_expr (k
, &e
->where
, indx
);
5328 return range_check (result
, "SCAN");
5333 gfc_simplify_selected_char_kind (gfc_expr
*e
)
5337 if (e
->expr_type
!= EXPR_CONSTANT
)
5340 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
5341 || gfc_compare_with_Cstring (e
, "default", false) == 0)
5343 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
5348 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5353 gfc_simplify_selected_int_kind (gfc_expr
*e
)
5357 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
) != NULL
)
5362 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
5363 if (gfc_integer_kinds
[i
].range
>= range
5364 && gfc_integer_kinds
[i
].kind
< kind
)
5365 kind
= gfc_integer_kinds
[i
].kind
;
5367 if (kind
== INT_MAX
)
5370 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5375 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
, gfc_expr
*rdx
)
5377 int range
, precision
, radix
, i
, kind
, found_precision
, found_range
,
5379 locus
*loc
= &gfc_current_locus
;
5385 if (p
->expr_type
!= EXPR_CONSTANT
5386 || gfc_extract_int (p
, &precision
) != NULL
)
5395 if (q
->expr_type
!= EXPR_CONSTANT
5396 || gfc_extract_int (q
, &range
) != NULL
)
5407 if (rdx
->expr_type
!= EXPR_CONSTANT
5408 || gfc_extract_int (rdx
, &radix
) != NULL
)
5416 found_precision
= 0;
5420 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
5422 if (gfc_real_kinds
[i
].precision
>= precision
)
5423 found_precision
= 1;
5425 if (gfc_real_kinds
[i
].range
>= range
)
5428 if (gfc_real_kinds
[i
].radix
>= radix
)
5431 if (gfc_real_kinds
[i
].precision
>= precision
5432 && gfc_real_kinds
[i
].range
>= range
5433 && gfc_real_kinds
[i
].radix
>= radix
&& gfc_real_kinds
[i
].kind
< kind
)
5434 kind
= gfc_real_kinds
[i
].kind
;
5437 if (kind
== INT_MAX
)
5439 if (found_radix
&& found_range
&& !found_precision
)
5441 else if (found_radix
&& found_precision
&& !found_range
)
5443 else if (found_radix
&& !found_precision
&& !found_range
)
5445 else if (found_radix
)
5451 return gfc_get_int_expr (gfc_default_integer_kind
, loc
, kind
);
5456 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
5459 mpfr_t exp
, absv
, log2
, pow2
, frac
;
5462 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5465 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5467 if (mpfr_sgn (x
->value
.real
) == 0)
5469 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5473 gfc_set_model_kind (x
->ts
.kind
);
5480 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
5481 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
5483 mpfr_trunc (log2
, log2
);
5484 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
5486 /* Old exponent value, and fraction. */
5487 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
5489 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
5492 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
5493 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
5495 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
5497 return range_check (result
, "SET_EXPONENT");
5502 gfc_simplify_shape (gfc_expr
*source
, gfc_expr
*kind
)
5504 mpz_t shape
[GFC_MAX_DIMENSIONS
];
5505 gfc_expr
*result
, *e
, *f
;
5509 int k
= get_kind (BT_INTEGER
, kind
, "SHAPE", gfc_default_integer_kind
);
5511 if (source
->rank
== -1)
5514 result
= gfc_get_array_expr (BT_INTEGER
, k
, &source
->where
);
5516 if (source
->rank
== 0)
5519 if (source
->expr_type
== EXPR_VARIABLE
)
5521 ar
= gfc_find_array_ref (source
);
5522 t
= gfc_array_ref_shape (ar
, shape
);
5524 else if (source
->shape
)
5527 for (n
= 0; n
< source
->rank
; n
++)
5529 mpz_init (shape
[n
]);
5530 mpz_set (shape
[n
], source
->shape
[n
]);
5536 for (n
= 0; n
< source
->rank
; n
++)
5538 e
= gfc_get_constant_expr (BT_INTEGER
, k
, &source
->where
);
5542 mpz_set (e
->value
.integer
, shape
[n
]);
5543 mpz_clear (shape
[n
]);
5547 mpz_set_ui (e
->value
.integer
, n
+ 1);
5549 f
= gfc_simplify_size (source
, e
, NULL
);
5553 gfc_free_expr (result
);
5560 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
5568 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
5571 gfc_expr
*return_value
;
5573 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
5576 return &gfc_bad_expr
;
5578 /* For unary operations, the size of the result is given by the size
5579 of the operand. For binary ones, it's the size of the first operand
5580 unless it is scalar, then it is the size of the second. */
5581 if (array
->expr_type
== EXPR_OP
&& !array
->value
.op
.uop
)
5583 gfc_expr
* replacement
;
5584 gfc_expr
* simplified
;
5586 switch (array
->value
.op
.op
)
5588 /* Unary operations. */
5590 case INTRINSIC_UPLUS
:
5591 case INTRINSIC_UMINUS
:
5592 case INTRINSIC_PARENTHESES
:
5593 replacement
= array
->value
.op
.op1
;
5596 /* Binary operations. If any one of the operands is scalar, take
5597 the other one's size. If both of them are arrays, it does not
5598 matter -- try to find one with known shape, if possible. */
5600 if (array
->value
.op
.op1
->rank
== 0)
5601 replacement
= array
->value
.op
.op2
;
5602 else if (array
->value
.op
.op2
->rank
== 0)
5603 replacement
= array
->value
.op
.op1
;
5606 simplified
= gfc_simplify_size (array
->value
.op
.op1
, dim
, kind
);
5610 replacement
= array
->value
.op
.op2
;
5615 /* Try to reduce it directly if possible. */
5616 simplified
= gfc_simplify_size (replacement
, dim
, kind
);
5618 /* Otherwise, we build a new SIZE call. This is hopefully at least
5619 simpler than the original one. */
5621 simplified
= gfc_build_intrinsic_call (gfc_current_ns
,
5622 GFC_ISYM_SIZE
, "size",
5624 gfc_copy_expr (replacement
),
5625 gfc_copy_expr (dim
),
5626 gfc_copy_expr (kind
));
5633 if (!gfc_array_size (array
, &size
))
5638 if (dim
->expr_type
!= EXPR_CONSTANT
)
5641 d
= mpz_get_ui (dim
->value
.integer
) - 1;
5642 if (!gfc_array_dimen_size (array
, d
, &size
))
5646 return_value
= gfc_get_int_expr (k
, &array
->where
, mpz_get_si (size
));
5648 return return_value
;
5652 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
5653 multiplied by the array size. */
5656 gfc_simplify_sizeof (gfc_expr
*x
)
5658 gfc_expr
*result
= NULL
;
5661 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
5664 if (x
->ts
.type
== BT_CHARACTER
5665 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
5666 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
5669 if (x
->rank
&& x
->expr_type
!= EXPR_ARRAY
5670 && !gfc_array_size (x
, &array_size
))
5673 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_index_integer_kind
,
5675 mpz_set_si (result
->value
.integer
, gfc_target_expr_size (x
));
5677 /* gfc_target_expr_size already takes the array size for array constructors
5679 if (x
->rank
&& x
->expr_type
!= EXPR_ARRAY
)
5681 mpz_mul (result
->value
.integer
, result
->value
.integer
, array_size
);
5682 mpz_clear (array_size
);
5689 /* STORAGE_SIZE returns the size in bits of a single array element. */
5692 gfc_simplify_storage_size (gfc_expr
*x
,
5695 gfc_expr
*result
= NULL
;
5699 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
5702 if (x
->ts
.type
== BT_CHARACTER
5703 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
5704 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
5707 k
= get_kind (BT_INTEGER
, kind
, "STORAGE_SIZE", gfc_default_integer_kind
);
5709 return &gfc_bad_expr
;
5711 if (x
->expr_type
== EXPR_ARRAY
)
5713 gfc_constructor
*c
= gfc_constructor_first (x
->value
.constructor
);
5714 elt_size
= gfc_target_expr_size (c
->expr
);
5717 elt_size
= gfc_target_expr_size (x
);
5719 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_index_integer_kind
,
5721 mpz_set_si (result
->value
.integer
, elt_size
);
5723 mpz_mul_ui (result
->value
.integer
, result
->value
.integer
, BITS_PER_UNIT
);
5729 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
5733 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
5736 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5741 mpz_abs (result
->value
.integer
, x
->value
.integer
);
5742 if (mpz_sgn (y
->value
.integer
) < 0)
5743 mpz_neg (result
->value
.integer
, result
->value
.integer
);
5747 if (gfc_option
.flag_sign_zero
)
5748 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
5751 mpfr_setsign (result
->value
.real
, x
->value
.real
,
5752 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
5756 gfc_internal_error ("Bad type in gfc_simplify_sign");
5764 gfc_simplify_sin (gfc_expr
*x
)
5768 if (x
->expr_type
!= EXPR_CONSTANT
)
5771 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5776 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5780 gfc_set_model (x
->value
.real
);
5781 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5785 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
5788 return range_check (result
, "SIN");
5793 gfc_simplify_sinh (gfc_expr
*x
)
5797 if (x
->expr_type
!= EXPR_CONSTANT
)
5800 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5805 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5809 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5816 return range_check (result
, "SINH");
5820 /* The argument is always a double precision real that is converted to
5821 single precision. TODO: Rounding! */
5824 gfc_simplify_sngl (gfc_expr
*a
)
5828 if (a
->expr_type
!= EXPR_CONSTANT
)
5831 result
= gfc_real2real (a
, gfc_default_real_kind
);
5832 return range_check (result
, "SNGL");
5837 gfc_simplify_spacing (gfc_expr
*x
)
5843 if (x
->expr_type
!= EXPR_CONSTANT
)
5846 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
5848 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5850 /* Special case x = 0 and -0. */
5851 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5852 if (mpfr_sgn (result
->value
.real
) == 0)
5854 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
5858 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5859 are the radix, exponent of x, and precision. This excludes the
5860 possibility of subnormal numbers. Fortran 2003 states the result is
5861 b**max(e - p, emin - 1). */
5863 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
5864 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
5865 en
= en
> ep
? en
: ep
;
5867 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
5868 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
5870 return range_check (result
, "SPACING");
5875 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
5877 gfc_expr
*result
= 0L;
5878 int i
, j
, dim
, ncopies
;
5881 if ((!gfc_is_constant_expr (source
)
5882 && !is_constant_array_expr (source
))
5883 || !gfc_is_constant_expr (dim_expr
)
5884 || !gfc_is_constant_expr (ncopies_expr
))
5887 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
5888 gfc_extract_int (dim_expr
, &dim
);
5889 dim
-= 1; /* zero-base DIM */
5891 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
5892 gfc_extract_int (ncopies_expr
, &ncopies
);
5893 ncopies
= MAX (ncopies
, 0);
5895 /* Do not allow the array size to exceed the limit for an array
5897 if (source
->expr_type
== EXPR_ARRAY
)
5899 if (!gfc_array_size (source
, &size
))
5900 gfc_internal_error ("Failure getting length of a constant array.");
5903 mpz_init_set_ui (size
, 1);
5905 if (mpz_get_si (size
)*ncopies
> gfc_option
.flag_max_array_constructor
)
5908 if (source
->expr_type
== EXPR_CONSTANT
)
5910 gcc_assert (dim
== 0);
5912 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5914 if (source
->ts
.type
== BT_DERIVED
)
5915 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5917 result
->shape
= gfc_get_shape (result
->rank
);
5918 mpz_init_set_si (result
->shape
[0], ncopies
);
5920 for (i
= 0; i
< ncopies
; ++i
)
5921 gfc_constructor_append_expr (&result
->value
.constructor
,
5922 gfc_copy_expr (source
), NULL
);
5924 else if (source
->expr_type
== EXPR_ARRAY
)
5926 int offset
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
5927 gfc_constructor
*source_ctor
;
5929 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
5930 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
5932 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5934 if (source
->ts
.type
== BT_DERIVED
)
5935 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5936 result
->rank
= source
->rank
+ 1;
5937 result
->shape
= gfc_get_shape (result
->rank
);
5939 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
5942 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
5944 mpz_init_set_si (result
->shape
[i
], ncopies
);
5946 extent
[i
] = mpz_get_si (result
->shape
[i
]);
5947 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
5951 for (source_ctor
= gfc_constructor_first (source
->value
.constructor
);
5952 source_ctor
; source_ctor
= gfc_constructor_next (source_ctor
))
5954 for (i
= 0; i
< ncopies
; ++i
)
5955 gfc_constructor_insert_expr (&result
->value
.constructor
,
5956 gfc_copy_expr (source_ctor
->expr
),
5957 NULL
, offset
+ i
* rstride
[dim
]);
5959 offset
+= (dim
== 0 ? ncopies
: 1);
5963 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
5964 Replace NULL with gcc_unreachable() after implementing
5965 gfc_simplify_cshift(). */
5968 if (source
->ts
.type
== BT_CHARACTER
)
5969 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
5976 gfc_simplify_sqrt (gfc_expr
*e
)
5978 gfc_expr
*result
= NULL
;
5980 if (e
->expr_type
!= EXPR_CONSTANT
)
5986 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
5988 gfc_error ("Argument of SQRT at %L has a negative value",
5990 return &gfc_bad_expr
;
5992 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
5993 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
5997 gfc_set_model (e
->value
.real
);
5999 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6000 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
6004 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
6007 return range_check (result
, "SQRT");
6012 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
6014 return simplify_transformation (array
, dim
, mask
, 0, gfc_add
);
6019 gfc_simplify_tan (gfc_expr
*x
)
6023 if (x
->expr_type
!= EXPR_CONSTANT
)
6026 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6031 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6035 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6042 return range_check (result
, "TAN");
6047 gfc_simplify_tanh (gfc_expr
*x
)
6051 if (x
->expr_type
!= EXPR_CONSTANT
)
6054 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6059 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6063 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6070 return range_check (result
, "TANH");
6075 gfc_simplify_tiny (gfc_expr
*e
)
6080 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
6082 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
6083 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
6090 gfc_simplify_trailz (gfc_expr
*e
)
6092 unsigned long tz
, bs
;
6095 if (e
->expr_type
!= EXPR_CONSTANT
)
6098 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
6099 bs
= gfc_integer_kinds
[i
].bit_size
;
6100 tz
= mpz_scan1 (e
->value
.integer
, 0);
6102 return gfc_get_int_expr (gfc_default_integer_kind
,
6103 &e
->where
, MIN (tz
, bs
));
6108 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
6111 gfc_expr
*mold_element
;
6116 unsigned char *buffer
;
6117 size_t result_length
;
6120 if (!gfc_is_constant_expr (source
)
6121 || (gfc_init_expr_flag
&& !gfc_is_constant_expr (mold
))
6122 || !gfc_is_constant_expr (size
))
6125 if (!gfc_calculate_transfer_sizes (source
, mold
, size
, &source_size
,
6126 &result_size
, &result_length
))
6129 /* Calculate the size of the source. */
6130 if (source
->expr_type
== EXPR_ARRAY
6131 && !gfc_array_size (source
, &tmp
))
6132 gfc_internal_error ("Failure getting length of a constant array.");
6134 /* Create an empty new expression with the appropriate characteristics. */
6135 result
= gfc_get_constant_expr (mold
->ts
.type
, mold
->ts
.kind
,
6137 result
->ts
= mold
->ts
;
6139 mold_element
= mold
->expr_type
== EXPR_ARRAY
6140 ? gfc_constructor_first (mold
->value
.constructor
)->expr
6143 /* Set result character length, if needed. Note that this needs to be
6144 set even for array expressions, in order to pass this information into
6145 gfc_target_interpret_expr. */
6146 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
6147 result
->value
.character
.length
= mold_element
->value
.character
.length
;
6149 /* Set the number of elements in the result, and determine its size. */
6151 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
6153 result
->expr_type
= EXPR_ARRAY
;
6155 result
->shape
= gfc_get_shape (1);
6156 mpz_init_set_ui (result
->shape
[0], result_length
);
6161 /* Allocate the buffer to store the binary version of the source. */
6162 buffer_size
= MAX (source_size
, result_size
);
6163 buffer
= (unsigned char*)alloca (buffer_size
);
6164 memset (buffer
, 0, buffer_size
);
6166 /* Now write source to the buffer. */
6167 gfc_target_encode_expr (source
, buffer
, buffer_size
);
6169 /* And read the buffer back into the new expression. */
6170 gfc_target_interpret_expr (buffer
, buffer_size
, result
, false);
6177 gfc_simplify_transpose (gfc_expr
*matrix
)
6179 int row
, matrix_rows
, col
, matrix_cols
;
6182 if (!is_constant_array_expr (matrix
))
6185 gcc_assert (matrix
->rank
== 2);
6187 result
= gfc_get_array_expr (matrix
->ts
.type
, matrix
->ts
.kind
,
6190 result
->shape
= gfc_get_shape (result
->rank
);
6191 mpz_set (result
->shape
[0], matrix
->shape
[1]);
6192 mpz_set (result
->shape
[1], matrix
->shape
[0]);
6194 if (matrix
->ts
.type
== BT_CHARACTER
)
6195 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
6196 else if (matrix
->ts
.type
== BT_DERIVED
)
6197 result
->ts
.u
.derived
= matrix
->ts
.u
.derived
;
6199 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
6200 matrix_cols
= mpz_get_si (matrix
->shape
[1]);
6201 for (row
= 0; row
< matrix_rows
; ++row
)
6202 for (col
= 0; col
< matrix_cols
; ++col
)
6204 gfc_expr
*e
= gfc_constructor_lookup_expr (matrix
->value
.constructor
,
6205 col
* matrix_rows
+ row
);
6206 gfc_constructor_insert_expr (&result
->value
.constructor
,
6207 gfc_copy_expr (e
), &matrix
->where
,
6208 row
* matrix_cols
+ col
);
6216 gfc_simplify_trim (gfc_expr
*e
)
6219 int count
, i
, len
, lentrim
;
6221 if (e
->expr_type
!= EXPR_CONSTANT
)
6224 len
= e
->value
.character
.length
;
6225 for (count
= 0, i
= 1; i
<= len
; ++i
)
6227 if (e
->value
.character
.string
[len
- i
] == ' ')
6233 lentrim
= len
- count
;
6235 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, lentrim
);
6236 for (i
= 0; i
< lentrim
; i
++)
6237 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
6244 gfc_simplify_image_index (gfc_expr
*coarray
, gfc_expr
*sub
)
6249 gfc_constructor
*sub_cons
;
6253 if (!is_constant_array_expr (sub
))
6256 /* Follow any component references. */
6257 as
= coarray
->symtree
->n
.sym
->as
;
6258 for (ref
= coarray
->ref
; ref
; ref
= ref
->next
)
6259 if (ref
->type
== REF_COMPONENT
)
6262 if (as
->type
== AS_DEFERRED
)
6265 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6266 the cosubscript addresses the first image. */
6268 sub_cons
= gfc_constructor_first (sub
->value
.constructor
);
6271 for (d
= 1; d
<= as
->corank
; d
++)
6276 gcc_assert (sub_cons
!= NULL
);
6278 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 0, as
,
6280 if (ca_bound
== NULL
)
6283 if (ca_bound
== &gfc_bad_expr
)
6286 cmp
= mpz_cmp (ca_bound
->value
.integer
, sub_cons
->expr
->value
.integer
);
6290 gfc_free_expr (ca_bound
);
6291 sub_cons
= gfc_constructor_next (sub_cons
);
6295 first_image
= false;
6299 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6300 "SUB has %ld and COARRAY lower bound is %ld)",
6302 mpz_get_si (sub_cons
->expr
->value
.integer
),
6303 mpz_get_si (ca_bound
->value
.integer
));
6304 gfc_free_expr (ca_bound
);
6305 return &gfc_bad_expr
;
6308 gfc_free_expr (ca_bound
);
6310 /* Check whether upperbound is valid for the multi-images case. */
6313 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 1, as
,
6315 if (ca_bound
== &gfc_bad_expr
)
6318 if (ca_bound
&& ca_bound
->expr_type
== EXPR_CONSTANT
6319 && mpz_cmp (ca_bound
->value
.integer
,
6320 sub_cons
->expr
->value
.integer
) < 0)
6322 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6323 "SUB has %ld and COARRAY upper bound is %ld)",
6325 mpz_get_si (sub_cons
->expr
->value
.integer
),
6326 mpz_get_si (ca_bound
->value
.integer
));
6327 gfc_free_expr (ca_bound
);
6328 return &gfc_bad_expr
;
6332 gfc_free_expr (ca_bound
);
6335 sub_cons
= gfc_constructor_next (sub_cons
);
6338 gcc_assert (sub_cons
== NULL
);
6340 if (gfc_option
.coarray
!= GFC_FCOARRAY_SINGLE
&& !first_image
)
6343 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6344 &gfc_current_locus
);
6346 mpz_set_si (result
->value
.integer
, 1);
6348 mpz_set_si (result
->value
.integer
, 0);
6355 gfc_simplify_this_image (gfc_expr
*coarray
, gfc_expr
*dim
)
6357 if (gfc_option
.coarray
!= GFC_FCOARRAY_SINGLE
)
6360 if (coarray
== NULL
)
6363 /* FIXME: gfc_current_locus is wrong. */
6364 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6365 &gfc_current_locus
);
6366 mpz_set_si (result
->value
.integer
, 1);
6370 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6371 return simplify_cobound (coarray
, dim
, NULL
, 0);
6376 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6378 return simplify_bound (array
, dim
, kind
, 1);
6382 gfc_simplify_ucobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6384 return simplify_cobound (array
, dim
, kind
, 1);
6389 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
6391 gfc_expr
*result
, *e
;
6392 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
6394 if (!is_constant_array_expr (vector
)
6395 || !is_constant_array_expr (mask
)
6396 || (!gfc_is_constant_expr (field
)
6397 && !is_constant_array_expr (field
)))
6400 result
= gfc_get_array_expr (vector
->ts
.type
, vector
->ts
.kind
,
6402 if (vector
->ts
.type
== BT_DERIVED
)
6403 result
->ts
.u
.derived
= vector
->ts
.u
.derived
;
6404 result
->rank
= mask
->rank
;
6405 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
6407 if (vector
->ts
.type
== BT_CHARACTER
)
6408 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
6410 vector_ctor
= gfc_constructor_first (vector
->value
.constructor
);
6411 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
6413 = field
->expr_type
== EXPR_ARRAY
6414 ? gfc_constructor_first (field
->value
.constructor
)
6419 if (mask_ctor
->expr
->value
.logical
)
6421 gcc_assert (vector_ctor
);
6422 e
= gfc_copy_expr (vector_ctor
->expr
);
6423 vector_ctor
= gfc_constructor_next (vector_ctor
);
6425 else if (field
->expr_type
== EXPR_ARRAY
)
6426 e
= gfc_copy_expr (field_ctor
->expr
);
6428 e
= gfc_copy_expr (field
);
6430 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
6432 mask_ctor
= gfc_constructor_next (mask_ctor
);
6433 field_ctor
= gfc_constructor_next (field_ctor
);
6441 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
6445 size_t index
, len
, lenset
;
6447 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
6450 return &gfc_bad_expr
;
6452 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
6453 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
6456 if (b
!= NULL
&& b
->value
.logical
!= 0)
6461 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &s
->where
);
6463 len
= s
->value
.character
.length
;
6464 lenset
= set
->value
.character
.length
;
6468 mpz_set_ui (result
->value
.integer
, 0);
6476 mpz_set_ui (result
->value
.integer
, 1);
6480 index
= wide_strspn (s
->value
.character
.string
,
6481 set
->value
.character
.string
) + 1;
6490 mpz_set_ui (result
->value
.integer
, len
);
6493 for (index
= len
; index
> 0; index
--)
6495 for (i
= 0; i
< lenset
; i
++)
6497 if (s
->value
.character
.string
[index
- 1]
6498 == set
->value
.character
.string
[i
])
6506 mpz_set_ui (result
->value
.integer
, index
);
6512 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
6517 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6520 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
6525 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
6526 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
6527 return range_check (result
, "XOR");
6530 return gfc_get_logical_expr (kind
, &x
->where
,
6531 (x
->value
.logical
&& !y
->value
.logical
)
6532 || (!x
->value
.logical
&& y
->value
.logical
));
6540 /****************** Constant simplification *****************/
6542 /* Master function to convert one constant to another. While this is
6543 used as a simplification function, it requires the destination type
6544 and kind information which is supplied by a special case in
6548 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
6550 gfc_expr
*g
, *result
, *(*f
) (gfc_expr
*, int);
6565 f
= gfc_int2complex
;
6585 f
= gfc_real2complex
;
6596 f
= gfc_complex2int
;
6599 f
= gfc_complex2real
;
6602 f
= gfc_complex2complex
;
6628 f
= gfc_hollerith2int
;
6632 f
= gfc_hollerith2real
;
6636 f
= gfc_hollerith2complex
;
6640 f
= gfc_hollerith2character
;
6644 f
= gfc_hollerith2logical
;
6654 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
6659 switch (e
->expr_type
)
6662 result
= f (e
, kind
);
6664 return &gfc_bad_expr
;
6668 if (!gfc_is_constant_expr (e
))
6671 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
6672 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
6673 result
->rank
= e
->rank
;
6675 for (c
= gfc_constructor_first (e
->value
.constructor
);
6676 c
; c
= gfc_constructor_next (c
))
6679 if (c
->iterator
== NULL
)
6680 tmp
= f (c
->expr
, kind
);
6683 g
= gfc_convert_constant (c
->expr
, type
, kind
);
6684 if (g
== &gfc_bad_expr
)
6686 gfc_free_expr (result
);
6694 gfc_free_expr (result
);
6698 gfc_constructor_append_expr (&result
->value
.constructor
,
6712 /* Function for converting character constants. */
6714 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
6719 if (!gfc_is_constant_expr (e
))
6722 if (e
->expr_type
== EXPR_CONSTANT
)
6724 /* Simple case of a scalar. */
6725 result
= gfc_get_constant_expr (BT_CHARACTER
, kind
, &e
->where
);
6727 return &gfc_bad_expr
;
6729 result
->value
.character
.length
= e
->value
.character
.length
;
6730 result
->value
.character
.string
6731 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
6732 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
6733 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
6735 /* Check we only have values representable in the destination kind. */
6736 for (i
= 0; i
< result
->value
.character
.length
; i
++)
6737 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
6740 gfc_error ("Character '%s' in string at %L cannot be converted "
6741 "into character kind %d",
6742 gfc_print_wide_char (result
->value
.character
.string
[i
]),
6744 return &gfc_bad_expr
;
6749 else if (e
->expr_type
== EXPR_ARRAY
)
6751 /* For an array constructor, we convert each constructor element. */
6754 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
6755 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
6756 result
->rank
= e
->rank
;
6757 result
->ts
.u
.cl
= e
->ts
.u
.cl
;
6759 for (c
= gfc_constructor_first (e
->value
.constructor
);
6760 c
; c
= gfc_constructor_next (c
))
6762 gfc_expr
*tmp
= gfc_convert_char_constant (c
->expr
, type
, kind
);
6763 if (tmp
== &gfc_bad_expr
)
6765 gfc_free_expr (result
);
6766 return &gfc_bad_expr
;
6771 gfc_free_expr (result
);
6775 gfc_constructor_append_expr (&result
->value
.constructor
,
6787 gfc_simplify_compiler_options (void)
6792 str
= gfc_get_option_string ();
6793 result
= gfc_get_character_expr (gfc_default_character_kind
,
6794 &gfc_current_locus
, str
, strlen (str
));
6801 gfc_simplify_compiler_version (void)
6806 len
= strlen ("GCC version ") + strlen (version_string
);
6807 buffer
= XALLOCAVEC (char, len
+ 1);
6808 snprintf (buffer
, len
+ 1, "GCC version %s", version_string
);
6809 return gfc_get_character_expr (gfc_default_character_kind
,
6810 &gfc_current_locus
, buffer
, len
);