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 "version.h" /* For version_string. */
33 gfc_expr gfc_bad_expr
;
36 /* Note that 'simplification' is not just transforming expressions.
37 For functions that are not simplified at compile time, range
38 checking is done if possible.
40 The return convention is that each simplification function returns:
42 A new expression node corresponding to the simplified arguments.
43 The original arguments are destroyed by the caller, and must not
44 be a part of the new expression.
46 NULL pointer indicating that no simplification was possible and
47 the original expression should remain intact.
49 An expression pointer to gfc_bad_expr (a static placeholder)
50 indicating that some error has prevented simplification. The
51 error is generated within the function and should be propagated
54 By the time a simplification function gets control, it has been
55 decided that the function call is really supposed to be the
56 intrinsic. No type checking is strictly necessary, since only
57 valid types will be passed on. On the other hand, a simplification
58 subroutine may have to look at the type of an argument as part of
61 Array arguments are only passed to these subroutines that implement
62 the simplification of transformational intrinsics.
64 The functions in this file don't have much comment with them, but
65 everything is reasonably straight-forward. The Standard, chapter 13
66 is the best comment you'll find for this file anyway. */
68 /* Range checks an expression node. If all goes well, returns the
69 node, otherwise returns &gfc_bad_expr and frees the node. */
72 range_check (gfc_expr
*result
, const char *name
)
77 if (result
->expr_type
!= EXPR_CONSTANT
)
80 switch (gfc_range_check (result
))
86 gfc_error ("Result of %s overflows its kind at %L", name
,
91 gfc_error ("Result of %s underflows its kind at %L", name
,
96 gfc_error ("Result of %s is NaN at %L", name
, &result
->where
);
100 gfc_error ("Result of %s gives range error for its kind at %L", name
,
105 gfc_free_expr (result
);
106 return &gfc_bad_expr
;
110 /* A helper function that gets an optional and possibly missing
111 kind parameter. Returns the kind, -1 if something went wrong. */
114 get_kind (bt type
, gfc_expr
*k
, const char *name
, int default_kind
)
121 if (k
->expr_type
!= EXPR_CONSTANT
)
123 gfc_error ("KIND parameter of %s at %L must be an initialization "
124 "expression", name
, &k
->where
);
128 if (gfc_extract_int (k
, &kind
) != NULL
129 || gfc_validate_kind (type
, kind
, true) < 0)
131 gfc_error ("Invalid KIND parameter of %s at %L", name
, &k
->where
);
139 /* Converts an mpz_t signed variable into an unsigned one, assuming
140 two's complement representations and a binary width of bitsize.
141 The conversion is a no-op unless x is negative; otherwise, it can
142 be accomplished by masking out the high bits. */
145 convert_mpz_to_unsigned (mpz_t x
, int bitsize
)
151 /* Confirm that no bits above the signed range are unset. */
152 gcc_assert (mpz_scan0 (x
, bitsize
-1) == ULONG_MAX
);
154 mpz_init_set_ui (mask
, 1);
155 mpz_mul_2exp (mask
, mask
, bitsize
);
156 mpz_sub_ui (mask
, mask
, 1);
158 mpz_and (x
, x
, mask
);
164 /* Confirm that no bits above the signed range are set. */
165 gcc_assert (mpz_scan1 (x
, bitsize
-1) == ULONG_MAX
);
170 /* Converts an mpz_t unsigned variable into a signed one, assuming
171 two's complement representations and a binary width of bitsize.
172 If the bitsize-1 bit is set, this is taken as a sign bit and
173 the number is converted to the corresponding negative number. */
176 convert_mpz_to_signed (mpz_t x
, int bitsize
)
180 /* Confirm that no bits above the unsigned range are set. */
181 gcc_assert (mpz_scan1 (x
, bitsize
) == ULONG_MAX
);
183 if (mpz_tstbit (x
, bitsize
- 1) == 1)
185 mpz_init_set_ui (mask
, 1);
186 mpz_mul_2exp (mask
, mask
, bitsize
);
187 mpz_sub_ui (mask
, mask
, 1);
189 /* We negate the number by hand, zeroing the high bits, that is
190 make it the corresponding positive number, and then have it
191 negated by GMP, giving the correct representation of the
194 mpz_add_ui (x
, x
, 1);
195 mpz_and (x
, x
, mask
);
204 /* In-place convert BOZ to REAL of the specified kind. */
207 convert_boz (gfc_expr
*x
, int kind
)
209 if (x
&& x
->ts
.type
== BT_INTEGER
&& x
->is_boz
)
216 if (!gfc_convert_boz (x
, &ts
))
217 return &gfc_bad_expr
;
224 /* Test that the expression is an constant array. */
227 is_constant_array_expr (gfc_expr
*e
)
234 if (e
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (e
))
237 for (c
= gfc_constructor_first (e
->value
.constructor
);
238 c
; c
= gfc_constructor_next (c
))
239 if (c
->expr
->expr_type
!= EXPR_CONSTANT
240 && c
->expr
->expr_type
!= EXPR_STRUCTURE
)
247 /* Initialize a transformational result expression with a given value. */
250 init_result_expr (gfc_expr
*e
, int init
, gfc_expr
*array
)
252 if (e
&& e
->expr_type
== EXPR_ARRAY
)
254 gfc_constructor
*ctor
= gfc_constructor_first (e
->value
.constructor
);
257 init_result_expr (ctor
->expr
, init
, array
);
258 ctor
= gfc_constructor_next (ctor
);
261 else if (e
&& e
->expr_type
== EXPR_CONSTANT
)
263 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
270 e
->value
.logical
= (init
? 1 : 0);
275 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].min_int
);
276 else if (init
== INT_MAX
)
277 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].huge
);
279 mpz_set_si (e
->value
.integer
, init
);
285 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
286 mpfr_neg (e
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
288 else if (init
== INT_MAX
)
289 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
291 mpfr_set_si (e
->value
.real
, init
, GFC_RND_MODE
);
295 mpc_set_si (e
->value
.complex, init
, GFC_MPC_RND_MODE
);
301 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
302 gfc_extract_int (len
, &length
);
303 string
= gfc_get_wide_string (length
+ 1);
304 gfc_wide_memset (string
, 0, length
);
306 else if (init
== INT_MAX
)
308 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
309 gfc_extract_int (len
, &length
);
310 string
= gfc_get_wide_string (length
+ 1);
311 gfc_wide_memset (string
, 255, length
);
316 string
= gfc_get_wide_string (1);
319 string
[length
] = '\0';
320 e
->value
.character
.length
= length
;
321 e
->value
.character
.string
= string
;
333 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul. */
336 compute_dot_product (gfc_expr
*matrix_a
, int stride_a
, int offset_a
,
337 gfc_expr
*matrix_b
, int stride_b
, int offset_b
)
339 gfc_expr
*result
, *a
, *b
;
341 result
= gfc_get_constant_expr (matrix_a
->ts
.type
, matrix_a
->ts
.kind
,
343 init_result_expr (result
, 0, NULL
);
345 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
346 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
349 /* Copying of expressions is required as operands are free'd
350 by the gfc_arith routines. */
351 switch (result
->ts
.type
)
354 result
= gfc_or (result
,
355 gfc_and (gfc_copy_expr (a
),
362 result
= gfc_add (result
,
363 gfc_multiply (gfc_copy_expr (a
),
371 offset_a
+= stride_a
;
372 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
374 offset_b
+= stride_b
;
375 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
382 /* Build a result expression for transformational intrinsics,
386 transformational_result (gfc_expr
*array
, gfc_expr
*dim
, bt type
,
387 int kind
, locus
* where
)
392 if (!dim
|| array
->rank
== 1)
393 return gfc_get_constant_expr (type
, kind
, where
);
395 result
= gfc_get_array_expr (type
, kind
, where
);
396 result
->shape
= gfc_copy_shape_excluding (array
->shape
, array
->rank
, dim
);
397 result
->rank
= array
->rank
- 1;
399 /* gfc_array_size() would count the number of elements in the constructor,
400 we have not built those yet. */
402 for (i
= 0; i
< result
->rank
; ++i
)
403 nelem
*= mpz_get_ui (result
->shape
[i
]);
405 for (i
= 0; i
< nelem
; ++i
)
407 gfc_constructor_append_expr (&result
->value
.constructor
,
408 gfc_get_constant_expr (type
, kind
, where
),
416 typedef gfc_expr
* (*transformational_op
)(gfc_expr
*, gfc_expr
*);
418 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
419 of COUNT intrinsic is .TRUE..
421 Interface and implementation mimics arith functions as
422 gfc_add, gfc_multiply, etc. */
424 static gfc_expr
* gfc_count (gfc_expr
*op1
, gfc_expr
*op2
)
428 gcc_assert (op1
->ts
.type
== BT_INTEGER
);
429 gcc_assert (op2
->ts
.type
== BT_LOGICAL
);
430 gcc_assert (op2
->value
.logical
);
432 result
= gfc_copy_expr (op1
);
433 mpz_add_ui (result
->value
.integer
, result
->value
.integer
, 1);
441 /* Transforms an ARRAY with operation OP, according to MASK, to a
442 scalar RESULT. E.g. called if
444 REAL, PARAMETER :: array(n, m) = ...
445 REAL, PARAMETER :: s = SUM(array)
447 where OP == gfc_add(). */
450 simplify_transformation_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
451 transformational_op op
)
454 gfc_constructor
*array_ctor
, *mask_ctor
;
456 /* Shortcut for constant .FALSE. MASK. */
458 && mask
->expr_type
== EXPR_CONSTANT
459 && !mask
->value
.logical
)
462 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
464 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
465 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
469 a
= array_ctor
->expr
;
470 array_ctor
= gfc_constructor_next (array_ctor
);
472 /* A constant MASK equals .TRUE. here and can be ignored. */
476 mask_ctor
= gfc_constructor_next (mask_ctor
);
477 if (!m
->value
.logical
)
481 result
= op (result
, gfc_copy_expr (a
));
487 /* Transforms an ARRAY with operation OP, according to MASK, to an
488 array RESULT. E.g. called if
490 REAL, PARAMETER :: array(n, m) = ...
491 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
493 where OP == gfc_multiply(). The result might be post processed using post_op. */
496 simplify_transformation_to_array (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*dim
,
497 gfc_expr
*mask
, transformational_op op
,
498 transformational_op post_op
)
501 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
502 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
503 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
505 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
506 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
507 tmpstride
[GFC_MAX_DIMENSIONS
];
509 /* Shortcut for constant .FALSE. MASK. */
511 && mask
->expr_type
== EXPR_CONSTANT
512 && !mask
->value
.logical
)
515 /* Build an indexed table for array element expressions to minimize
516 linked-list traversal. Masked elements are set to NULL. */
517 gfc_array_size (array
, &size
);
518 arraysize
= mpz_get_ui (size
);
521 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
523 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
525 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
526 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
528 for (i
= 0; i
< arraysize
; ++i
)
530 arrayvec
[i
] = array_ctor
->expr
;
531 array_ctor
= gfc_constructor_next (array_ctor
);
535 if (!mask_ctor
->expr
->value
.logical
)
538 mask_ctor
= gfc_constructor_next (mask_ctor
);
542 /* Same for the result expression. */
543 gfc_array_size (result
, &size
);
544 resultsize
= mpz_get_ui (size
);
547 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
548 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
549 for (i
= 0; i
< resultsize
; ++i
)
551 resultvec
[i
] = result_ctor
->expr
;
552 result_ctor
= gfc_constructor_next (result_ctor
);
555 gfc_extract_int (dim
, &dim_index
);
556 dim_index
-= 1; /* zero-base index */
560 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
563 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
566 dim_extent
= mpz_get_si (array
->shape
[i
]);
567 dim_stride
= tmpstride
[i
];
571 extent
[n
] = mpz_get_si (array
->shape
[i
]);
572 sstride
[n
] = tmpstride
[i
];
573 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
582 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
584 *dest
= op (*dest
, gfc_copy_expr (*src
));
591 while (!done
&& count
[n
] == extent
[n
])
594 base
-= sstride
[n
] * extent
[n
];
595 dest
-= dstride
[n
] * extent
[n
];
598 if (n
< result
->rank
)
609 /* Place updated expression in result constructor. */
610 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
611 for (i
= 0; i
< resultsize
; ++i
)
614 result_ctor
->expr
= post_op (result_ctor
->expr
, resultvec
[i
]);
616 result_ctor
->expr
= resultvec
[i
];
617 result_ctor
= gfc_constructor_next (result_ctor
);
627 simplify_transformation (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
628 int init_val
, transformational_op op
)
632 if (!is_constant_array_expr (array
)
633 || !gfc_is_constant_expr (dim
))
637 && !is_constant_array_expr (mask
)
638 && mask
->expr_type
!= EXPR_CONSTANT
)
641 result
= transformational_result (array
, dim
, array
->ts
.type
,
642 array
->ts
.kind
, &array
->where
);
643 init_result_expr (result
, init_val
, NULL
);
645 return !dim
|| array
->rank
== 1 ?
646 simplify_transformation_to_scalar (result
, array
, mask
, op
) :
647 simplify_transformation_to_array (result
, array
, dim
, mask
, op
, NULL
);
651 /********************** Simplification functions *****************************/
654 gfc_simplify_abs (gfc_expr
*e
)
658 if (e
->expr_type
!= EXPR_CONSTANT
)
664 result
= gfc_get_constant_expr (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
665 mpz_abs (result
->value
.integer
, e
->value
.integer
);
666 return range_check (result
, "IABS");
669 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
670 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
671 return range_check (result
, "ABS");
674 gfc_set_model_kind (e
->ts
.kind
);
675 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
676 mpc_abs (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
677 return range_check (result
, "CABS");
680 gfc_internal_error ("gfc_simplify_abs(): Bad type");
686 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
690 bool too_large
= false;
692 if (e
->expr_type
!= EXPR_CONSTANT
)
695 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
697 return &gfc_bad_expr
;
699 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
701 gfc_error ("Argument of %s function at %L is negative", name
,
703 return &gfc_bad_expr
;
706 if (ascii
&& gfc_option
.warn_surprising
707 && mpz_cmp_si (e
->value
.integer
, 127) > 0)
708 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
711 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
716 mpz_init_set_ui (t
, 2);
717 mpz_pow_ui (t
, t
, 32);
718 mpz_sub_ui (t
, t
, 1);
719 if (mpz_cmp (e
->value
.integer
, t
) > 0)
726 gfc_error ("Argument of %s function at %L is too large for the "
727 "collating sequence of kind %d", name
, &e
->where
, kind
);
728 return &gfc_bad_expr
;
731 result
= gfc_get_character_expr (kind
, &e
->where
, NULL
, 1);
732 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
739 /* We use the processor's collating sequence, because all
740 systems that gfortran currently works on are ASCII. */
743 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
745 return simplify_achar_char (e
, k
, "ACHAR", true);
750 gfc_simplify_acos (gfc_expr
*x
)
754 if (x
->expr_type
!= EXPR_CONSTANT
)
760 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
761 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
763 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
765 return &gfc_bad_expr
;
767 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
768 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
772 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
773 mpc_acos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
777 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
780 return range_check (result
, "ACOS");
784 gfc_simplify_acosh (gfc_expr
*x
)
788 if (x
->expr_type
!= EXPR_CONSTANT
)
794 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
796 gfc_error ("Argument of ACOSH at %L must not be less than 1",
798 return &gfc_bad_expr
;
801 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
802 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
806 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
807 mpc_acosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
811 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
814 return range_check (result
, "ACOSH");
818 gfc_simplify_adjustl (gfc_expr
*e
)
824 if (e
->expr_type
!= EXPR_CONSTANT
)
827 len
= e
->value
.character
.length
;
829 for (count
= 0, i
= 0; i
< len
; ++i
)
831 ch
= e
->value
.character
.string
[i
];
837 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
838 for (i
= 0; i
< len
- count
; ++i
)
839 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
846 gfc_simplify_adjustr (gfc_expr
*e
)
852 if (e
->expr_type
!= EXPR_CONSTANT
)
855 len
= e
->value
.character
.length
;
857 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
859 ch
= e
->value
.character
.string
[i
];
865 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
866 for (i
= 0; i
< count
; ++i
)
867 result
->value
.character
.string
[i
] = ' ';
869 for (i
= count
; i
< len
; ++i
)
870 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
877 gfc_simplify_aimag (gfc_expr
*e
)
881 if (e
->expr_type
!= EXPR_CONSTANT
)
884 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
885 mpfr_set (result
->value
.real
, mpc_imagref (e
->value
.complex), GFC_RND_MODE
);
887 return range_check (result
, "AIMAG");
892 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
894 gfc_expr
*rtrunc
, *result
;
897 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
899 return &gfc_bad_expr
;
901 if (e
->expr_type
!= EXPR_CONSTANT
)
904 rtrunc
= gfc_copy_expr (e
);
905 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
907 result
= gfc_real2real (rtrunc
, kind
);
909 gfc_free_expr (rtrunc
);
911 return range_check (result
, "AINT");
916 gfc_simplify_all (gfc_expr
*mask
, gfc_expr
*dim
)
918 return simplify_transformation (mask
, dim
, NULL
, true, gfc_and
);
923 gfc_simplify_dint (gfc_expr
*e
)
925 gfc_expr
*rtrunc
, *result
;
927 if (e
->expr_type
!= EXPR_CONSTANT
)
930 rtrunc
= gfc_copy_expr (e
);
931 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
933 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
935 gfc_free_expr (rtrunc
);
937 return range_check (result
, "DINT");
942 gfc_simplify_dreal (gfc_expr
*e
)
944 gfc_expr
*result
= NULL
;
946 if (e
->expr_type
!= EXPR_CONSTANT
)
949 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
950 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
952 return range_check (result
, "DREAL");
957 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
962 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
964 return &gfc_bad_expr
;
966 if (e
->expr_type
!= EXPR_CONSTANT
)
969 result
= gfc_get_constant_expr (e
->ts
.type
, kind
, &e
->where
);
970 mpfr_round (result
->value
.real
, e
->value
.real
);
972 return range_check (result
, "ANINT");
977 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
982 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
985 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
990 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
991 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
992 return range_check (result
, "AND");
995 return gfc_get_logical_expr (kind
, &x
->where
,
996 x
->value
.logical
&& y
->value
.logical
);
1005 gfc_simplify_any (gfc_expr
*mask
, gfc_expr
*dim
)
1007 return simplify_transformation (mask
, dim
, NULL
, false, gfc_or
);
1012 gfc_simplify_dnint (gfc_expr
*e
)
1016 if (e
->expr_type
!= EXPR_CONSTANT
)
1019 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &e
->where
);
1020 mpfr_round (result
->value
.real
, e
->value
.real
);
1022 return range_check (result
, "DNINT");
1027 gfc_simplify_asin (gfc_expr
*x
)
1031 if (x
->expr_type
!= EXPR_CONSTANT
)
1037 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1038 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1040 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1042 return &gfc_bad_expr
;
1044 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1045 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1049 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1050 mpc_asin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1054 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1057 return range_check (result
, "ASIN");
1062 gfc_simplify_asinh (gfc_expr
*x
)
1066 if (x
->expr_type
!= EXPR_CONSTANT
)
1069 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1074 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1078 mpc_asinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1082 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1085 return range_check (result
, "ASINH");
1090 gfc_simplify_atan (gfc_expr
*x
)
1094 if (x
->expr_type
!= EXPR_CONSTANT
)
1097 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1102 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1106 mpc_atan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1110 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1113 return range_check (result
, "ATAN");
1118 gfc_simplify_atanh (gfc_expr
*x
)
1122 if (x
->expr_type
!= EXPR_CONSTANT
)
1128 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
1129 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
1131 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1133 return &gfc_bad_expr
;
1135 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1136 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1140 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1141 mpc_atanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1145 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1148 return range_check (result
, "ATANH");
1153 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
1157 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1160 if (mpfr_sgn (y
->value
.real
) == 0 && mpfr_sgn (x
->value
.real
) == 0)
1162 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1163 "second argument must not be zero", &x
->where
);
1164 return &gfc_bad_expr
;
1167 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1168 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1170 return range_check (result
, "ATAN2");
1175 gfc_simplify_bessel_j0 (gfc_expr
*x
)
1179 if (x
->expr_type
!= EXPR_CONSTANT
)
1182 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1183 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1185 return range_check (result
, "BESSEL_J0");
1190 gfc_simplify_bessel_j1 (gfc_expr
*x
)
1194 if (x
->expr_type
!= EXPR_CONSTANT
)
1197 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1198 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1200 return range_check (result
, "BESSEL_J1");
1205 gfc_simplify_bessel_jn (gfc_expr
*order
, gfc_expr
*x
)
1210 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1213 n
= mpz_get_si (order
->value
.integer
);
1214 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1215 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1217 return range_check (result
, "BESSEL_JN");
1221 /* Simplify transformational form of JN and YN. */
1224 gfc_simplify_bessel_n2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
,
1231 mpfr_t x2rev
, last1
, last2
;
1233 if (x
->expr_type
!= EXPR_CONSTANT
|| order1
->expr_type
!= EXPR_CONSTANT
1234 || order2
->expr_type
!= EXPR_CONSTANT
)
1237 n1
= mpz_get_si (order1
->value
.integer
);
1238 n2
= mpz_get_si (order2
->value
.integer
);
1239 result
= gfc_get_array_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1241 result
->shape
= gfc_get_shape (1);
1242 mpz_init_set_ui (result
->shape
[0], MAX (n2
-n1
+1, 0));
1247 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1248 YN(N, 0.0) = -Inf. */
1250 if (mpfr_cmp_ui (x
->value
.real
, 0.0) == 0)
1252 if (!jn
&& gfc_option
.flag_range_check
)
1254 gfc_error ("Result of BESSEL_YN is -INF at %L", &result
->where
);
1255 gfc_free_expr (result
);
1256 return &gfc_bad_expr
;
1261 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1262 mpfr_set_ui (e
->value
.real
, 1, GFC_RND_MODE
);
1263 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1268 for (i
= n1
; i
<= n2
; i
++)
1270 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1272 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
1274 mpfr_set_inf (e
->value
.real
, -1);
1275 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1282 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1283 are stable for downward recursion and Neumann functions are stable
1284 for upward recursion. It is
1286 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1287 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1288 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1290 gfc_set_model_kind (x
->ts
.kind
);
1292 /* Get first recursion anchor. */
1296 mpfr_jn (last1
, n2
, x
->value
.real
, GFC_RND_MODE
);
1298 mpfr_yn (last1
, n1
, x
->value
.real
, GFC_RND_MODE
);
1300 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1301 mpfr_set (e
->value
.real
, last1
, GFC_RND_MODE
);
1302 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1306 gfc_free_expr (result
);
1307 return &gfc_bad_expr
;
1309 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1317 /* Get second recursion anchor. */
1321 mpfr_jn (last2
, n2
-1, x
->value
.real
, GFC_RND_MODE
);
1323 mpfr_yn (last2
, n1
+1, x
->value
.real
, GFC_RND_MODE
);
1325 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1326 mpfr_set (e
->value
.real
, last2
, GFC_RND_MODE
);
1327 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1332 gfc_free_expr (result
);
1333 return &gfc_bad_expr
;
1336 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
, -2);
1338 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1347 /* Start actual recursion. */
1350 mpfr_ui_div (x2rev
, 2, x
->value
.real
, GFC_RND_MODE
);
1352 for (i
= 2; i
<= n2
-n1
; i
++)
1354 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1356 /* Special case: For YN, if the previous N gave -INF, set
1357 also N+1 to -INF. */
1358 if (!jn
&& !gfc_option
.flag_range_check
&& mpfr_inf_p (last2
))
1360 mpfr_set_inf (e
->value
.real
, -1);
1361 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1366 mpfr_mul_si (e
->value
.real
, x2rev
, jn
? (n2
-i
+1) : (n1
+i
-1),
1368 mpfr_mul (e
->value
.real
, e
->value
.real
, last2
, GFC_RND_MODE
);
1369 mpfr_sub (e
->value
.real
, e
->value
.real
, last1
, GFC_RND_MODE
);
1371 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1373 /* Range_check frees "e" in that case. */
1379 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
,
1382 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1384 mpfr_set (last1
, last2
, GFC_RND_MODE
);
1385 mpfr_set (last2
, e
->value
.real
, GFC_RND_MODE
);
1398 gfc_free_expr (result
);
1399 return &gfc_bad_expr
;
1404 gfc_simplify_bessel_jn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1406 return gfc_simplify_bessel_n2 (order1
, order2
, x
, true);
1411 gfc_simplify_bessel_y0 (gfc_expr
*x
)
1415 if (x
->expr_type
!= EXPR_CONSTANT
)
1418 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1419 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1421 return range_check (result
, "BESSEL_Y0");
1426 gfc_simplify_bessel_y1 (gfc_expr
*x
)
1430 if (x
->expr_type
!= EXPR_CONSTANT
)
1433 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1434 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1436 return range_check (result
, "BESSEL_Y1");
1441 gfc_simplify_bessel_yn (gfc_expr
*order
, gfc_expr
*x
)
1446 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1449 n
= mpz_get_si (order
->value
.integer
);
1450 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1451 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1453 return range_check (result
, "BESSEL_YN");
1458 gfc_simplify_bessel_yn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1460 return gfc_simplify_bessel_n2 (order1
, order2
, x
, false);
1465 gfc_simplify_bit_size (gfc_expr
*e
)
1467 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1468 return gfc_get_int_expr (e
->ts
.kind
, &e
->where
,
1469 gfc_integer_kinds
[i
].bit_size
);
1474 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
1478 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
1481 if (gfc_extract_int (bit
, &b
) != NULL
|| b
< 0)
1482 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
, false);
1484 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
,
1485 mpz_tstbit (e
->value
.integer
, b
));
1490 compare_bitwise (gfc_expr
*i
, gfc_expr
*j
)
1495 gcc_assert (i
->ts
.type
== BT_INTEGER
);
1496 gcc_assert (j
->ts
.type
== BT_INTEGER
);
1498 mpz_init_set (x
, i
->value
.integer
);
1499 k
= gfc_validate_kind (i
->ts
.type
, i
->ts
.kind
, false);
1500 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
1502 mpz_init_set (y
, j
->value
.integer
);
1503 k
= gfc_validate_kind (j
->ts
.type
, j
->ts
.kind
, false);
1504 convert_mpz_to_unsigned (y
, gfc_integer_kinds
[k
].bit_size
);
1506 res
= mpz_cmp (x
, y
);
1514 gfc_simplify_bge (gfc_expr
*i
, gfc_expr
*j
)
1516 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1519 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1520 compare_bitwise (i
, j
) >= 0);
1525 gfc_simplify_bgt (gfc_expr
*i
, gfc_expr
*j
)
1527 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1530 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1531 compare_bitwise (i
, j
) > 0);
1536 gfc_simplify_ble (gfc_expr
*i
, gfc_expr
*j
)
1538 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1541 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1542 compare_bitwise (i
, j
) <= 0);
1547 gfc_simplify_blt (gfc_expr
*i
, gfc_expr
*j
)
1549 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1552 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1553 compare_bitwise (i
, j
) < 0);
1558 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
1560 gfc_expr
*ceil
, *result
;
1563 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
1565 return &gfc_bad_expr
;
1567 if (e
->expr_type
!= EXPR_CONSTANT
)
1570 ceil
= gfc_copy_expr (e
);
1571 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
1573 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
1574 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
, &e
->where
);
1576 gfc_free_expr (ceil
);
1578 return range_check (result
, "CEILING");
1583 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
1585 return simplify_achar_char (e
, k
, "CHAR", false);
1589 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1592 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
1596 if (convert_boz (x
, kind
) == &gfc_bad_expr
)
1597 return &gfc_bad_expr
;
1599 if (convert_boz (y
, kind
) == &gfc_bad_expr
)
1600 return &gfc_bad_expr
;
1602 if (x
->expr_type
!= EXPR_CONSTANT
1603 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1606 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &x
->where
);
1611 mpc_set_z (result
->value
.complex, x
->value
.integer
, GFC_MPC_RND_MODE
);
1615 mpc_set_fr (result
->value
.complex, x
->value
.real
, GFC_RND_MODE
);
1619 mpc_set (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1623 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1627 return range_check (result
, name
);
1632 mpfr_set_z (mpc_imagref (result
->value
.complex),
1633 y
->value
.integer
, GFC_RND_MODE
);
1637 mpfr_set (mpc_imagref (result
->value
.complex),
1638 y
->value
.real
, GFC_RND_MODE
);
1642 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1645 return range_check (result
, name
);
1650 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
1654 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_complex_kind
);
1656 return &gfc_bad_expr
;
1658 return simplify_cmplx ("CMPLX", x
, y
, kind
);
1663 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
1667 if (x
->ts
.type
== BT_INTEGER
&& y
->ts
.type
== BT_INTEGER
)
1668 kind
= gfc_default_complex_kind
;
1669 else if (x
->ts
.type
== BT_REAL
|| y
->ts
.type
== BT_INTEGER
)
1671 else if (x
->ts
.type
== BT_INTEGER
|| y
->ts
.type
== BT_REAL
)
1673 else if (x
->ts
.type
== BT_REAL
&& y
->ts
.type
== BT_REAL
)
1674 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
1678 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
1683 gfc_simplify_conjg (gfc_expr
*e
)
1687 if (e
->expr_type
!= EXPR_CONSTANT
)
1690 result
= gfc_copy_expr (e
);
1691 mpc_conj (result
->value
.complex, result
->value
.complex, GFC_MPC_RND_MODE
);
1693 return range_check (result
, "CONJG");
1698 gfc_simplify_cos (gfc_expr
*x
)
1702 if (x
->expr_type
!= EXPR_CONSTANT
)
1705 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1710 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1714 gfc_set_model_kind (x
->ts
.kind
);
1715 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1719 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1722 return range_check (result
, "COS");
1727 gfc_simplify_cosh (gfc_expr
*x
)
1731 if (x
->expr_type
!= EXPR_CONSTANT
)
1734 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1739 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1743 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1750 return range_check (result
, "COSH");
1755 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
1759 if (!is_constant_array_expr (mask
)
1760 || !gfc_is_constant_expr (dim
)
1761 || !gfc_is_constant_expr (kind
))
1764 result
= transformational_result (mask
, dim
,
1766 get_kind (BT_INTEGER
, kind
, "COUNT",
1767 gfc_default_integer_kind
),
1770 init_result_expr (result
, 0, NULL
);
1772 /* Passing MASK twice, once as data array, once as mask.
1773 Whenever gfc_count is called, '1' is added to the result. */
1774 return !dim
|| mask
->rank
== 1 ?
1775 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
1776 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
, NULL
);
1781 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
1783 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
1788 gfc_simplify_dble (gfc_expr
*e
)
1790 gfc_expr
*result
= NULL
;
1792 if (e
->expr_type
!= EXPR_CONSTANT
)
1795 if (convert_boz (e
, gfc_default_double_kind
) == &gfc_bad_expr
)
1796 return &gfc_bad_expr
;
1798 result
= gfc_convert_constant (e
, BT_REAL
, gfc_default_double_kind
);
1799 if (result
== &gfc_bad_expr
)
1800 return &gfc_bad_expr
;
1802 return range_check (result
, "DBLE");
1807 gfc_simplify_digits (gfc_expr
*x
)
1811 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
1816 digits
= gfc_integer_kinds
[i
].digits
;
1821 digits
= gfc_real_kinds
[i
].digits
;
1828 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, digits
);
1833 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
1838 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1841 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1842 result
= gfc_get_constant_expr (x
->ts
.type
, kind
, &x
->where
);
1847 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
1848 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1850 mpz_set_ui (result
->value
.integer
, 0);
1855 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
1856 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
1859 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
1864 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1867 return range_check (result
, "DIM");
1872 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
1874 if (!is_constant_array_expr (vector_a
)
1875 || !is_constant_array_expr (vector_b
))
1878 gcc_assert (vector_a
->rank
== 1);
1879 gcc_assert (vector_b
->rank
== 1);
1880 gcc_assert (gfc_compare_types (&vector_a
->ts
, &vector_b
->ts
));
1882 return compute_dot_product (vector_a
, 1, 0, vector_b
, 1, 0);
1887 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
1889 gfc_expr
*a1
, *a2
, *result
;
1891 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1894 a1
= gfc_real2real (x
, gfc_default_double_kind
);
1895 a2
= gfc_real2real (y
, gfc_default_double_kind
);
1897 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &x
->where
);
1898 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
1903 return range_check (result
, "DPROD");
1908 simplify_dshift (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
,
1912 int i
, k
, size
, shift
;
1914 if (arg1
->expr_type
!= EXPR_CONSTANT
|| arg2
->expr_type
!= EXPR_CONSTANT
1915 || shiftarg
->expr_type
!= EXPR_CONSTANT
)
1918 k
= gfc_validate_kind (BT_INTEGER
, arg1
->ts
.kind
, false);
1919 size
= gfc_integer_kinds
[k
].bit_size
;
1921 gfc_extract_int (shiftarg
, &shift
);
1923 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
1925 shift
= size
- shift
;
1927 result
= gfc_get_constant_expr (BT_INTEGER
, arg1
->ts
.kind
, &arg1
->where
);
1928 mpz_set_ui (result
->value
.integer
, 0);
1930 for (i
= 0; i
< shift
; i
++)
1931 if (mpz_tstbit (arg2
->value
.integer
, size
- shift
+ i
))
1932 mpz_setbit (result
->value
.integer
, i
);
1934 for (i
= 0; i
< size
- shift
; i
++)
1935 if (mpz_tstbit (arg1
->value
.integer
, i
))
1936 mpz_setbit (result
->value
.integer
, shift
+ i
);
1938 /* Convert to a signed value. */
1939 convert_mpz_to_signed (result
->value
.integer
, size
);
1946 gfc_simplify_dshiftr (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
1948 return simplify_dshift (arg1
, arg2
, shiftarg
, true);
1953 gfc_simplify_dshiftl (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
1955 return simplify_dshift (arg1
, arg2
, shiftarg
, false);
1960 gfc_simplify_erf (gfc_expr
*x
)
1964 if (x
->expr_type
!= EXPR_CONSTANT
)
1967 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1968 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1970 return range_check (result
, "ERF");
1975 gfc_simplify_erfc (gfc_expr
*x
)
1979 if (x
->expr_type
!= EXPR_CONSTANT
)
1982 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1983 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1985 return range_check (result
, "ERFC");
1989 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
1991 #define MAX_ITER 200
1992 #define ARG_LIMIT 12
1994 /* Calculate ERFC_SCALED directly by its definition:
1996 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
1998 using a large precision for intermediate results. This is used for all
1999 but large values of the argument. */
2001 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2006 prec
= mpfr_get_default_prec ();
2007 mpfr_set_default_prec (10 * prec
);
2012 mpfr_set (a
, arg
, GFC_RND_MODE
);
2013 mpfr_sqr (b
, a
, GFC_RND_MODE
);
2014 mpfr_exp (b
, b
, GFC_RND_MODE
);
2015 mpfr_erfc (a
, a
, GFC_RND_MODE
);
2016 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
2018 mpfr_set (res
, a
, GFC_RND_MODE
);
2019 mpfr_set_default_prec (prec
);
2025 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2027 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2028 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2031 This is used for large values of the argument. Intermediate calculations
2032 are performed with twice the precision. We don't do a fixed number of
2033 iterations of the sum, but stop when it has converged to the required
2036 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2038 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
2043 prec
= mpfr_get_default_prec ();
2044 mpfr_set_default_prec (2 * prec
);
2054 mpfr_init (sumtrunc
);
2055 mpfr_set_prec (oldsum
, prec
);
2056 mpfr_set_prec (sumtrunc
, prec
);
2058 mpfr_set (x
, arg
, GFC_RND_MODE
);
2059 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
2060 mpz_set_ui (num
, 1);
2062 mpfr_set (u
, x
, GFC_RND_MODE
);
2063 mpfr_sqr (u
, u
, GFC_RND_MODE
);
2064 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
2065 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
2067 for (i
= 1; i
< MAX_ITER
; i
++)
2069 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
2071 mpz_mul_ui (num
, num
, 2 * i
- 1);
2074 mpfr_set (w
, u
, GFC_RND_MODE
);
2075 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
2077 mpfr_set_z (v
, num
, GFC_RND_MODE
);
2078 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
2080 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
2082 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
2083 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
2087 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2089 gcc_assert (i
< MAX_ITER
);
2091 /* Divide by x * sqrt(Pi). */
2092 mpfr_const_pi (u
, GFC_RND_MODE
);
2093 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
2094 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
2095 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
2097 mpfr_set (res
, sum
, GFC_RND_MODE
);
2098 mpfr_set_default_prec (prec
);
2100 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
2106 gfc_simplify_erfc_scaled (gfc_expr
*x
)
2110 if (x
->expr_type
!= EXPR_CONSTANT
)
2113 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2114 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
2115 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
2117 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
2119 return range_check (result
, "ERFC_SCALED");
2127 gfc_simplify_epsilon (gfc_expr
*e
)
2132 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2134 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
2135 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
2137 return range_check (result
, "EPSILON");
2142 gfc_simplify_exp (gfc_expr
*x
)
2146 if (x
->expr_type
!= EXPR_CONSTANT
)
2149 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2154 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2158 gfc_set_model_kind (x
->ts
.kind
);
2159 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
2163 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2166 return range_check (result
, "EXP");
2171 gfc_simplify_exponent (gfc_expr
*x
)
2176 if (x
->expr_type
!= EXPR_CONSTANT
)
2179 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2182 gfc_set_model (x
->value
.real
);
2184 if (mpfr_sgn (x
->value
.real
) == 0)
2186 mpz_set_ui (result
->value
.integer
, 0);
2190 i
= (int) mpfr_get_exp (x
->value
.real
);
2191 mpz_set_si (result
->value
.integer
, i
);
2193 return range_check (result
, "EXPONENT");
2198 gfc_simplify_float (gfc_expr
*a
)
2202 if (a
->expr_type
!= EXPR_CONSTANT
)
2207 if (convert_boz (a
, gfc_default_real_kind
) == &gfc_bad_expr
)
2208 return &gfc_bad_expr
;
2210 result
= gfc_copy_expr (a
);
2213 result
= gfc_int2real (a
, gfc_default_real_kind
);
2215 return range_check (result
, "FLOAT");
2220 is_last_ref_vtab (gfc_expr
*e
)
2223 gfc_component
*comp
= NULL
;
2225 if (e
->expr_type
!= EXPR_VARIABLE
)
2228 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
2229 if (ref
->type
== REF_COMPONENT
)
2230 comp
= ref
->u
.c
.component
;
2232 if (!e
->ref
|| !comp
)
2233 return e
->symtree
->n
.sym
->attr
.vtab
;
2235 if (comp
->name
[0] == '_' && strcmp (comp
->name
, "_vptr") == 0)
2243 gfc_simplify_extends_type_of (gfc_expr
*a
, gfc_expr
*mold
)
2245 /* Avoid simplification of resolved symbols. */
2246 if (is_last_ref_vtab (a
) || is_last_ref_vtab (mold
))
2249 if (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_DERIVED
)
2250 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2251 gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2254 if (UNLIMITED_POLY (a
) || UNLIMITED_POLY (mold
))
2257 /* Return .false. if the dynamic type can never be the same. */
2258 if ((a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_CLASS
2259 && !gfc_type_is_extension_of
2260 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2261 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2262 && !gfc_type_is_extension_of
2263 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2264 mold
->ts
.u
.derived
->components
->ts
.u
.derived
))
2265 || (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_CLASS
2266 && !gfc_type_is_extension_of
2268 mold
->ts
.u
.derived
->components
->ts
.u
.derived
)
2269 && !gfc_type_is_extension_of
2270 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2272 || (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2273 && !gfc_type_is_extension_of
2274 (mold
->ts
.u
.derived
,
2275 a
->ts
.u
.derived
->components
->ts
.u
.derived
)))
2276 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2278 if (mold
->ts
.type
== BT_DERIVED
2279 && gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2280 a
->ts
.u
.derived
->components
->ts
.u
.derived
))
2281 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, true);
2288 gfc_simplify_same_type_as (gfc_expr
*a
, gfc_expr
*b
)
2290 /* Avoid simplification of resolved symbols. */
2291 if (is_last_ref_vtab (a
) || is_last_ref_vtab (b
))
2294 /* Return .false. if the dynamic type can never be the
2296 if ((a
->ts
.type
== BT_CLASS
|| b
->ts
.type
== BT_CLASS
)
2297 && !gfc_type_compatible (&a
->ts
, &b
->ts
)
2298 && !gfc_type_compatible (&b
->ts
, &a
->ts
))
2299 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2301 if (a
->ts
.type
!= BT_DERIVED
|| b
->ts
.type
!= BT_DERIVED
)
2304 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2305 gfc_compare_derived_types (a
->ts
.u
.derived
,
2311 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
2317 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
2319 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2321 if (e
->expr_type
!= EXPR_CONSTANT
)
2324 gfc_set_model_kind (kind
);
2327 mpfr_floor (floor
, e
->value
.real
);
2329 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
2330 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
2334 return range_check (result
, "FLOOR");
2339 gfc_simplify_fraction (gfc_expr
*x
)
2342 mpfr_t absv
, exp
, pow2
;
2344 if (x
->expr_type
!= EXPR_CONSTANT
)
2347 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
2349 if (mpfr_sgn (x
->value
.real
) == 0)
2351 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2355 gfc_set_model_kind (x
->ts
.kind
);
2360 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
2361 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
2363 mpfr_trunc (exp
, exp
);
2364 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
2366 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
2368 mpfr_div (result
->value
.real
, absv
, pow2
, GFC_RND_MODE
);
2370 mpfr_clears (exp
, absv
, pow2
, NULL
);
2372 return range_check (result
, "FRACTION");
2377 gfc_simplify_gamma (gfc_expr
*x
)
2381 if (x
->expr_type
!= EXPR_CONSTANT
)
2384 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2385 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2387 return range_check (result
, "GAMMA");
2392 gfc_simplify_huge (gfc_expr
*e
)
2397 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2398 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2403 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2407 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
2419 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
2423 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2426 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2427 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
2428 return range_check (result
, "HYPOT");
2432 /* We use the processor's collating sequence, because all
2433 systems that gfortran currently works on are ASCII. */
2436 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
2442 if (e
->expr_type
!= EXPR_CONSTANT
)
2445 if (e
->value
.character
.length
!= 1)
2447 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
2448 return &gfc_bad_expr
;
2451 index
= e
->value
.character
.string
[0];
2453 if (gfc_option
.warn_surprising
&& index
> 127)
2454 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2457 k
= get_kind (BT_INTEGER
, kind
, "IACHAR", gfc_default_integer_kind
);
2459 return &gfc_bad_expr
;
2461 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2463 return range_check (result
, "IACHAR");
2468 do_bit_and (gfc_expr
*result
, gfc_expr
*e
)
2470 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2471 gcc_assert (result
->ts
.type
== BT_INTEGER
2472 && result
->expr_type
== EXPR_CONSTANT
);
2474 mpz_and (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2480 gfc_simplify_iall (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2482 return simplify_transformation (array
, dim
, mask
, -1, do_bit_and
);
2487 do_bit_ior (gfc_expr
*result
, gfc_expr
*e
)
2489 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2490 gcc_assert (result
->ts
.type
== BT_INTEGER
2491 && result
->expr_type
== EXPR_CONSTANT
);
2493 mpz_ior (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2499 gfc_simplify_iany (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2501 return simplify_transformation (array
, dim
, mask
, 0, do_bit_ior
);
2506 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
2510 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2513 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2514 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2516 return range_check (result
, "IAND");
2521 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
2526 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2529 gfc_extract_int (y
, &pos
);
2531 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2533 result
= gfc_copy_expr (x
);
2535 convert_mpz_to_unsigned (result
->value
.integer
,
2536 gfc_integer_kinds
[k
].bit_size
);
2538 mpz_clrbit (result
->value
.integer
, pos
);
2540 convert_mpz_to_signed (result
->value
.integer
,
2541 gfc_integer_kinds
[k
].bit_size
);
2548 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
2555 if (x
->expr_type
!= EXPR_CONSTANT
2556 || y
->expr_type
!= EXPR_CONSTANT
2557 || z
->expr_type
!= EXPR_CONSTANT
)
2560 gfc_extract_int (y
, &pos
);
2561 gfc_extract_int (z
, &len
);
2563 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
2565 bitsize
= gfc_integer_kinds
[k
].bit_size
;
2567 if (pos
+ len
> bitsize
)
2569 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2570 "bit size at %L", &y
->where
);
2571 return &gfc_bad_expr
;
2574 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2575 convert_mpz_to_unsigned (result
->value
.integer
,
2576 gfc_integer_kinds
[k
].bit_size
);
2578 bits
= XCNEWVEC (int, bitsize
);
2580 for (i
= 0; i
< bitsize
; i
++)
2583 for (i
= 0; i
< len
; i
++)
2584 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
2586 for (i
= 0; i
< bitsize
; i
++)
2589 mpz_clrbit (result
->value
.integer
, i
);
2590 else if (bits
[i
] == 1)
2591 mpz_setbit (result
->value
.integer
, i
);
2593 gfc_internal_error ("IBITS: Bad bit");
2598 convert_mpz_to_signed (result
->value
.integer
,
2599 gfc_integer_kinds
[k
].bit_size
);
2606 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
2611 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2614 gfc_extract_int (y
, &pos
);
2616 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2618 result
= gfc_copy_expr (x
);
2620 convert_mpz_to_unsigned (result
->value
.integer
,
2621 gfc_integer_kinds
[k
].bit_size
);
2623 mpz_setbit (result
->value
.integer
, pos
);
2625 convert_mpz_to_signed (result
->value
.integer
,
2626 gfc_integer_kinds
[k
].bit_size
);
2633 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
2639 if (e
->expr_type
!= EXPR_CONSTANT
)
2642 if (e
->value
.character
.length
!= 1)
2644 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
2645 return &gfc_bad_expr
;
2648 index
= e
->value
.character
.string
[0];
2650 k
= get_kind (BT_INTEGER
, kind
, "ICHAR", gfc_default_integer_kind
);
2652 return &gfc_bad_expr
;
2654 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2656 return range_check (result
, "ICHAR");
2661 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
2665 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2668 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2669 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2671 return range_check (result
, "IEOR");
2676 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
2679 int back
, len
, lensub
;
2680 int i
, j
, k
, count
, index
= 0, start
;
2682 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
2683 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
2686 if (b
!= NULL
&& b
->value
.logical
!= 0)
2691 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
2693 return &gfc_bad_expr
;
2695 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
2697 len
= x
->value
.character
.length
;
2698 lensub
= y
->value
.character
.length
;
2702 mpz_set_si (result
->value
.integer
, 0);
2710 mpz_set_si (result
->value
.integer
, 1);
2713 else if (lensub
== 1)
2715 for (i
= 0; i
< len
; i
++)
2717 for (j
= 0; j
< lensub
; j
++)
2719 if (y
->value
.character
.string
[j
]
2720 == x
->value
.character
.string
[i
])
2730 for (i
= 0; i
< len
; i
++)
2732 for (j
= 0; j
< lensub
; j
++)
2734 if (y
->value
.character
.string
[j
]
2735 == x
->value
.character
.string
[i
])
2740 for (k
= 0; k
< lensub
; k
++)
2742 if (y
->value
.character
.string
[k
]
2743 == x
->value
.character
.string
[k
+ start
])
2747 if (count
== lensub
)
2762 mpz_set_si (result
->value
.integer
, len
+ 1);
2765 else if (lensub
== 1)
2767 for (i
= 0; i
< len
; i
++)
2769 for (j
= 0; j
< lensub
; j
++)
2771 if (y
->value
.character
.string
[j
]
2772 == x
->value
.character
.string
[len
- i
])
2774 index
= len
- i
+ 1;
2782 for (i
= 0; i
< len
; i
++)
2784 for (j
= 0; j
< lensub
; j
++)
2786 if (y
->value
.character
.string
[j
]
2787 == x
->value
.character
.string
[len
- i
])
2790 if (start
<= len
- lensub
)
2793 for (k
= 0; k
< lensub
; k
++)
2794 if (y
->value
.character
.string
[k
]
2795 == x
->value
.character
.string
[k
+ start
])
2798 if (count
== lensub
)
2815 mpz_set_si (result
->value
.integer
, index
);
2816 return range_check (result
, "INDEX");
2821 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
2823 gfc_expr
*result
= NULL
;
2825 if (e
->expr_type
!= EXPR_CONSTANT
)
2828 result
= gfc_convert_constant (e
, BT_INTEGER
, kind
);
2829 if (result
== &gfc_bad_expr
)
2830 return &gfc_bad_expr
;
2832 return range_check (result
, name
);
2837 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
2841 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
2843 return &gfc_bad_expr
;
2845 return simplify_intconv (e
, kind
, "INT");
2849 gfc_simplify_int2 (gfc_expr
*e
)
2851 return simplify_intconv (e
, 2, "INT2");
2856 gfc_simplify_int8 (gfc_expr
*e
)
2858 return simplify_intconv (e
, 8, "INT8");
2863 gfc_simplify_long (gfc_expr
*e
)
2865 return simplify_intconv (e
, 4, "LONG");
2870 gfc_simplify_ifix (gfc_expr
*e
)
2872 gfc_expr
*rtrunc
, *result
;
2874 if (e
->expr_type
!= EXPR_CONSTANT
)
2877 rtrunc
= gfc_copy_expr (e
);
2878 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
2880 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2882 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
2884 gfc_free_expr (rtrunc
);
2886 return range_check (result
, "IFIX");
2891 gfc_simplify_idint (gfc_expr
*e
)
2893 gfc_expr
*rtrunc
, *result
;
2895 if (e
->expr_type
!= EXPR_CONSTANT
)
2898 rtrunc
= gfc_copy_expr (e
);
2899 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
2901 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2903 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
2905 gfc_free_expr (rtrunc
);
2907 return range_check (result
, "IDINT");
2912 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
2916 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2919 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2920 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2922 return range_check (result
, "IOR");
2927 do_bit_xor (gfc_expr
*result
, gfc_expr
*e
)
2929 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2930 gcc_assert (result
->ts
.type
== BT_INTEGER
2931 && result
->expr_type
== EXPR_CONSTANT
);
2933 mpz_xor (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2939 gfc_simplify_iparity (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2941 return simplify_transformation (array
, dim
, mask
, 0, do_bit_xor
);
2946 gfc_simplify_is_iostat_end (gfc_expr
*x
)
2948 if (x
->expr_type
!= EXPR_CONSTANT
)
2951 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
2952 mpz_cmp_si (x
->value
.integer
,
2953 LIBERROR_END
) == 0);
2958 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
2960 if (x
->expr_type
!= EXPR_CONSTANT
)
2963 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
2964 mpz_cmp_si (x
->value
.integer
,
2965 LIBERROR_EOR
) == 0);
2970 gfc_simplify_isnan (gfc_expr
*x
)
2972 if (x
->expr_type
!= EXPR_CONSTANT
)
2975 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
2976 mpfr_nan_p (x
->value
.real
));
2980 /* Performs a shift on its first argument. Depending on the last
2981 argument, the shift can be arithmetic, i.e. with filling from the
2982 left like in the SHIFTA intrinsic. */
2984 simplify_shift (gfc_expr
*e
, gfc_expr
*s
, const char *name
,
2985 bool arithmetic
, int direction
)
2988 int ashift
, *bits
, i
, k
, bitsize
, shift
;
2990 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
2993 gfc_extract_int (s
, &shift
);
2995 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
2996 bitsize
= gfc_integer_kinds
[k
].bit_size
;
2998 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3002 mpz_set (result
->value
.integer
, e
->value
.integer
);
3006 if (direction
> 0 && shift
< 0)
3008 /* Left shift, as in SHIFTL. */
3009 gfc_error ("Second argument of %s is negative at %L", name
, &e
->where
);
3010 return &gfc_bad_expr
;
3012 else if (direction
< 0)
3014 /* Right shift, as in SHIFTR or SHIFTA. */
3017 gfc_error ("Second argument of %s is negative at %L",
3019 return &gfc_bad_expr
;
3025 ashift
= (shift
>= 0 ? shift
: -shift
);
3027 if (ashift
> bitsize
)
3029 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3030 "at %L", name
, &e
->where
);
3031 return &gfc_bad_expr
;
3034 bits
= XCNEWVEC (int, bitsize
);
3036 for (i
= 0; i
< bitsize
; i
++)
3037 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3042 for (i
= 0; i
< shift
; i
++)
3043 mpz_clrbit (result
->value
.integer
, i
);
3045 for (i
= 0; i
< bitsize
- shift
; i
++)
3048 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3050 mpz_setbit (result
->value
.integer
, i
+ shift
);
3056 if (arithmetic
&& bits
[bitsize
- 1])
3057 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3058 mpz_setbit (result
->value
.integer
, i
);
3060 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3061 mpz_clrbit (result
->value
.integer
, i
);
3063 for (i
= bitsize
- 1; i
>= ashift
; i
--)
3066 mpz_clrbit (result
->value
.integer
, i
- ashift
);
3068 mpz_setbit (result
->value
.integer
, i
- ashift
);
3072 convert_mpz_to_signed (result
->value
.integer
, bitsize
);
3080 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
3082 return simplify_shift (e
, s
, "ISHFT", false, 0);
3087 gfc_simplify_lshift (gfc_expr
*e
, gfc_expr
*s
)
3089 return simplify_shift (e
, s
, "LSHIFT", false, 1);
3094 gfc_simplify_rshift (gfc_expr
*e
, gfc_expr
*s
)
3096 return simplify_shift (e
, s
, "RSHIFT", true, -1);
3101 gfc_simplify_shifta (gfc_expr
*e
, gfc_expr
*s
)
3103 return simplify_shift (e
, s
, "SHIFTA", true, -1);
3108 gfc_simplify_shiftl (gfc_expr
*e
, gfc_expr
*s
)
3110 return simplify_shift (e
, s
, "SHIFTL", false, 1);
3115 gfc_simplify_shiftr (gfc_expr
*e
, gfc_expr
*s
)
3117 return simplify_shift (e
, s
, "SHIFTR", false, -1);
3122 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
3125 int shift
, ashift
, isize
, ssize
, delta
, k
;
3128 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3131 gfc_extract_int (s
, &shift
);
3133 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3134 isize
= gfc_integer_kinds
[k
].bit_size
;
3138 if (sz
->expr_type
!= EXPR_CONSTANT
)
3141 gfc_extract_int (sz
, &ssize
);
3155 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3156 "BIT_SIZE of first argument at %L", &s
->where
);
3157 return &gfc_bad_expr
;
3160 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3162 mpz_set (result
->value
.integer
, e
->value
.integer
);
3167 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
3169 bits
= XCNEWVEC (int, ssize
);
3171 for (i
= 0; i
< ssize
; i
++)
3172 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3174 delta
= ssize
- ashift
;
3178 for (i
= 0; i
< delta
; i
++)
3181 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3183 mpz_setbit (result
->value
.integer
, i
+ shift
);
3186 for (i
= delta
; i
< ssize
; i
++)
3189 mpz_clrbit (result
->value
.integer
, i
- delta
);
3191 mpz_setbit (result
->value
.integer
, i
- delta
);
3196 for (i
= 0; i
< ashift
; i
++)
3199 mpz_clrbit (result
->value
.integer
, i
+ delta
);
3201 mpz_setbit (result
->value
.integer
, i
+ delta
);
3204 for (i
= ashift
; i
< ssize
; i
++)
3207 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3209 mpz_setbit (result
->value
.integer
, i
+ shift
);
3213 convert_mpz_to_signed (result
->value
.integer
, isize
);
3221 gfc_simplify_kind (gfc_expr
*e
)
3223 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, e
->ts
.kind
);
3228 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
3229 gfc_array_spec
*as
, gfc_ref
*ref
, bool coarray
)
3231 gfc_expr
*l
, *u
, *result
;
3234 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3235 gfc_default_integer_kind
);
3237 return &gfc_bad_expr
;
3239 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3241 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3242 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3243 if (!coarray
&& array
->expr_type
!= EXPR_VARIABLE
)
3247 gfc_expr
* dim
= result
;
3248 mpz_set_si (dim
->value
.integer
, d
);
3250 result
= gfc_simplify_size (array
, dim
, kind
);
3251 gfc_free_expr (dim
);
3256 mpz_set_si (result
->value
.integer
, 1);
3261 /* Otherwise, we have a variable expression. */
3262 gcc_assert (array
->expr_type
== EXPR_VARIABLE
);
3265 if (gfc_resolve_array_spec (as
, 0) == FAILURE
)
3268 /* The last dimension of an assumed-size array is special. */
3269 if ((!coarray
&& d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
3270 || (coarray
&& d
== as
->rank
+ as
->corank
3271 && (!upper
|| gfc_option
.coarray
== GFC_FCOARRAY_SINGLE
)))
3273 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
3275 gfc_free_expr (result
);
3276 return gfc_copy_expr (as
->lower
[d
-1]);
3282 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3284 /* Then, we need to know the extent of the given dimension. */
3285 if (coarray
|| ref
->u
.ar
.type
== AR_FULL
)
3290 if (l
->expr_type
!= EXPR_CONSTANT
|| u
== NULL
3291 || u
->expr_type
!= EXPR_CONSTANT
)
3294 if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
3298 mpz_set_si (result
->value
.integer
, 0);
3300 mpz_set_si (result
->value
.integer
, 1);
3304 /* Nonzero extent. */
3306 mpz_set (result
->value
.integer
, u
->value
.integer
);
3308 mpz_set (result
->value
.integer
, l
->value
.integer
);
3315 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
[0]);
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_b
->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
[1]);
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
)
3979 if (tsource
->expr_type
!= EXPR_CONSTANT
3980 || fsource
->expr_type
!= EXPR_CONSTANT
3981 || mask
->expr_type
!= EXPR_CONSTANT
)
3984 return gfc_copy_expr (mask
->value
.logical
? tsource
: fsource
);
3989 gfc_simplify_merge_bits (gfc_expr
*i
, gfc_expr
*j
, gfc_expr
*mask_expr
)
3991 mpz_t arg1
, arg2
, mask
;
3994 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
3995 || mask_expr
->expr_type
!= EXPR_CONSTANT
)
3998 result
= gfc_get_constant_expr (BT_INTEGER
, i
->ts
.kind
, &i
->where
);
4000 /* Convert all argument to unsigned. */
4001 mpz_init_set (arg1
, i
->value
.integer
);
4002 mpz_init_set (arg2
, j
->value
.integer
);
4003 mpz_init_set (mask
, mask_expr
->value
.integer
);
4005 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4006 mpz_and (arg1
, arg1
, mask
);
4007 mpz_com (mask
, mask
);
4008 mpz_and (arg2
, arg2
, mask
);
4009 mpz_ior (result
->value
.integer
, arg1
, arg2
);
4019 /* Selects between current value and extremum for simplify_min_max
4020 and simplify_minval_maxval. */
4022 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
)
4024 switch (arg
->ts
.type
)
4027 if (mpz_cmp (arg
->value
.integer
,
4028 extremum
->value
.integer
) * sign
> 0)
4029 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
4033 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4035 mpfr_max (extremum
->value
.real
, extremum
->value
.real
,
4036 arg
->value
.real
, GFC_RND_MODE
);
4038 mpfr_min (extremum
->value
.real
, extremum
->value
.real
,
4039 arg
->value
.real
, GFC_RND_MODE
);
4043 #define LENGTH(x) ((x)->value.character.length)
4044 #define STRING(x) ((x)->value.character.string)
4045 if (LENGTH(extremum
) < LENGTH(arg
))
4047 gfc_char_t
*tmp
= STRING(extremum
);
4049 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
4050 memcpy (STRING(extremum
), tmp
,
4051 LENGTH(extremum
) * sizeof (gfc_char_t
));
4052 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
4053 LENGTH(arg
) - LENGTH(extremum
));
4054 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
4055 LENGTH(extremum
) = LENGTH(arg
);
4059 if (gfc_compare_string (arg
, extremum
) * sign
> 0)
4061 free (STRING(extremum
));
4062 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
4063 memcpy (STRING(extremum
), STRING(arg
),
4064 LENGTH(arg
) * sizeof (gfc_char_t
));
4065 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
4066 LENGTH(extremum
) - LENGTH(arg
));
4067 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
4074 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4079 /* This function is special since MAX() can take any number of
4080 arguments. The simplified expression is a rewritten version of the
4081 argument list containing at most one constant element. Other
4082 constant elements are deleted. Because the argument list has
4083 already been checked, this function always succeeds. sign is 1 for
4084 MAX(), -1 for MIN(). */
4087 simplify_min_max (gfc_expr
*expr
, int sign
)
4089 gfc_actual_arglist
*arg
, *last
, *extremum
;
4090 gfc_intrinsic_sym
* specific
;
4094 specific
= expr
->value
.function
.isym
;
4096 arg
= expr
->value
.function
.actual
;
4098 for (; arg
; last
= arg
, arg
= arg
->next
)
4100 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
4103 if (extremum
== NULL
)
4109 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
4111 /* Delete the extra constant argument. */
4112 last
->next
= arg
->next
;
4115 gfc_free_actual_arglist (arg
);
4119 /* If there is one value left, replace the function call with the
4121 if (expr
->value
.function
.actual
->next
!= NULL
)
4124 /* Convert to the correct type and kind. */
4125 if (expr
->ts
.type
!= BT_UNKNOWN
)
4126 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4127 expr
->ts
.type
, expr
->ts
.kind
);
4129 if (specific
->ts
.type
!= BT_UNKNOWN
)
4130 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4131 specific
->ts
.type
, specific
->ts
.kind
);
4133 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
4138 gfc_simplify_min (gfc_expr
*e
)
4140 return simplify_min_max (e
, -1);
4145 gfc_simplify_max (gfc_expr
*e
)
4147 return simplify_min_max (e
, 1);
4151 /* This is a simplified version of simplify_min_max to provide
4152 simplification of minval and maxval for a vector. */
4155 simplify_minval_maxval (gfc_expr
*expr
, int sign
)
4157 gfc_constructor
*c
, *extremum
;
4158 gfc_intrinsic_sym
* specific
;
4161 specific
= expr
->value
.function
.isym
;
4163 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4164 c
; c
= gfc_constructor_next (c
))
4166 if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
4169 if (extremum
== NULL
)
4175 min_max_choose (c
->expr
, extremum
->expr
, sign
);
4178 if (extremum
== NULL
)
4181 /* Convert to the correct type and kind. */
4182 if (expr
->ts
.type
!= BT_UNKNOWN
)
4183 return gfc_convert_constant (extremum
->expr
,
4184 expr
->ts
.type
, expr
->ts
.kind
);
4186 if (specific
->ts
.type
!= BT_UNKNOWN
)
4187 return gfc_convert_constant (extremum
->expr
,
4188 specific
->ts
.type
, specific
->ts
.kind
);
4190 return gfc_copy_expr (extremum
->expr
);
4195 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4197 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4200 return simplify_minval_maxval (array
, -1);
4205 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4207 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4210 return simplify_minval_maxval (array
, 1);
4215 gfc_simplify_maxexponent (gfc_expr
*x
)
4217 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4218 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4219 gfc_real_kinds
[i
].max_exponent
);
4224 gfc_simplify_minexponent (gfc_expr
*x
)
4226 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4227 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4228 gfc_real_kinds
[i
].min_exponent
);
4233 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
4238 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4241 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4242 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4247 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4249 /* Result is processor-dependent. */
4250 gfc_error ("Second argument MOD at %L is zero", &a
->where
);
4251 gfc_free_expr (result
);
4252 return &gfc_bad_expr
;
4254 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4258 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4260 /* Result is processor-dependent. */
4261 gfc_error ("Second argument of MOD at %L is zero", &p
->where
);
4262 gfc_free_expr (result
);
4263 return &gfc_bad_expr
;
4266 gfc_set_model_kind (kind
);
4267 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4272 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4275 return range_check (result
, "MOD");
4280 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
4285 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4288 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4289 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4294 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4296 /* Result is processor-dependent. This processor just opts
4297 to not handle it at all. */
4298 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
4299 gfc_free_expr (result
);
4300 return &gfc_bad_expr
;
4302 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4307 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4309 /* Result is processor-dependent. */
4310 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
4311 gfc_free_expr (result
);
4312 return &gfc_bad_expr
;
4315 gfc_set_model_kind (kind
);
4316 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4318 if (mpfr_cmp_ui (result
->value
.real
, 0) != 0)
4320 if (mpfr_signbit (a
->value
.real
) != mpfr_signbit (p
->value
.real
))
4321 mpfr_add (result
->value
.real
, result
->value
.real
, p
->value
.real
,
4325 mpfr_copysign (result
->value
.real
, result
->value
.real
,
4326 p
->value
.real
, GFC_RND_MODE
);
4330 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4333 return range_check (result
, "MODULO");
4337 /* Exists for the sole purpose of consistency with other intrinsics. */
4339 gfc_simplify_mvbits (gfc_expr
*f ATTRIBUTE_UNUSED
,
4340 gfc_expr
*fp ATTRIBUTE_UNUSED
,
4341 gfc_expr
*l ATTRIBUTE_UNUSED
,
4342 gfc_expr
*to ATTRIBUTE_UNUSED
,
4343 gfc_expr
*tp ATTRIBUTE_UNUSED
)
4350 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
4353 mp_exp_t emin
, emax
;
4356 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
4359 result
= gfc_copy_expr (x
);
4361 /* Save current values of emin and emax. */
4362 emin
= mpfr_get_emin ();
4363 emax
= mpfr_get_emax ();
4365 /* Set emin and emax for the current model number. */
4366 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
4367 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
4368 mpfr_get_prec(result
->value
.real
) + 1);
4369 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
4370 mpfr_check_range (result
->value
.real
, 0, GMP_RNDU
);
4372 if (mpfr_sgn (s
->value
.real
) > 0)
4374 mpfr_nextabove (result
->value
.real
);
4375 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
4379 mpfr_nextbelow (result
->value
.real
);
4380 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
4383 mpfr_set_emin (emin
);
4384 mpfr_set_emax (emax
);
4386 /* Only NaN can occur. Do not use range check as it gives an
4387 error for denormal numbers. */
4388 if (mpfr_nan_p (result
->value
.real
) && gfc_option
.flag_range_check
)
4390 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
4391 gfc_free_expr (result
);
4392 return &gfc_bad_expr
;
4400 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
4402 gfc_expr
*itrunc
, *result
;
4405 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
4407 return &gfc_bad_expr
;
4409 if (e
->expr_type
!= EXPR_CONSTANT
)
4412 itrunc
= gfc_copy_expr (e
);
4413 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
4415 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
4416 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
4418 gfc_free_expr (itrunc
);
4420 return range_check (result
, name
);
4425 gfc_simplify_new_line (gfc_expr
*e
)
4429 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 1);
4430 result
->value
.character
.string
[0] = '\n';
4437 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
4439 return simplify_nint ("NINT", e
, k
);
4444 gfc_simplify_idnint (gfc_expr
*e
)
4446 return simplify_nint ("IDNINT", e
, NULL
);
4451 add_squared (gfc_expr
*result
, gfc_expr
*e
)
4455 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4456 gcc_assert (result
->ts
.type
== BT_REAL
4457 && result
->expr_type
== EXPR_CONSTANT
);
4459 gfc_set_model_kind (result
->ts
.kind
);
4461 mpfr_pow_ui (tmp
, e
->value
.real
, 2, GFC_RND_MODE
);
4462 mpfr_add (result
->value
.real
, result
->value
.real
, tmp
,
4471 do_sqrt (gfc_expr
*result
, gfc_expr
*e
)
4473 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4474 gcc_assert (result
->ts
.type
== BT_REAL
4475 && result
->expr_type
== EXPR_CONSTANT
);
4477 mpfr_set (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
4478 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4484 gfc_simplify_norm2 (gfc_expr
*e
, gfc_expr
*dim
)
4488 if (!is_constant_array_expr (e
)
4489 || (dim
!= NULL
&& !gfc_is_constant_expr (dim
)))
4492 result
= transformational_result (e
, dim
, e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4493 init_result_expr (result
, 0, NULL
);
4495 if (!dim
|| e
->rank
== 1)
4497 result
= simplify_transformation_to_scalar (result
, e
, NULL
,
4499 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4502 result
= simplify_transformation_to_array (result
, e
, dim
, NULL
,
4503 add_squared
, &do_sqrt
);
4510 gfc_simplify_not (gfc_expr
*e
)
4514 if (e
->expr_type
!= EXPR_CONSTANT
)
4517 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4518 mpz_com (result
->value
.integer
, e
->value
.integer
);
4520 return range_check (result
, "NOT");
4525 gfc_simplify_null (gfc_expr
*mold
)
4531 result
= gfc_copy_expr (mold
);
4532 result
->expr_type
= EXPR_NULL
;
4535 result
= gfc_get_null_expr (NULL
);
4542 gfc_simplify_num_images (void)
4546 if (gfc_option
.coarray
== GFC_FCOARRAY_NONE
)
4548 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
4549 return &gfc_bad_expr
;
4552 if (gfc_option
.coarray
!= GFC_FCOARRAY_SINGLE
)
4555 /* FIXME: gfc_current_locus is wrong. */
4556 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
4557 &gfc_current_locus
);
4558 mpz_set_si (result
->value
.integer
, 1);
4564 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
4569 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
4572 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
4577 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
4578 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
4579 return range_check (result
, "OR");
4582 return gfc_get_logical_expr (kind
, &x
->where
,
4583 x
->value
.logical
|| y
->value
.logical
);
4591 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
4594 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
4596 if (!is_constant_array_expr(array
)
4597 || !is_constant_array_expr(vector
)
4598 || (!gfc_is_constant_expr (mask
)
4599 && !is_constant_array_expr(mask
)))
4602 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
4603 if (array
->ts
.type
== BT_DERIVED
)
4604 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
4606 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
4607 vector_ctor
= vector
4608 ? gfc_constructor_first (vector
->value
.constructor
)
4611 if (mask
->expr_type
== EXPR_CONSTANT
4612 && mask
->value
.logical
)
4614 /* Copy all elements of ARRAY to RESULT. */
4617 gfc_constructor_append_expr (&result
->value
.constructor
,
4618 gfc_copy_expr (array_ctor
->expr
),
4621 array_ctor
= gfc_constructor_next (array_ctor
);
4622 vector_ctor
= gfc_constructor_next (vector_ctor
);
4625 else if (mask
->expr_type
== EXPR_ARRAY
)
4627 /* Copy only those elements of ARRAY to RESULT whose
4628 MASK equals .TRUE.. */
4629 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4632 if (mask_ctor
->expr
->value
.logical
)
4634 gfc_constructor_append_expr (&result
->value
.constructor
,
4635 gfc_copy_expr (array_ctor
->expr
),
4637 vector_ctor
= gfc_constructor_next (vector_ctor
);
4640 array_ctor
= gfc_constructor_next (array_ctor
);
4641 mask_ctor
= gfc_constructor_next (mask_ctor
);
4645 /* Append any left-over elements from VECTOR to RESULT. */
4648 gfc_constructor_append_expr (&result
->value
.constructor
,
4649 gfc_copy_expr (vector_ctor
->expr
),
4651 vector_ctor
= gfc_constructor_next (vector_ctor
);
4654 result
->shape
= gfc_get_shape (1);
4655 gfc_array_size (result
, &result
->shape
[0]);
4657 if (array
->ts
.type
== BT_CHARACTER
)
4658 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
4665 do_xor (gfc_expr
*result
, gfc_expr
*e
)
4667 gcc_assert (e
->ts
.type
== BT_LOGICAL
&& e
->expr_type
== EXPR_CONSTANT
);
4668 gcc_assert (result
->ts
.type
== BT_LOGICAL
4669 && result
->expr_type
== EXPR_CONSTANT
);
4671 result
->value
.logical
= result
->value
.logical
!= e
->value
.logical
;
4678 gfc_simplify_parity (gfc_expr
*e
, gfc_expr
*dim
)
4680 return simplify_transformation (e
, dim
, NULL
, 0, do_xor
);
4685 gfc_simplify_popcnt (gfc_expr
*e
)
4690 if (e
->expr_type
!= EXPR_CONSTANT
)
4693 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4695 /* Convert argument to unsigned, then count the '1' bits. */
4696 mpz_init_set (x
, e
->value
.integer
);
4697 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
4698 res
= mpz_popcount (x
);
4701 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, res
);
4706 gfc_simplify_poppar (gfc_expr
*e
)
4712 if (e
->expr_type
!= EXPR_CONSTANT
)
4715 popcnt
= gfc_simplify_popcnt (e
);
4716 gcc_assert (popcnt
);
4718 s
= gfc_extract_int (popcnt
, &i
);
4721 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
% 2);
4726 gfc_simplify_precision (gfc_expr
*e
)
4728 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4729 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
,
4730 gfc_real_kinds
[i
].precision
);
4735 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
4737 return simplify_transformation (array
, dim
, mask
, 1, gfc_multiply
);
4742 gfc_simplify_radix (gfc_expr
*e
)
4745 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4750 i
= gfc_integer_kinds
[i
].radix
;
4754 i
= gfc_real_kinds
[i
].radix
;
4761 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
4766 gfc_simplify_range (gfc_expr
*e
)
4769 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4774 i
= gfc_integer_kinds
[i
].range
;
4779 i
= gfc_real_kinds
[i
].range
;
4786 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
4791 gfc_simplify_rank (gfc_expr
*e
)
4797 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, e
->rank
);
4802 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
4804 gfc_expr
*result
= NULL
;
4807 if (e
->ts
.type
== BT_COMPLEX
)
4808 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
4810 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
4813 return &gfc_bad_expr
;
4815 if (e
->expr_type
!= EXPR_CONSTANT
)
4818 if (convert_boz (e
, kind
) == &gfc_bad_expr
)
4819 return &gfc_bad_expr
;
4821 result
= gfc_convert_constant (e
, BT_REAL
, kind
);
4822 if (result
== &gfc_bad_expr
)
4823 return &gfc_bad_expr
;
4825 return range_check (result
, "REAL");
4830 gfc_simplify_realpart (gfc_expr
*e
)
4834 if (e
->expr_type
!= EXPR_CONSTANT
)
4837 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
4838 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
4840 return range_check (result
, "REALPART");
4844 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
4847 int i
, j
, len
, ncop
, nlen
;
4849 bool have_length
= false;
4851 /* If NCOPIES isn't a constant, there's nothing we can do. */
4852 if (n
->expr_type
!= EXPR_CONSTANT
)
4855 /* If NCOPIES is negative, it's an error. */
4856 if (mpz_sgn (n
->value
.integer
) < 0)
4858 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4860 return &gfc_bad_expr
;
4863 /* If we don't know the character length, we can do no more. */
4864 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
4865 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
4867 len
= mpz_get_si (e
->ts
.u
.cl
->length
->value
.integer
);
4870 else if (e
->expr_type
== EXPR_CONSTANT
4871 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
4873 len
= e
->value
.character
.length
;
4878 /* If the source length is 0, any value of NCOPIES is valid
4879 and everything behaves as if NCOPIES == 0. */
4882 mpz_set_ui (ncopies
, 0);
4884 mpz_set (ncopies
, n
->value
.integer
);
4886 /* Check that NCOPIES isn't too large. */
4892 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4894 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
4898 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
4899 e
->ts
.u
.cl
->length
->value
.integer
);
4903 mpz_init_set_si (mlen
, len
);
4904 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
4908 /* The check itself. */
4909 if (mpz_cmp (ncopies
, max
) > 0)
4912 mpz_clear (ncopies
);
4913 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4915 return &gfc_bad_expr
;
4920 mpz_clear (ncopies
);
4922 /* For further simplification, we need the character string to be
4924 if (e
->expr_type
!= EXPR_CONSTANT
)
4928 (e
->ts
.u
.cl
->length
&&
4929 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
)) != 0)
4931 const char *res
= gfc_extract_int (n
, &ncop
);
4932 gcc_assert (res
== NULL
);
4938 return gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 0);
4940 len
= e
->value
.character
.length
;
4943 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, nlen
);
4944 for (i
= 0; i
< ncop
; i
++)
4945 for (j
= 0; j
< len
; j
++)
4946 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
4948 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
4953 /* This one is a bear, but mainly has to do with shuffling elements. */
4956 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
4957 gfc_expr
*pad
, gfc_expr
*order_exp
)
4959 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
4960 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
4964 gfc_expr
*e
, *result
;
4966 /* Check that argument expression types are OK. */
4967 if (!is_constant_array_expr (source
)
4968 || !is_constant_array_expr (shape_exp
)
4969 || !is_constant_array_expr (pad
)
4970 || !is_constant_array_expr (order_exp
))
4973 /* Proceed with simplification, unpacking the array. */
4980 e
= gfc_constructor_lookup_expr (shape_exp
->value
.constructor
, rank
);
4984 gfc_extract_int (e
, &shape
[rank
]);
4986 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
4987 gcc_assert (shape
[rank
] >= 0);
4992 gcc_assert (rank
> 0);
4994 /* Now unpack the order array if present. */
4995 if (order_exp
== NULL
)
4997 for (i
= 0; i
< rank
; i
++)
5002 for (i
= 0; i
< rank
; i
++)
5005 for (i
= 0; i
< rank
; i
++)
5007 e
= gfc_constructor_lookup_expr (order_exp
->value
.constructor
, i
);
5010 gfc_extract_int (e
, &order
[i
]);
5012 gcc_assert (order
[i
] >= 1 && order
[i
] <= rank
);
5014 gcc_assert (x
[order
[i
]] == 0);
5019 /* Count the elements in the source and padding arrays. */
5024 gfc_array_size (pad
, &size
);
5025 npad
= mpz_get_ui (size
);
5029 gfc_array_size (source
, &size
);
5030 nsource
= mpz_get_ui (size
);
5033 /* If it weren't for that pesky permutation we could just loop
5034 through the source and round out any shortage with pad elements.
5035 But no, someone just had to have the compiler do something the
5036 user should be doing. */
5038 for (i
= 0; i
< rank
; i
++)
5041 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5043 if (source
->ts
.type
== BT_DERIVED
)
5044 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5045 result
->rank
= rank
;
5046 result
->shape
= gfc_get_shape (rank
);
5047 for (i
= 0; i
< rank
; i
++)
5048 mpz_init_set_ui (result
->shape
[i
], shape
[i
]);
5050 while (nsource
> 0 || npad
> 0)
5052 /* Figure out which element to extract. */
5053 mpz_set_ui (index
, 0);
5055 for (i
= rank
- 1; i
>= 0; i
--)
5057 mpz_add_ui (index
, index
, x
[order
[i
]]);
5059 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
5062 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
5063 gfc_internal_error ("Reshaped array too large at %C");
5065 j
= mpz_get_ui (index
);
5068 e
= gfc_constructor_lookup_expr (source
->value
.constructor
, j
);
5071 gcc_assert (npad
> 0);
5075 e
= gfc_constructor_lookup_expr (pad
->value
.constructor
, j
);
5079 gfc_constructor_append_expr (&result
->value
.constructor
,
5080 gfc_copy_expr (e
), &e
->where
);
5082 /* Calculate the next element. */
5086 if (++x
[i
] < shape
[i
])
5102 gfc_simplify_rrspacing (gfc_expr
*x
)
5108 if (x
->expr_type
!= EXPR_CONSTANT
)
5111 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
5113 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5114 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5116 /* Special case x = -0 and 0. */
5117 if (mpfr_sgn (result
->value
.real
) == 0)
5119 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5123 /* | x * 2**(-e) | * 2**p. */
5124 e
= - (long int) mpfr_get_exp (x
->value
.real
);
5125 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
5127 p
= (long int) gfc_real_kinds
[i
].digits
;
5128 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
5130 return range_check (result
, "RRSPACING");
5135 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
5137 int k
, neg_flag
, power
, exp_range
;
5138 mpfr_t scale
, radix
;
5141 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5144 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5146 if (mpfr_sgn (x
->value
.real
) == 0)
5148 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5152 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5154 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
5156 /* This check filters out values of i that would overflow an int. */
5157 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
5158 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
5160 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
5161 gfc_free_expr (result
);
5162 return &gfc_bad_expr
;
5165 /* Compute scale = radix ** power. */
5166 power
= mpz_get_si (i
->value
.integer
);
5176 gfc_set_model_kind (x
->ts
.kind
);
5179 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
5180 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
5183 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5185 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5187 mpfr_clears (scale
, radix
, NULL
);
5189 return range_check (result
, "SCALE");
5193 /* Variants of strspn and strcspn that operate on wide characters. */
5196 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5199 const gfc_char_t
*c
;
5203 for (c
= s2
; *c
; c
++)
5217 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5220 const gfc_char_t
*c
;
5224 for (c
= s2
; *c
; c
++)
5239 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
5244 size_t indx
, len
, lenc
;
5245 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
5248 return &gfc_bad_expr
;
5250 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
5251 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
5254 if (b
!= NULL
&& b
->value
.logical
!= 0)
5259 len
= e
->value
.character
.length
;
5260 lenc
= c
->value
.character
.length
;
5262 if (len
== 0 || lenc
== 0)
5270 indx
= wide_strcspn (e
->value
.character
.string
,
5271 c
->value
.character
.string
) + 1;
5278 for (indx
= len
; indx
> 0; indx
--)
5280 for (i
= 0; i
< lenc
; i
++)
5282 if (c
->value
.character
.string
[i
]
5283 == e
->value
.character
.string
[indx
- 1])
5292 result
= gfc_get_int_expr (k
, &e
->where
, indx
);
5293 return range_check (result
, "SCAN");
5298 gfc_simplify_selected_char_kind (gfc_expr
*e
)
5302 if (e
->expr_type
!= EXPR_CONSTANT
)
5305 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
5306 || gfc_compare_with_Cstring (e
, "default", false) == 0)
5308 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
5313 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5318 gfc_simplify_selected_int_kind (gfc_expr
*e
)
5322 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
) != NULL
)
5327 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
5328 if (gfc_integer_kinds
[i
].range
>= range
5329 && gfc_integer_kinds
[i
].kind
< kind
)
5330 kind
= gfc_integer_kinds
[i
].kind
;
5332 if (kind
== INT_MAX
)
5335 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5340 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
, gfc_expr
*rdx
)
5342 int range
, precision
, radix
, i
, kind
, found_precision
, found_range
,
5344 locus
*loc
= &gfc_current_locus
;
5350 if (p
->expr_type
!= EXPR_CONSTANT
5351 || gfc_extract_int (p
, &precision
) != NULL
)
5360 if (q
->expr_type
!= EXPR_CONSTANT
5361 || gfc_extract_int (q
, &range
) != NULL
)
5372 if (rdx
->expr_type
!= EXPR_CONSTANT
5373 || gfc_extract_int (rdx
, &radix
) != NULL
)
5381 found_precision
= 0;
5385 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
5387 if (gfc_real_kinds
[i
].precision
>= precision
)
5388 found_precision
= 1;
5390 if (gfc_real_kinds
[i
].range
>= range
)
5393 if (gfc_real_kinds
[i
].radix
>= radix
)
5396 if (gfc_real_kinds
[i
].precision
>= precision
5397 && gfc_real_kinds
[i
].range
>= range
5398 && gfc_real_kinds
[i
].radix
>= radix
&& gfc_real_kinds
[i
].kind
< kind
)
5399 kind
= gfc_real_kinds
[i
].kind
;
5402 if (kind
== INT_MAX
)
5404 if (found_radix
&& found_range
&& !found_precision
)
5406 else if (found_radix
&& found_precision
&& !found_range
)
5408 else if (found_radix
&& !found_precision
&& !found_range
)
5410 else if (found_radix
)
5416 return gfc_get_int_expr (gfc_default_integer_kind
, loc
, kind
);
5421 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
5424 mpfr_t exp
, absv
, log2
, pow2
, frac
;
5427 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5430 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5432 if (mpfr_sgn (x
->value
.real
) == 0)
5434 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5438 gfc_set_model_kind (x
->ts
.kind
);
5445 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
5446 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
5448 mpfr_trunc (log2
, log2
);
5449 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
5451 /* Old exponent value, and fraction. */
5452 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
5454 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
5457 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
5458 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
5460 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
5462 return range_check (result
, "SET_EXPONENT");
5467 gfc_simplify_shape (gfc_expr
*source
, gfc_expr
*kind
)
5469 mpz_t shape
[GFC_MAX_DIMENSIONS
];
5470 gfc_expr
*result
, *e
, *f
;
5474 int k
= get_kind (BT_INTEGER
, kind
, "SHAPE", gfc_default_integer_kind
);
5476 if (source
->rank
== -1)
5479 result
= gfc_get_array_expr (BT_INTEGER
, k
, &source
->where
);
5481 if (source
->rank
== 0)
5484 if (source
->expr_type
== EXPR_VARIABLE
)
5486 ar
= gfc_find_array_ref (source
);
5487 t
= gfc_array_ref_shape (ar
, shape
);
5489 else if (source
->shape
)
5492 for (n
= 0; n
< source
->rank
; n
++)
5494 mpz_init (shape
[n
]);
5495 mpz_set (shape
[n
], source
->shape
[n
]);
5501 for (n
= 0; n
< source
->rank
; n
++)
5503 e
= gfc_get_constant_expr (BT_INTEGER
, k
, &source
->where
);
5507 mpz_set (e
->value
.integer
, shape
[n
]);
5508 mpz_clear (shape
[n
]);
5512 mpz_set_ui (e
->value
.integer
, n
+ 1);
5514 f
= gfc_simplify_size (source
, e
, NULL
);
5518 gfc_free_expr (result
);
5525 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
5533 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
5536 gfc_expr
*return_value
;
5538 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
5541 return &gfc_bad_expr
;
5543 /* For unary operations, the size of the result is given by the size
5544 of the operand. For binary ones, it's the size of the first operand
5545 unless it is scalar, then it is the size of the second. */
5546 if (array
->expr_type
== EXPR_OP
&& !array
->value
.op
.uop
)
5548 gfc_expr
* replacement
;
5549 gfc_expr
* simplified
;
5551 switch (array
->value
.op
.op
)
5553 /* Unary operations. */
5555 case INTRINSIC_UPLUS
:
5556 case INTRINSIC_UMINUS
:
5557 case INTRINSIC_PARENTHESES
:
5558 replacement
= array
->value
.op
.op1
;
5561 /* Binary operations. If any one of the operands is scalar, take
5562 the other one's size. If both of them are arrays, it does not
5563 matter -- try to find one with known shape, if possible. */
5565 if (array
->value
.op
.op1
->rank
== 0)
5566 replacement
= array
->value
.op
.op2
;
5567 else if (array
->value
.op
.op2
->rank
== 0)
5568 replacement
= array
->value
.op
.op1
;
5571 simplified
= gfc_simplify_size (array
->value
.op
.op1
, dim
, kind
);
5575 replacement
= array
->value
.op
.op2
;
5580 /* Try to reduce it directly if possible. */
5581 simplified
= gfc_simplify_size (replacement
, dim
, kind
);
5583 /* Otherwise, we build a new SIZE call. This is hopefully at least
5584 simpler than the original one. */
5586 simplified
= gfc_build_intrinsic_call (gfc_current_ns
,
5587 GFC_ISYM_SIZE
, "size",
5589 gfc_copy_expr (replacement
),
5590 gfc_copy_expr (dim
),
5591 gfc_copy_expr (kind
));
5598 if (gfc_array_size (array
, &size
) == FAILURE
)
5603 if (dim
->expr_type
!= EXPR_CONSTANT
)
5606 d
= mpz_get_ui (dim
->value
.integer
) - 1;
5607 if (gfc_array_dimen_size (array
, d
, &size
) == FAILURE
)
5611 return_value
= gfc_get_int_expr (k
, &array
->where
, mpz_get_si (size
));
5613 return return_value
;
5618 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
5622 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
5625 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5630 mpz_abs (result
->value
.integer
, x
->value
.integer
);
5631 if (mpz_sgn (y
->value
.integer
) < 0)
5632 mpz_neg (result
->value
.integer
, result
->value
.integer
);
5636 if (gfc_option
.flag_sign_zero
)
5637 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
5640 mpfr_setsign (result
->value
.real
, x
->value
.real
,
5641 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
5645 gfc_internal_error ("Bad type in gfc_simplify_sign");
5653 gfc_simplify_sin (gfc_expr
*x
)
5657 if (x
->expr_type
!= EXPR_CONSTANT
)
5660 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5665 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5669 gfc_set_model (x
->value
.real
);
5670 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5674 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
5677 return range_check (result
, "SIN");
5682 gfc_simplify_sinh (gfc_expr
*x
)
5686 if (x
->expr_type
!= EXPR_CONSTANT
)
5689 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5694 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5698 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5705 return range_check (result
, "SINH");
5709 /* The argument is always a double precision real that is converted to
5710 single precision. TODO: Rounding! */
5713 gfc_simplify_sngl (gfc_expr
*a
)
5717 if (a
->expr_type
!= EXPR_CONSTANT
)
5720 result
= gfc_real2real (a
, gfc_default_real_kind
);
5721 return range_check (result
, "SNGL");
5726 gfc_simplify_spacing (gfc_expr
*x
)
5732 if (x
->expr_type
!= EXPR_CONSTANT
)
5735 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
5737 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5739 /* Special case x = 0 and -0. */
5740 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5741 if (mpfr_sgn (result
->value
.real
) == 0)
5743 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
5747 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5748 are the radix, exponent of x, and precision. This excludes the
5749 possibility of subnormal numbers. Fortran 2003 states the result is
5750 b**max(e - p, emin - 1). */
5752 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
5753 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
5754 en
= en
> ep
? en
: ep
;
5756 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
5757 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
5759 return range_check (result
, "SPACING");
5764 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
5766 gfc_expr
*result
= 0L;
5767 int i
, j
, dim
, ncopies
;
5770 if ((!gfc_is_constant_expr (source
)
5771 && !is_constant_array_expr (source
))
5772 || !gfc_is_constant_expr (dim_expr
)
5773 || !gfc_is_constant_expr (ncopies_expr
))
5776 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
5777 gfc_extract_int (dim_expr
, &dim
);
5778 dim
-= 1; /* zero-base DIM */
5780 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
5781 gfc_extract_int (ncopies_expr
, &ncopies
);
5782 ncopies
= MAX (ncopies
, 0);
5784 /* Do not allow the array size to exceed the limit for an array
5786 if (source
->expr_type
== EXPR_ARRAY
)
5788 if (gfc_array_size (source
, &size
) == FAILURE
)
5789 gfc_internal_error ("Failure getting length of a constant array.");
5792 mpz_init_set_ui (size
, 1);
5794 if (mpz_get_si (size
)*ncopies
> gfc_option
.flag_max_array_constructor
)
5797 if (source
->expr_type
== EXPR_CONSTANT
)
5799 gcc_assert (dim
== 0);
5801 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5803 if (source
->ts
.type
== BT_DERIVED
)
5804 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5806 result
->shape
= gfc_get_shape (result
->rank
);
5807 mpz_init_set_si (result
->shape
[0], ncopies
);
5809 for (i
= 0; i
< ncopies
; ++i
)
5810 gfc_constructor_append_expr (&result
->value
.constructor
,
5811 gfc_copy_expr (source
), NULL
);
5813 else if (source
->expr_type
== EXPR_ARRAY
)
5815 int offset
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
5816 gfc_constructor
*source_ctor
;
5818 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
5819 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
5821 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5823 if (source
->ts
.type
== BT_DERIVED
)
5824 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5825 result
->rank
= source
->rank
+ 1;
5826 result
->shape
= gfc_get_shape (result
->rank
);
5828 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
5831 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
5833 mpz_init_set_si (result
->shape
[i
], ncopies
);
5835 extent
[i
] = mpz_get_si (result
->shape
[i
]);
5836 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
5840 for (source_ctor
= gfc_constructor_first (source
->value
.constructor
);
5841 source_ctor
; source_ctor
= gfc_constructor_next (source_ctor
))
5843 for (i
= 0; i
< ncopies
; ++i
)
5844 gfc_constructor_insert_expr (&result
->value
.constructor
,
5845 gfc_copy_expr (source_ctor
->expr
),
5846 NULL
, offset
+ i
* rstride
[dim
]);
5848 offset
+= (dim
== 0 ? ncopies
: 1);
5852 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
5853 Replace NULL with gcc_unreachable() after implementing
5854 gfc_simplify_cshift(). */
5857 if (source
->ts
.type
== BT_CHARACTER
)
5858 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
5865 gfc_simplify_sqrt (gfc_expr
*e
)
5867 gfc_expr
*result
= NULL
;
5869 if (e
->expr_type
!= EXPR_CONSTANT
)
5875 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
5877 gfc_error ("Argument of SQRT at %L has a negative value",
5879 return &gfc_bad_expr
;
5881 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
5882 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
5886 gfc_set_model (e
->value
.real
);
5888 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
5889 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
5893 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
5896 return range_check (result
, "SQRT");
5901 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
5903 return simplify_transformation (array
, dim
, mask
, 0, gfc_add
);
5908 gfc_simplify_tan (gfc_expr
*x
)
5912 if (x
->expr_type
!= EXPR_CONSTANT
)
5915 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5920 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5924 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5931 return range_check (result
, "TAN");
5936 gfc_simplify_tanh (gfc_expr
*x
)
5940 if (x
->expr_type
!= EXPR_CONSTANT
)
5943 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5948 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5952 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5959 return range_check (result
, "TANH");
5964 gfc_simplify_tiny (gfc_expr
*e
)
5969 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
5971 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
5972 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
5979 gfc_simplify_trailz (gfc_expr
*e
)
5981 unsigned long tz
, bs
;
5984 if (e
->expr_type
!= EXPR_CONSTANT
)
5987 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5988 bs
= gfc_integer_kinds
[i
].bit_size
;
5989 tz
= mpz_scan1 (e
->value
.integer
, 0);
5991 return gfc_get_int_expr (gfc_default_integer_kind
,
5992 &e
->where
, MIN (tz
, bs
));
5997 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
6000 gfc_expr
*mold_element
;
6005 unsigned char *buffer
;
6006 size_t result_length
;
6009 if (!gfc_is_constant_expr (source
)
6010 || (gfc_init_expr_flag
&& !gfc_is_constant_expr (mold
))
6011 || !gfc_is_constant_expr (size
))
6014 if (gfc_calculate_transfer_sizes (source
, mold
, size
, &source_size
,
6015 &result_size
, &result_length
) == FAILURE
)
6018 /* Calculate the size of the source. */
6019 if (source
->expr_type
== EXPR_ARRAY
6020 && gfc_array_size (source
, &tmp
) == FAILURE
)
6021 gfc_internal_error ("Failure getting length of a constant array.");
6023 /* Create an empty new expression with the appropriate characteristics. */
6024 result
= gfc_get_constant_expr (mold
->ts
.type
, mold
->ts
.kind
,
6026 result
->ts
= mold
->ts
;
6028 mold_element
= mold
->expr_type
== EXPR_ARRAY
6029 ? gfc_constructor_first (mold
->value
.constructor
)->expr
6032 /* Set result character length, if needed. Note that this needs to be
6033 set even for array expressions, in order to pass this information into
6034 gfc_target_interpret_expr. */
6035 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
6036 result
->value
.character
.length
= mold_element
->value
.character
.length
;
6038 /* Set the number of elements in the result, and determine its size. */
6040 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
6042 result
->expr_type
= EXPR_ARRAY
;
6044 result
->shape
= gfc_get_shape (1);
6045 mpz_init_set_ui (result
->shape
[0], result_length
);
6050 /* Allocate the buffer to store the binary version of the source. */
6051 buffer_size
= MAX (source_size
, result_size
);
6052 buffer
= (unsigned char*)alloca (buffer_size
);
6053 memset (buffer
, 0, buffer_size
);
6055 /* Now write source to the buffer. */
6056 gfc_target_encode_expr (source
, buffer
, buffer_size
);
6058 /* And read the buffer back into the new expression. */
6059 gfc_target_interpret_expr (buffer
, buffer_size
, result
, false);
6066 gfc_simplify_transpose (gfc_expr
*matrix
)
6068 int row
, matrix_rows
, col
, matrix_cols
;
6071 if (!is_constant_array_expr (matrix
))
6074 gcc_assert (matrix
->rank
== 2);
6076 result
= gfc_get_array_expr (matrix
->ts
.type
, matrix
->ts
.kind
,
6079 result
->shape
= gfc_get_shape (result
->rank
);
6080 mpz_set (result
->shape
[0], matrix
->shape
[1]);
6081 mpz_set (result
->shape
[1], matrix
->shape
[0]);
6083 if (matrix
->ts
.type
== BT_CHARACTER
)
6084 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
6085 else if (matrix
->ts
.type
== BT_DERIVED
)
6086 result
->ts
.u
.derived
= matrix
->ts
.u
.derived
;
6088 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
6089 matrix_cols
= mpz_get_si (matrix
->shape
[1]);
6090 for (row
= 0; row
< matrix_rows
; ++row
)
6091 for (col
= 0; col
< matrix_cols
; ++col
)
6093 gfc_expr
*e
= gfc_constructor_lookup_expr (matrix
->value
.constructor
,
6094 col
* matrix_rows
+ row
);
6095 gfc_constructor_insert_expr (&result
->value
.constructor
,
6096 gfc_copy_expr (e
), &matrix
->where
,
6097 row
* matrix_cols
+ col
);
6105 gfc_simplify_trim (gfc_expr
*e
)
6108 int count
, i
, len
, lentrim
;
6110 if (e
->expr_type
!= EXPR_CONSTANT
)
6113 len
= e
->value
.character
.length
;
6114 for (count
= 0, i
= 1; i
<= len
; ++i
)
6116 if (e
->value
.character
.string
[len
- i
] == ' ')
6122 lentrim
= len
- count
;
6124 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, lentrim
);
6125 for (i
= 0; i
< lentrim
; i
++)
6126 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
6133 gfc_simplify_image_index (gfc_expr
*coarray
, gfc_expr
*sub
)
6138 gfc_constructor
*sub_cons
;
6142 if (!is_constant_array_expr (sub
))
6145 /* Follow any component references. */
6146 as
= coarray
->symtree
->n
.sym
->as
;
6147 for (ref
= coarray
->ref
; ref
; ref
= ref
->next
)
6148 if (ref
->type
== REF_COMPONENT
)
6151 if (as
->type
== AS_DEFERRED
)
6154 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6155 the cosubscript addresses the first image. */
6157 sub_cons
= gfc_constructor_first (sub
->value
.constructor
);
6160 for (d
= 1; d
<= as
->corank
; d
++)
6165 gcc_assert (sub_cons
!= NULL
);
6167 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 0, as
,
6169 if (ca_bound
== NULL
)
6172 if (ca_bound
== &gfc_bad_expr
)
6175 cmp
= mpz_cmp (ca_bound
->value
.integer
, sub_cons
->expr
->value
.integer
);
6179 gfc_free_expr (ca_bound
);
6180 sub_cons
= gfc_constructor_next (sub_cons
);
6184 first_image
= false;
6188 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6189 "SUB has %ld and COARRAY lower bound is %ld)",
6191 mpz_get_si (sub_cons
->expr
->value
.integer
),
6192 mpz_get_si (ca_bound
->value
.integer
));
6193 gfc_free_expr (ca_bound
);
6194 return &gfc_bad_expr
;
6197 gfc_free_expr (ca_bound
);
6199 /* Check whether upperbound is valid for the multi-images case. */
6202 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 1, as
,
6204 if (ca_bound
== &gfc_bad_expr
)
6207 if (ca_bound
&& ca_bound
->expr_type
== EXPR_CONSTANT
6208 && mpz_cmp (ca_bound
->value
.integer
,
6209 sub_cons
->expr
->value
.integer
) < 0)
6211 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6212 "SUB has %ld and COARRAY upper bound is %ld)",
6214 mpz_get_si (sub_cons
->expr
->value
.integer
),
6215 mpz_get_si (ca_bound
->value
.integer
));
6216 gfc_free_expr (ca_bound
);
6217 return &gfc_bad_expr
;
6221 gfc_free_expr (ca_bound
);
6224 sub_cons
= gfc_constructor_next (sub_cons
);
6227 gcc_assert (sub_cons
== NULL
);
6229 if (gfc_option
.coarray
!= GFC_FCOARRAY_SINGLE
&& !first_image
)
6232 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6233 &gfc_current_locus
);
6235 mpz_set_si (result
->value
.integer
, 1);
6237 mpz_set_si (result
->value
.integer
, 0);
6244 gfc_simplify_this_image (gfc_expr
*coarray
, gfc_expr
*dim
)
6246 if (gfc_option
.coarray
!= GFC_FCOARRAY_SINGLE
)
6249 if (coarray
== NULL
)
6252 /* FIXME: gfc_current_locus is wrong. */
6253 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6254 &gfc_current_locus
);
6255 mpz_set_si (result
->value
.integer
, 1);
6259 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6260 return simplify_cobound (coarray
, dim
, NULL
, 0);
6265 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6267 return simplify_bound (array
, dim
, kind
, 1);
6271 gfc_simplify_ucobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6273 return simplify_cobound (array
, dim
, kind
, 1);
6278 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
6280 gfc_expr
*result
, *e
;
6281 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
6283 if (!is_constant_array_expr (vector
)
6284 || !is_constant_array_expr (mask
)
6285 || (!gfc_is_constant_expr (field
)
6286 && !is_constant_array_expr(field
)))
6289 result
= gfc_get_array_expr (vector
->ts
.type
, vector
->ts
.kind
,
6291 if (vector
->ts
.type
== BT_DERIVED
)
6292 result
->ts
.u
.derived
= vector
->ts
.u
.derived
;
6293 result
->rank
= mask
->rank
;
6294 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
6296 if (vector
->ts
.type
== BT_CHARACTER
)
6297 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
6299 vector_ctor
= gfc_constructor_first (vector
->value
.constructor
);
6300 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
6302 = field
->expr_type
== EXPR_ARRAY
6303 ? gfc_constructor_first (field
->value
.constructor
)
6308 if (mask_ctor
->expr
->value
.logical
)
6310 gcc_assert (vector_ctor
);
6311 e
= gfc_copy_expr (vector_ctor
->expr
);
6312 vector_ctor
= gfc_constructor_next (vector_ctor
);
6314 else if (field
->expr_type
== EXPR_ARRAY
)
6315 e
= gfc_copy_expr (field_ctor
->expr
);
6317 e
= gfc_copy_expr (field
);
6319 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
6321 mask_ctor
= gfc_constructor_next (mask_ctor
);
6322 field_ctor
= gfc_constructor_next (field_ctor
);
6330 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
6334 size_t index
, len
, lenset
;
6336 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
6339 return &gfc_bad_expr
;
6341 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
6342 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
6345 if (b
!= NULL
&& b
->value
.logical
!= 0)
6350 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &s
->where
);
6352 len
= s
->value
.character
.length
;
6353 lenset
= set
->value
.character
.length
;
6357 mpz_set_ui (result
->value
.integer
, 0);
6365 mpz_set_ui (result
->value
.integer
, 1);
6369 index
= wide_strspn (s
->value
.character
.string
,
6370 set
->value
.character
.string
) + 1;
6379 mpz_set_ui (result
->value
.integer
, len
);
6382 for (index
= len
; index
> 0; index
--)
6384 for (i
= 0; i
< lenset
; i
++)
6386 if (s
->value
.character
.string
[index
- 1]
6387 == set
->value
.character
.string
[i
])
6395 mpz_set_ui (result
->value
.integer
, index
);
6401 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
6406 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6409 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
6414 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
6415 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
6416 return range_check (result
, "XOR");
6419 return gfc_get_logical_expr (kind
, &x
->where
,
6420 (x
->value
.logical
&& !y
->value
.logical
)
6421 || (!x
->value
.logical
&& y
->value
.logical
));
6429 /****************** Constant simplification *****************/
6431 /* Master function to convert one constant to another. While this is
6432 used as a simplification function, it requires the destination type
6433 and kind information which is supplied by a special case in
6437 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
6439 gfc_expr
*g
, *result
, *(*f
) (gfc_expr
*, int);
6454 f
= gfc_int2complex
;
6474 f
= gfc_real2complex
;
6485 f
= gfc_complex2int
;
6488 f
= gfc_complex2real
;
6491 f
= gfc_complex2complex
;
6517 f
= gfc_hollerith2int
;
6521 f
= gfc_hollerith2real
;
6525 f
= gfc_hollerith2complex
;
6529 f
= gfc_hollerith2character
;
6533 f
= gfc_hollerith2logical
;
6543 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
6548 switch (e
->expr_type
)
6551 result
= f (e
, kind
);
6553 return &gfc_bad_expr
;
6557 if (!gfc_is_constant_expr (e
))
6560 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
6561 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
6562 result
->rank
= e
->rank
;
6564 for (c
= gfc_constructor_first (e
->value
.constructor
);
6565 c
; c
= gfc_constructor_next (c
))
6568 if (c
->iterator
== NULL
)
6569 tmp
= f (c
->expr
, kind
);
6572 g
= gfc_convert_constant (c
->expr
, type
, kind
);
6573 if (g
== &gfc_bad_expr
)
6575 gfc_free_expr (result
);
6583 gfc_free_expr (result
);
6587 gfc_constructor_append_expr (&result
->value
.constructor
,
6601 /* Function for converting character constants. */
6603 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
6608 if (!gfc_is_constant_expr (e
))
6611 if (e
->expr_type
== EXPR_CONSTANT
)
6613 /* Simple case of a scalar. */
6614 result
= gfc_get_constant_expr (BT_CHARACTER
, kind
, &e
->where
);
6616 return &gfc_bad_expr
;
6618 result
->value
.character
.length
= e
->value
.character
.length
;
6619 result
->value
.character
.string
6620 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
6621 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
6622 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
6624 /* Check we only have values representable in the destination kind. */
6625 for (i
= 0; i
< result
->value
.character
.length
; i
++)
6626 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
6629 gfc_error ("Character '%s' in string at %L cannot be converted "
6630 "into character kind %d",
6631 gfc_print_wide_char (result
->value
.character
.string
[i
]),
6633 return &gfc_bad_expr
;
6638 else if (e
->expr_type
== EXPR_ARRAY
)
6640 /* For an array constructor, we convert each constructor element. */
6643 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
6644 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
6645 result
->rank
= e
->rank
;
6646 result
->ts
.u
.cl
= e
->ts
.u
.cl
;
6648 for (c
= gfc_constructor_first (e
->value
.constructor
);
6649 c
; c
= gfc_constructor_next (c
))
6651 gfc_expr
*tmp
= gfc_convert_char_constant (c
->expr
, type
, kind
);
6652 if (tmp
== &gfc_bad_expr
)
6654 gfc_free_expr (result
);
6655 return &gfc_bad_expr
;
6660 gfc_free_expr (result
);
6664 gfc_constructor_append_expr (&result
->value
.constructor
,
6676 gfc_simplify_compiler_options (void)
6681 str
= gfc_get_option_string ();
6682 result
= gfc_get_character_expr (gfc_default_character_kind
,
6683 &gfc_current_locus
, str
, strlen (str
));
6690 gfc_simplify_compiler_version (void)
6695 len
= strlen ("GCC version ") + strlen (version_string
);
6696 buffer
= XALLOCAVEC (char, len
+ 1);
6697 snprintf (buffer
, len
+ 1, "GCC version %s", version_string
);
6698 return gfc_get_character_expr (gfc_default_character_kind
,
6699 &gfc_current_locus
, buffer
, len
);