1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2014 Free Software Foundation, Inc.
3 Contributed by Andy Vaught & Katherine Holcomb
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
27 #include "intrinsic.h"
28 #include "target-memory.h"
29 #include "constructor.h"
30 #include "tm.h" /* For BITS_PER_UNIT. */
31 #include "version.h" /* For version_string. */
34 gfc_expr gfc_bad_expr
;
36 static gfc_expr
*simplify_size (gfc_expr
*, gfc_expr
*, int);
39 /* Note that 'simplification' is not just transforming expressions.
40 For functions that are not simplified at compile time, range
41 checking is done if possible.
43 The return convention is that each simplification function returns:
45 A new expression node corresponding to the simplified arguments.
46 The original arguments are destroyed by the caller, and must not
47 be a part of the new expression.
49 NULL pointer indicating that no simplification was possible and
50 the original expression should remain intact.
52 An expression pointer to gfc_bad_expr (a static placeholder)
53 indicating that some error has prevented simplification. The
54 error is generated within the function and should be propagated
57 By the time a simplification function gets control, it has been
58 decided that the function call is really supposed to be the
59 intrinsic. No type checking is strictly necessary, since only
60 valid types will be passed on. On the other hand, a simplification
61 subroutine may have to look at the type of an argument as part of
64 Array arguments are only passed to these subroutines that implement
65 the simplification of transformational intrinsics.
67 The functions in this file don't have much comment with them, but
68 everything is reasonably straight-forward. The Standard, chapter 13
69 is the best comment you'll find for this file anyway. */
71 /* Range checks an expression node. If all goes well, returns the
72 node, otherwise returns &gfc_bad_expr and frees the node. */
75 range_check (gfc_expr
*result
, const char *name
)
80 if (result
->expr_type
!= EXPR_CONSTANT
)
83 switch (gfc_range_check (result
))
89 gfc_error ("Result of %s overflows its kind at %L", name
,
94 gfc_error ("Result of %s underflows its kind at %L", name
,
99 gfc_error ("Result of %s is NaN at %L", name
, &result
->where
);
103 gfc_error ("Result of %s gives range error for its kind at %L", name
,
108 gfc_free_expr (result
);
109 return &gfc_bad_expr
;
113 /* A helper function that gets an optional and possibly missing
114 kind parameter. Returns the kind, -1 if something went wrong. */
117 get_kind (bt type
, gfc_expr
*k
, const char *name
, int default_kind
)
124 if (k
->expr_type
!= EXPR_CONSTANT
)
126 gfc_error ("KIND parameter of %s at %L must be an initialization "
127 "expression", name
, &k
->where
);
131 if (gfc_extract_int (k
, &kind
) != NULL
132 || gfc_validate_kind (type
, kind
, true) < 0)
134 gfc_error ("Invalid KIND parameter of %s at %L", name
, &k
->where
);
142 /* Converts an mpz_t signed variable into an unsigned one, assuming
143 two's complement representations and a binary width of bitsize.
144 The conversion is a no-op unless x is negative; otherwise, it can
145 be accomplished by masking out the high bits. */
148 convert_mpz_to_unsigned (mpz_t x
, int bitsize
)
154 /* Confirm that no bits above the signed range are unset if we
155 are doing range checking. */
156 if (gfc_option
.flag_range_check
!= 0)
157 gcc_assert (mpz_scan0 (x
, bitsize
-1) == ULONG_MAX
);
159 mpz_init_set_ui (mask
, 1);
160 mpz_mul_2exp (mask
, mask
, bitsize
);
161 mpz_sub_ui (mask
, mask
, 1);
163 mpz_and (x
, x
, mask
);
169 /* Confirm that no bits above the signed range are set. */
170 gcc_assert (mpz_scan1 (x
, bitsize
-1) == ULONG_MAX
);
175 /* Converts an mpz_t unsigned variable into a signed one, assuming
176 two's complement representations and a binary width of bitsize.
177 If the bitsize-1 bit is set, this is taken as a sign bit and
178 the number is converted to the corresponding negative number. */
181 gfc_convert_mpz_to_signed (mpz_t x
, int bitsize
)
185 /* Confirm that no bits above the unsigned range are set if we are
186 doing range checking. */
187 if (gfc_option
.flag_range_check
!= 0)
188 gcc_assert (mpz_scan1 (x
, bitsize
) == ULONG_MAX
);
190 if (mpz_tstbit (x
, bitsize
- 1) == 1)
192 mpz_init_set_ui (mask
, 1);
193 mpz_mul_2exp (mask
, mask
, bitsize
);
194 mpz_sub_ui (mask
, mask
, 1);
196 /* We negate the number by hand, zeroing the high bits, that is
197 make it the corresponding positive number, and then have it
198 negated by GMP, giving the correct representation of the
201 mpz_add_ui (x
, x
, 1);
202 mpz_and (x
, x
, mask
);
211 /* In-place convert BOZ to REAL of the specified kind. */
214 convert_boz (gfc_expr
*x
, int kind
)
216 if (x
&& x
->ts
.type
== BT_INTEGER
&& x
->is_boz
)
223 if (!gfc_convert_boz (x
, &ts
))
224 return &gfc_bad_expr
;
231 /* Test that the expression is an constant array. */
234 is_constant_array_expr (gfc_expr
*e
)
241 if (e
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (e
))
244 for (c
= gfc_constructor_first (e
->value
.constructor
);
245 c
; c
= gfc_constructor_next (c
))
246 if (c
->expr
->expr_type
!= EXPR_CONSTANT
247 && c
->expr
->expr_type
!= EXPR_STRUCTURE
)
254 /* Initialize a transformational result expression with a given value. */
257 init_result_expr (gfc_expr
*e
, int init
, gfc_expr
*array
)
259 if (e
&& e
->expr_type
== EXPR_ARRAY
)
261 gfc_constructor
*ctor
= gfc_constructor_first (e
->value
.constructor
);
264 init_result_expr (ctor
->expr
, init
, array
);
265 ctor
= gfc_constructor_next (ctor
);
268 else if (e
&& e
->expr_type
== EXPR_CONSTANT
)
270 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
277 e
->value
.logical
= (init
? 1 : 0);
282 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].min_int
);
283 else if (init
== INT_MAX
)
284 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].huge
);
286 mpz_set_si (e
->value
.integer
, init
);
292 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
293 mpfr_neg (e
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
295 else if (init
== INT_MAX
)
296 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
298 mpfr_set_si (e
->value
.real
, init
, GFC_RND_MODE
);
302 mpc_set_si (e
->value
.complex, init
, GFC_MPC_RND_MODE
);
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
, 0, length
);
313 else if (init
== INT_MAX
)
315 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
316 gfc_extract_int (len
, &length
);
317 string
= gfc_get_wide_string (length
+ 1);
318 gfc_wide_memset (string
, 255, length
);
323 string
= gfc_get_wide_string (1);
326 string
[length
] = '\0';
327 e
->value
.character
.length
= length
;
328 e
->value
.character
.string
= string
;
340 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
341 if conj_a is true, the matrix_a is complex conjugated. */
344 compute_dot_product (gfc_expr
*matrix_a
, int stride_a
, int offset_a
,
345 gfc_expr
*matrix_b
, int stride_b
, int offset_b
,
348 gfc_expr
*result
, *a
, *b
, *c
;
350 result
= gfc_get_constant_expr (matrix_a
->ts
.type
, matrix_a
->ts
.kind
,
352 init_result_expr (result
, 0, NULL
);
354 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
355 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
358 /* Copying of expressions is required as operands are free'd
359 by the gfc_arith routines. */
360 switch (result
->ts
.type
)
363 result
= gfc_or (result
,
364 gfc_and (gfc_copy_expr (a
),
371 if (conj_a
&& a
->ts
.type
== BT_COMPLEX
)
372 c
= gfc_simplify_conjg (a
);
374 c
= gfc_copy_expr (a
);
375 result
= gfc_add (result
, gfc_multiply (c
, gfc_copy_expr (b
)));
382 offset_a
+= stride_a
;
383 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
385 offset_b
+= stride_b
;
386 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
393 /* Build a result expression for transformational intrinsics,
397 transformational_result (gfc_expr
*array
, gfc_expr
*dim
, bt type
,
398 int kind
, locus
* where
)
403 if (!dim
|| array
->rank
== 1)
404 return gfc_get_constant_expr (type
, kind
, where
);
406 result
= gfc_get_array_expr (type
, kind
, where
);
407 result
->shape
= gfc_copy_shape_excluding (array
->shape
, array
->rank
, dim
);
408 result
->rank
= array
->rank
- 1;
410 /* gfc_array_size() would count the number of elements in the constructor,
411 we have not built those yet. */
413 for (i
= 0; i
< result
->rank
; ++i
)
414 nelem
*= mpz_get_ui (result
->shape
[i
]);
416 for (i
= 0; i
< nelem
; ++i
)
418 gfc_constructor_append_expr (&result
->value
.constructor
,
419 gfc_get_constant_expr (type
, kind
, where
),
427 typedef gfc_expr
* (*transformational_op
)(gfc_expr
*, gfc_expr
*);
429 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
430 of COUNT intrinsic is .TRUE..
432 Interface and implementation mimics arith functions as
433 gfc_add, gfc_multiply, etc. */
435 static gfc_expr
* gfc_count (gfc_expr
*op1
, gfc_expr
*op2
)
439 gcc_assert (op1
->ts
.type
== BT_INTEGER
);
440 gcc_assert (op2
->ts
.type
== BT_LOGICAL
);
441 gcc_assert (op2
->value
.logical
);
443 result
= gfc_copy_expr (op1
);
444 mpz_add_ui (result
->value
.integer
, result
->value
.integer
, 1);
452 /* Transforms an ARRAY with operation OP, according to MASK, to a
453 scalar RESULT. E.g. called if
455 REAL, PARAMETER :: array(n, m) = ...
456 REAL, PARAMETER :: s = SUM(array)
458 where OP == gfc_add(). */
461 simplify_transformation_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
462 transformational_op op
)
465 gfc_constructor
*array_ctor
, *mask_ctor
;
467 /* Shortcut for constant .FALSE. MASK. */
469 && mask
->expr_type
== EXPR_CONSTANT
470 && !mask
->value
.logical
)
473 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
475 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
476 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
480 a
= array_ctor
->expr
;
481 array_ctor
= gfc_constructor_next (array_ctor
);
483 /* A constant MASK equals .TRUE. here and can be ignored. */
487 mask_ctor
= gfc_constructor_next (mask_ctor
);
488 if (!m
->value
.logical
)
492 result
= op (result
, gfc_copy_expr (a
));
498 /* Transforms an ARRAY with operation OP, according to MASK, to an
499 array RESULT. E.g. called if
501 REAL, PARAMETER :: array(n, m) = ...
502 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
504 where OP == gfc_multiply().
505 The result might be post processed using post_op. */
508 simplify_transformation_to_array (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*dim
,
509 gfc_expr
*mask
, transformational_op op
,
510 transformational_op post_op
)
513 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
514 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
515 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
517 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
518 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
519 tmpstride
[GFC_MAX_DIMENSIONS
];
521 /* Shortcut for constant .FALSE. MASK. */
523 && mask
->expr_type
== EXPR_CONSTANT
524 && !mask
->value
.logical
)
527 /* Build an indexed table for array element expressions to minimize
528 linked-list traversal. Masked elements are set to NULL. */
529 gfc_array_size (array
, &size
);
530 arraysize
= mpz_get_ui (size
);
533 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
535 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
537 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
538 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
540 for (i
= 0; i
< arraysize
; ++i
)
542 arrayvec
[i
] = array_ctor
->expr
;
543 array_ctor
= gfc_constructor_next (array_ctor
);
547 if (!mask_ctor
->expr
->value
.logical
)
550 mask_ctor
= gfc_constructor_next (mask_ctor
);
554 /* Same for the result expression. */
555 gfc_array_size (result
, &size
);
556 resultsize
= mpz_get_ui (size
);
559 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
560 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
561 for (i
= 0; i
< resultsize
; ++i
)
563 resultvec
[i
] = result_ctor
->expr
;
564 result_ctor
= gfc_constructor_next (result_ctor
);
567 gfc_extract_int (dim
, &dim_index
);
568 dim_index
-= 1; /* zero-base index */
572 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
575 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
578 dim_extent
= mpz_get_si (array
->shape
[i
]);
579 dim_stride
= tmpstride
[i
];
583 extent
[n
] = mpz_get_si (array
->shape
[i
]);
584 sstride
[n
] = tmpstride
[i
];
585 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
594 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
596 *dest
= op (*dest
, gfc_copy_expr (*src
));
603 while (!done
&& count
[n
] == extent
[n
])
606 base
-= sstride
[n
] * extent
[n
];
607 dest
-= dstride
[n
] * extent
[n
];
610 if (n
< result
->rank
)
621 /* Place updated expression in result constructor. */
622 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
623 for (i
= 0; i
< resultsize
; ++i
)
626 result_ctor
->expr
= post_op (result_ctor
->expr
, resultvec
[i
]);
628 result_ctor
->expr
= resultvec
[i
];
629 result_ctor
= gfc_constructor_next (result_ctor
);
639 simplify_transformation (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
640 int init_val
, transformational_op op
)
644 if (!is_constant_array_expr (array
)
645 || !gfc_is_constant_expr (dim
))
649 && !is_constant_array_expr (mask
)
650 && mask
->expr_type
!= EXPR_CONSTANT
)
653 result
= transformational_result (array
, dim
, array
->ts
.type
,
654 array
->ts
.kind
, &array
->where
);
655 init_result_expr (result
, init_val
, NULL
);
657 return !dim
|| array
->rank
== 1 ?
658 simplify_transformation_to_scalar (result
, array
, mask
, op
) :
659 simplify_transformation_to_array (result
, array
, dim
, mask
, op
, NULL
);
663 /********************** Simplification functions *****************************/
666 gfc_simplify_abs (gfc_expr
*e
)
670 if (e
->expr_type
!= EXPR_CONSTANT
)
676 result
= gfc_get_constant_expr (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
677 mpz_abs (result
->value
.integer
, e
->value
.integer
);
678 return range_check (result
, "IABS");
681 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
682 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
683 return range_check (result
, "ABS");
686 gfc_set_model_kind (e
->ts
.kind
);
687 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
688 mpc_abs (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
689 return range_check (result
, "CABS");
692 gfc_internal_error ("gfc_simplify_abs(): Bad type");
698 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
702 bool too_large
= false;
704 if (e
->expr_type
!= EXPR_CONSTANT
)
707 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
709 return &gfc_bad_expr
;
711 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
713 gfc_error ("Argument of %s function at %L is negative", name
,
715 return &gfc_bad_expr
;
718 if (ascii
&& warn_surprising
&& mpz_cmp_si (e
->value
.integer
, 127) > 0)
719 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
722 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
727 mpz_init_set_ui (t
, 2);
728 mpz_pow_ui (t
, t
, 32);
729 mpz_sub_ui (t
, t
, 1);
730 if (mpz_cmp (e
->value
.integer
, t
) > 0)
737 gfc_error ("Argument of %s function at %L is too large for the "
738 "collating sequence of kind %d", name
, &e
->where
, kind
);
739 return &gfc_bad_expr
;
742 result
= gfc_get_character_expr (kind
, &e
->where
, NULL
, 1);
743 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
750 /* We use the processor's collating sequence, because all
751 systems that gfortran currently works on are ASCII. */
754 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
756 return simplify_achar_char (e
, k
, "ACHAR", true);
761 gfc_simplify_acos (gfc_expr
*x
)
765 if (x
->expr_type
!= EXPR_CONSTANT
)
771 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
772 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
774 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
776 return &gfc_bad_expr
;
778 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
779 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
783 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
784 mpc_acos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
788 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
791 return range_check (result
, "ACOS");
795 gfc_simplify_acosh (gfc_expr
*x
)
799 if (x
->expr_type
!= EXPR_CONSTANT
)
805 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
807 gfc_error ("Argument of ACOSH at %L must not be less than 1",
809 return &gfc_bad_expr
;
812 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
813 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
817 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
818 mpc_acosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
822 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
825 return range_check (result
, "ACOSH");
829 gfc_simplify_adjustl (gfc_expr
*e
)
835 if (e
->expr_type
!= EXPR_CONSTANT
)
838 len
= e
->value
.character
.length
;
840 for (count
= 0, i
= 0; i
< len
; ++i
)
842 ch
= e
->value
.character
.string
[i
];
848 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
849 for (i
= 0; i
< len
- count
; ++i
)
850 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
857 gfc_simplify_adjustr (gfc_expr
*e
)
863 if (e
->expr_type
!= EXPR_CONSTANT
)
866 len
= e
->value
.character
.length
;
868 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
870 ch
= e
->value
.character
.string
[i
];
876 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
877 for (i
= 0; i
< count
; ++i
)
878 result
->value
.character
.string
[i
] = ' ';
880 for (i
= count
; i
< len
; ++i
)
881 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
888 gfc_simplify_aimag (gfc_expr
*e
)
892 if (e
->expr_type
!= EXPR_CONSTANT
)
895 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
896 mpfr_set (result
->value
.real
, mpc_imagref (e
->value
.complex), GFC_RND_MODE
);
898 return range_check (result
, "AIMAG");
903 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
905 gfc_expr
*rtrunc
, *result
;
908 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
910 return &gfc_bad_expr
;
912 if (e
->expr_type
!= EXPR_CONSTANT
)
915 rtrunc
= gfc_copy_expr (e
);
916 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
918 result
= gfc_real2real (rtrunc
, kind
);
920 gfc_free_expr (rtrunc
);
922 return range_check (result
, "AINT");
927 gfc_simplify_all (gfc_expr
*mask
, gfc_expr
*dim
)
929 return simplify_transformation (mask
, dim
, NULL
, true, gfc_and
);
934 gfc_simplify_dint (gfc_expr
*e
)
936 gfc_expr
*rtrunc
, *result
;
938 if (e
->expr_type
!= EXPR_CONSTANT
)
941 rtrunc
= gfc_copy_expr (e
);
942 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
944 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
946 gfc_free_expr (rtrunc
);
948 return range_check (result
, "DINT");
953 gfc_simplify_dreal (gfc_expr
*e
)
955 gfc_expr
*result
= NULL
;
957 if (e
->expr_type
!= EXPR_CONSTANT
)
960 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
961 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
963 return range_check (result
, "DREAL");
968 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
973 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
975 return &gfc_bad_expr
;
977 if (e
->expr_type
!= EXPR_CONSTANT
)
980 result
= gfc_get_constant_expr (e
->ts
.type
, kind
, &e
->where
);
981 mpfr_round (result
->value
.real
, e
->value
.real
);
983 return range_check (result
, "ANINT");
988 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
993 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
996 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1001 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
1002 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1003 return range_check (result
, "AND");
1006 return gfc_get_logical_expr (kind
, &x
->where
,
1007 x
->value
.logical
&& y
->value
.logical
);
1016 gfc_simplify_any (gfc_expr
*mask
, gfc_expr
*dim
)
1018 return simplify_transformation (mask
, dim
, NULL
, false, gfc_or
);
1023 gfc_simplify_dnint (gfc_expr
*e
)
1027 if (e
->expr_type
!= EXPR_CONSTANT
)
1030 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &e
->where
);
1031 mpfr_round (result
->value
.real
, e
->value
.real
);
1033 return range_check (result
, "DNINT");
1038 gfc_simplify_asin (gfc_expr
*x
)
1042 if (x
->expr_type
!= EXPR_CONSTANT
)
1048 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1049 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1051 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1053 return &gfc_bad_expr
;
1055 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1056 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1060 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1061 mpc_asin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1065 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1068 return range_check (result
, "ASIN");
1073 gfc_simplify_asinh (gfc_expr
*x
)
1077 if (x
->expr_type
!= EXPR_CONSTANT
)
1080 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1085 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1089 mpc_asinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1093 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1096 return range_check (result
, "ASINH");
1101 gfc_simplify_atan (gfc_expr
*x
)
1105 if (x
->expr_type
!= EXPR_CONSTANT
)
1108 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1113 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1117 mpc_atan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1121 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1124 return range_check (result
, "ATAN");
1129 gfc_simplify_atanh (gfc_expr
*x
)
1133 if (x
->expr_type
!= EXPR_CONSTANT
)
1139 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
1140 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
1142 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1144 return &gfc_bad_expr
;
1146 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1147 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1151 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1152 mpc_atanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1156 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1159 return range_check (result
, "ATANH");
1164 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
1168 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1171 if (mpfr_zero_p (y
->value
.real
) && mpfr_zero_p (x
->value
.real
))
1173 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1174 "second argument must not be zero", &x
->where
);
1175 return &gfc_bad_expr
;
1178 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1179 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1181 return range_check (result
, "ATAN2");
1186 gfc_simplify_bessel_j0 (gfc_expr
*x
)
1190 if (x
->expr_type
!= EXPR_CONSTANT
)
1193 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1194 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1196 return range_check (result
, "BESSEL_J0");
1201 gfc_simplify_bessel_j1 (gfc_expr
*x
)
1205 if (x
->expr_type
!= EXPR_CONSTANT
)
1208 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1209 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1211 return range_check (result
, "BESSEL_J1");
1216 gfc_simplify_bessel_jn (gfc_expr
*order
, gfc_expr
*x
)
1221 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1224 n
= mpz_get_si (order
->value
.integer
);
1225 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1226 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1228 return range_check (result
, "BESSEL_JN");
1232 /* Simplify transformational form of JN and YN. */
1235 gfc_simplify_bessel_n2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
,
1242 mpfr_t x2rev
, last1
, last2
;
1244 if (x
->expr_type
!= EXPR_CONSTANT
|| order1
->expr_type
!= EXPR_CONSTANT
1245 || order2
->expr_type
!= EXPR_CONSTANT
)
1248 n1
= mpz_get_si (order1
->value
.integer
);
1249 n2
= mpz_get_si (order2
->value
.integer
);
1250 result
= gfc_get_array_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1252 result
->shape
= gfc_get_shape (1);
1253 mpz_init_set_ui (result
->shape
[0], MAX (n2
-n1
+1, 0));
1258 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1259 YN(N, 0.0) = -Inf. */
1261 if (mpfr_cmp_ui (x
->value
.real
, 0.0) == 0)
1263 if (!jn
&& gfc_option
.flag_range_check
)
1265 gfc_error ("Result of BESSEL_YN is -INF at %L", &result
->where
);
1266 gfc_free_expr (result
);
1267 return &gfc_bad_expr
;
1272 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1273 mpfr_set_ui (e
->value
.real
, 1, GFC_RND_MODE
);
1274 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1279 for (i
= n1
; i
<= n2
; i
++)
1281 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1283 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
1285 mpfr_set_inf (e
->value
.real
, -1);
1286 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1293 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1294 are stable for downward recursion and Neumann functions are stable
1295 for upward recursion. It is
1297 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1298 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1299 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1301 gfc_set_model_kind (x
->ts
.kind
);
1303 /* Get first recursion anchor. */
1307 mpfr_jn (last1
, n2
, x
->value
.real
, GFC_RND_MODE
);
1309 mpfr_yn (last1
, n1
, x
->value
.real
, GFC_RND_MODE
);
1311 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1312 mpfr_set (e
->value
.real
, last1
, GFC_RND_MODE
);
1313 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1317 gfc_free_expr (result
);
1318 return &gfc_bad_expr
;
1320 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1328 /* Get second recursion anchor. */
1332 mpfr_jn (last2
, n2
-1, x
->value
.real
, GFC_RND_MODE
);
1334 mpfr_yn (last2
, n1
+1, x
->value
.real
, GFC_RND_MODE
);
1336 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1337 mpfr_set (e
->value
.real
, last2
, GFC_RND_MODE
);
1338 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1343 gfc_free_expr (result
);
1344 return &gfc_bad_expr
;
1347 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
, -2);
1349 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1358 /* Start actual recursion. */
1361 mpfr_ui_div (x2rev
, 2, x
->value
.real
, GFC_RND_MODE
);
1363 for (i
= 2; i
<= n2
-n1
; i
++)
1365 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1367 /* Special case: For YN, if the previous N gave -INF, set
1368 also N+1 to -INF. */
1369 if (!jn
&& !gfc_option
.flag_range_check
&& mpfr_inf_p (last2
))
1371 mpfr_set_inf (e
->value
.real
, -1);
1372 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1377 mpfr_mul_si (e
->value
.real
, x2rev
, jn
? (n2
-i
+1) : (n1
+i
-1),
1379 mpfr_mul (e
->value
.real
, e
->value
.real
, last2
, GFC_RND_MODE
);
1380 mpfr_sub (e
->value
.real
, e
->value
.real
, last1
, GFC_RND_MODE
);
1382 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1384 /* Range_check frees "e" in that case. */
1390 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
,
1393 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1395 mpfr_set (last1
, last2
, GFC_RND_MODE
);
1396 mpfr_set (last2
, e
->value
.real
, GFC_RND_MODE
);
1409 gfc_free_expr (result
);
1410 return &gfc_bad_expr
;
1415 gfc_simplify_bessel_jn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1417 return gfc_simplify_bessel_n2 (order1
, order2
, x
, true);
1422 gfc_simplify_bessel_y0 (gfc_expr
*x
)
1426 if (x
->expr_type
!= EXPR_CONSTANT
)
1429 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1430 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1432 return range_check (result
, "BESSEL_Y0");
1437 gfc_simplify_bessel_y1 (gfc_expr
*x
)
1441 if (x
->expr_type
!= EXPR_CONSTANT
)
1444 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1445 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1447 return range_check (result
, "BESSEL_Y1");
1452 gfc_simplify_bessel_yn (gfc_expr
*order
, gfc_expr
*x
)
1457 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1460 n
= mpz_get_si (order
->value
.integer
);
1461 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1462 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1464 return range_check (result
, "BESSEL_YN");
1469 gfc_simplify_bessel_yn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1471 return gfc_simplify_bessel_n2 (order1
, order2
, x
, false);
1476 gfc_simplify_bit_size (gfc_expr
*e
)
1478 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1479 return gfc_get_int_expr (e
->ts
.kind
, &e
->where
,
1480 gfc_integer_kinds
[i
].bit_size
);
1485 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
1489 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
1492 if (gfc_extract_int (bit
, &b
) != NULL
|| b
< 0)
1493 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
, false);
1495 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
,
1496 mpz_tstbit (e
->value
.integer
, b
));
1501 compare_bitwise (gfc_expr
*i
, gfc_expr
*j
)
1506 gcc_assert (i
->ts
.type
== BT_INTEGER
);
1507 gcc_assert (j
->ts
.type
== BT_INTEGER
);
1509 mpz_init_set (x
, i
->value
.integer
);
1510 k
= gfc_validate_kind (i
->ts
.type
, i
->ts
.kind
, false);
1511 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
1513 mpz_init_set (y
, j
->value
.integer
);
1514 k
= gfc_validate_kind (j
->ts
.type
, j
->ts
.kind
, false);
1515 convert_mpz_to_unsigned (y
, gfc_integer_kinds
[k
].bit_size
);
1517 res
= mpz_cmp (x
, y
);
1525 gfc_simplify_bge (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_bgt (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_ble (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_blt (gfc_expr
*i
, gfc_expr
*j
)
1560 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1563 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1564 compare_bitwise (i
, j
) < 0);
1569 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
1571 gfc_expr
*ceil
, *result
;
1574 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
1576 return &gfc_bad_expr
;
1578 if (e
->expr_type
!= EXPR_CONSTANT
)
1581 ceil
= gfc_copy_expr (e
);
1582 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
1584 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
1585 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
, &e
->where
);
1587 gfc_free_expr (ceil
);
1589 return range_check (result
, "CEILING");
1594 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
1596 return simplify_achar_char (e
, k
, "CHAR", false);
1600 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1603 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
1607 if (convert_boz (x
, kind
) == &gfc_bad_expr
)
1608 return &gfc_bad_expr
;
1610 if (convert_boz (y
, kind
) == &gfc_bad_expr
)
1611 return &gfc_bad_expr
;
1613 if (x
->expr_type
!= EXPR_CONSTANT
1614 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1617 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &x
->where
);
1622 mpc_set_z (result
->value
.complex, x
->value
.integer
, GFC_MPC_RND_MODE
);
1626 mpc_set_fr (result
->value
.complex, x
->value
.real
, GFC_RND_MODE
);
1630 mpc_set (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1634 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1638 return range_check (result
, name
);
1643 mpfr_set_z (mpc_imagref (result
->value
.complex),
1644 y
->value
.integer
, GFC_RND_MODE
);
1648 mpfr_set (mpc_imagref (result
->value
.complex),
1649 y
->value
.real
, GFC_RND_MODE
);
1653 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1656 return range_check (result
, name
);
1661 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
1665 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_complex_kind
);
1667 return &gfc_bad_expr
;
1669 return simplify_cmplx ("CMPLX", x
, y
, kind
);
1674 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
1678 if (x
->ts
.type
== BT_INTEGER
&& y
->ts
.type
== BT_INTEGER
)
1679 kind
= gfc_default_complex_kind
;
1680 else if (x
->ts
.type
== BT_REAL
|| y
->ts
.type
== BT_INTEGER
)
1682 else if (x
->ts
.type
== BT_INTEGER
|| y
->ts
.type
== BT_REAL
)
1684 else if (x
->ts
.type
== BT_REAL
&& y
->ts
.type
== BT_REAL
)
1685 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
1689 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
1694 gfc_simplify_conjg (gfc_expr
*e
)
1698 if (e
->expr_type
!= EXPR_CONSTANT
)
1701 result
= gfc_copy_expr (e
);
1702 mpc_conj (result
->value
.complex, result
->value
.complex, GFC_MPC_RND_MODE
);
1704 return range_check (result
, "CONJG");
1709 gfc_simplify_cos (gfc_expr
*x
)
1713 if (x
->expr_type
!= EXPR_CONSTANT
)
1716 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1721 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1725 gfc_set_model_kind (x
->ts
.kind
);
1726 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1730 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1733 return range_check (result
, "COS");
1738 gfc_simplify_cosh (gfc_expr
*x
)
1742 if (x
->expr_type
!= EXPR_CONSTANT
)
1745 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1750 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1754 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1761 return range_check (result
, "COSH");
1766 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
1770 if (!is_constant_array_expr (mask
)
1771 || !gfc_is_constant_expr (dim
)
1772 || !gfc_is_constant_expr (kind
))
1775 result
= transformational_result (mask
, dim
,
1777 get_kind (BT_INTEGER
, kind
, "COUNT",
1778 gfc_default_integer_kind
),
1781 init_result_expr (result
, 0, NULL
);
1783 /* Passing MASK twice, once as data array, once as mask.
1784 Whenever gfc_count is called, '1' is added to the result. */
1785 return !dim
|| mask
->rank
== 1 ?
1786 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
1787 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
, NULL
);
1792 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
1794 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
1799 gfc_simplify_dble (gfc_expr
*e
)
1801 gfc_expr
*result
= NULL
;
1803 if (e
->expr_type
!= EXPR_CONSTANT
)
1806 if (convert_boz (e
, gfc_default_double_kind
) == &gfc_bad_expr
)
1807 return &gfc_bad_expr
;
1809 result
= gfc_convert_constant (e
, BT_REAL
, gfc_default_double_kind
);
1810 if (result
== &gfc_bad_expr
)
1811 return &gfc_bad_expr
;
1813 return range_check (result
, "DBLE");
1818 gfc_simplify_digits (gfc_expr
*x
)
1822 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
1827 digits
= gfc_integer_kinds
[i
].digits
;
1832 digits
= gfc_real_kinds
[i
].digits
;
1839 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, digits
);
1844 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
1849 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1852 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1853 result
= gfc_get_constant_expr (x
->ts
.type
, kind
, &x
->where
);
1858 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
1859 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1861 mpz_set_ui (result
->value
.integer
, 0);
1866 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
1867 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
1870 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
1875 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1878 return range_check (result
, "DIM");
1883 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
1888 if (!is_constant_array_expr (vector_a
)
1889 || !is_constant_array_expr (vector_b
))
1892 gcc_assert (vector_a
->rank
== 1);
1893 gcc_assert (vector_b
->rank
== 1);
1895 temp
.expr_type
= EXPR_OP
;
1896 gfc_clear_ts (&temp
.ts
);
1897 temp
.value
.op
.op
= INTRINSIC_NONE
;
1898 temp
.value
.op
.op1
= vector_a
;
1899 temp
.value
.op
.op2
= vector_b
;
1900 gfc_type_convert_binary (&temp
, 1);
1902 return compute_dot_product (vector_a
, 1, 0, vector_b
, 1, 0, true);
1907 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
1909 gfc_expr
*a1
, *a2
, *result
;
1911 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1914 a1
= gfc_real2real (x
, gfc_default_double_kind
);
1915 a2
= gfc_real2real (y
, gfc_default_double_kind
);
1917 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &x
->where
);
1918 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
1923 return range_check (result
, "DPROD");
1928 simplify_dshift (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
,
1932 int i
, k
, size
, shift
;
1934 if (arg1
->expr_type
!= EXPR_CONSTANT
|| arg2
->expr_type
!= EXPR_CONSTANT
1935 || shiftarg
->expr_type
!= EXPR_CONSTANT
)
1938 k
= gfc_validate_kind (BT_INTEGER
, arg1
->ts
.kind
, false);
1939 size
= gfc_integer_kinds
[k
].bit_size
;
1941 gfc_extract_int (shiftarg
, &shift
);
1943 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
1945 shift
= size
- shift
;
1947 result
= gfc_get_constant_expr (BT_INTEGER
, arg1
->ts
.kind
, &arg1
->where
);
1948 mpz_set_ui (result
->value
.integer
, 0);
1950 for (i
= 0; i
< shift
; i
++)
1951 if (mpz_tstbit (arg2
->value
.integer
, size
- shift
+ i
))
1952 mpz_setbit (result
->value
.integer
, i
);
1954 for (i
= 0; i
< size
- shift
; i
++)
1955 if (mpz_tstbit (arg1
->value
.integer
, i
))
1956 mpz_setbit (result
->value
.integer
, shift
+ i
);
1958 /* Convert to a signed value. */
1959 gfc_convert_mpz_to_signed (result
->value
.integer
, size
);
1966 gfc_simplify_dshiftr (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
1968 return simplify_dshift (arg1
, arg2
, shiftarg
, true);
1973 gfc_simplify_dshiftl (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
1975 return simplify_dshift (arg1
, arg2
, shiftarg
, false);
1980 gfc_simplify_erf (gfc_expr
*x
)
1984 if (x
->expr_type
!= EXPR_CONSTANT
)
1987 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1988 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1990 return range_check (result
, "ERF");
1995 gfc_simplify_erfc (gfc_expr
*x
)
1999 if (x
->expr_type
!= EXPR_CONSTANT
)
2002 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2003 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2005 return range_check (result
, "ERFC");
2009 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2011 #define MAX_ITER 200
2012 #define ARG_LIMIT 12
2014 /* Calculate ERFC_SCALED directly by its definition:
2016 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2018 using a large precision for intermediate results. This is used for all
2019 but large values of the argument. */
2021 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2026 prec
= mpfr_get_default_prec ();
2027 mpfr_set_default_prec (10 * prec
);
2032 mpfr_set (a
, arg
, GFC_RND_MODE
);
2033 mpfr_sqr (b
, a
, GFC_RND_MODE
);
2034 mpfr_exp (b
, b
, GFC_RND_MODE
);
2035 mpfr_erfc (a
, a
, GFC_RND_MODE
);
2036 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
2038 mpfr_set (res
, a
, GFC_RND_MODE
);
2039 mpfr_set_default_prec (prec
);
2045 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2047 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2048 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2051 This is used for large values of the argument. Intermediate calculations
2052 are performed with twice the precision. We don't do a fixed number of
2053 iterations of the sum, but stop when it has converged to the required
2056 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2058 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
2063 prec
= mpfr_get_default_prec ();
2064 mpfr_set_default_prec (2 * prec
);
2074 mpfr_init (sumtrunc
);
2075 mpfr_set_prec (oldsum
, prec
);
2076 mpfr_set_prec (sumtrunc
, prec
);
2078 mpfr_set (x
, arg
, GFC_RND_MODE
);
2079 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
2080 mpz_set_ui (num
, 1);
2082 mpfr_set (u
, x
, GFC_RND_MODE
);
2083 mpfr_sqr (u
, u
, GFC_RND_MODE
);
2084 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
2085 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
2087 for (i
= 1; i
< MAX_ITER
; i
++)
2089 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
2091 mpz_mul_ui (num
, num
, 2 * i
- 1);
2094 mpfr_set (w
, u
, GFC_RND_MODE
);
2095 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
2097 mpfr_set_z (v
, num
, GFC_RND_MODE
);
2098 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
2100 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
2102 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
2103 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
2107 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2109 gcc_assert (i
< MAX_ITER
);
2111 /* Divide by x * sqrt(Pi). */
2112 mpfr_const_pi (u
, GFC_RND_MODE
);
2113 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
2114 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
2115 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
2117 mpfr_set (res
, sum
, GFC_RND_MODE
);
2118 mpfr_set_default_prec (prec
);
2120 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
2126 gfc_simplify_erfc_scaled (gfc_expr
*x
)
2130 if (x
->expr_type
!= EXPR_CONSTANT
)
2133 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2134 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
2135 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
2137 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
2139 return range_check (result
, "ERFC_SCALED");
2147 gfc_simplify_epsilon (gfc_expr
*e
)
2152 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2154 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
2155 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
2157 return range_check (result
, "EPSILON");
2162 gfc_simplify_exp (gfc_expr
*x
)
2166 if (x
->expr_type
!= EXPR_CONSTANT
)
2169 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2174 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2178 gfc_set_model_kind (x
->ts
.kind
);
2179 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
2183 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2186 return range_check (result
, "EXP");
2191 gfc_simplify_exponent (gfc_expr
*x
)
2196 if (x
->expr_type
!= EXPR_CONSTANT
)
2199 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2202 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2203 if (mpfr_inf_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
2205 int i
= gfc_validate_kind (BT_INTEGER
, gfc_default_integer_kind
, false);
2206 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2210 /* EXPONENT(+/- 0.0) = 0 */
2211 if (mpfr_zero_p (x
->value
.real
))
2213 mpz_set_ui (result
->value
.integer
, 0);
2217 gfc_set_model (x
->value
.real
);
2219 val
= (long int) mpfr_get_exp (x
->value
.real
);
2220 mpz_set_si (result
->value
.integer
, val
);
2222 return range_check (result
, "EXPONENT");
2227 gfc_simplify_float (gfc_expr
*a
)
2231 if (a
->expr_type
!= EXPR_CONSTANT
)
2236 if (convert_boz (a
, gfc_default_real_kind
) == &gfc_bad_expr
)
2237 return &gfc_bad_expr
;
2239 result
= gfc_copy_expr (a
);
2242 result
= gfc_int2real (a
, gfc_default_real_kind
);
2244 return range_check (result
, "FLOAT");
2249 is_last_ref_vtab (gfc_expr
*e
)
2252 gfc_component
*comp
= NULL
;
2254 if (e
->expr_type
!= EXPR_VARIABLE
)
2257 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
2258 if (ref
->type
== REF_COMPONENT
)
2259 comp
= ref
->u
.c
.component
;
2261 if (!e
->ref
|| !comp
)
2262 return e
->symtree
->n
.sym
->attr
.vtab
;
2264 if (comp
->name
[0] == '_' && strcmp (comp
->name
, "_vptr") == 0)
2272 gfc_simplify_extends_type_of (gfc_expr
*a
, gfc_expr
*mold
)
2274 /* Avoid simplification of resolved symbols. */
2275 if (is_last_ref_vtab (a
) || is_last_ref_vtab (mold
))
2278 if (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_DERIVED
)
2279 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2280 gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2283 if (UNLIMITED_POLY (a
) || UNLIMITED_POLY (mold
))
2286 /* Return .false. if the dynamic type can never be the same. */
2287 if ((a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_CLASS
2288 && !gfc_type_is_extension_of
2289 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2290 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2291 && !gfc_type_is_extension_of
2292 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2293 mold
->ts
.u
.derived
->components
->ts
.u
.derived
))
2294 || (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_CLASS
2295 && !gfc_type_is_extension_of
2297 mold
->ts
.u
.derived
->components
->ts
.u
.derived
)
2298 && !gfc_type_is_extension_of
2299 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2301 || (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2302 && !gfc_type_is_extension_of
2303 (mold
->ts
.u
.derived
,
2304 a
->ts
.u
.derived
->components
->ts
.u
.derived
)))
2305 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2307 if (mold
->ts
.type
== BT_DERIVED
2308 && gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2309 a
->ts
.u
.derived
->components
->ts
.u
.derived
))
2310 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, true);
2317 gfc_simplify_same_type_as (gfc_expr
*a
, gfc_expr
*b
)
2319 /* Avoid simplification of resolved symbols. */
2320 if (is_last_ref_vtab (a
) || is_last_ref_vtab (b
))
2323 /* Return .false. if the dynamic type can never be the
2325 if (((a
->ts
.type
== BT_CLASS
&& gfc_expr_attr (a
).class_ok
)
2326 || (b
->ts
.type
== BT_CLASS
&& gfc_expr_attr (b
).class_ok
))
2327 && !gfc_type_compatible (&a
->ts
, &b
->ts
)
2328 && !gfc_type_compatible (&b
->ts
, &a
->ts
))
2329 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2331 if (a
->ts
.type
!= BT_DERIVED
|| b
->ts
.type
!= BT_DERIVED
)
2334 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2335 gfc_compare_derived_types (a
->ts
.u
.derived
,
2341 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
2347 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
2349 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2351 if (e
->expr_type
!= EXPR_CONSTANT
)
2354 gfc_set_model_kind (kind
);
2357 mpfr_floor (floor
, e
->value
.real
);
2359 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
2360 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
2364 return range_check (result
, "FLOOR");
2369 gfc_simplify_fraction (gfc_expr
*x
)
2373 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2374 mpfr_t absv
, exp
, pow2
;
2379 if (x
->expr_type
!= EXPR_CONSTANT
)
2382 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
2384 /* FRACTION(inf) = NaN. */
2385 if (mpfr_inf_p (x
->value
.real
))
2387 mpfr_set_nan (result
->value
.real
);
2391 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2393 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
2394 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
2396 if (mpfr_sgn (x
->value
.real
) == 0)
2398 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2402 gfc_set_model_kind (x
->ts
.kind
);
2407 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
2408 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
2410 mpfr_trunc (exp
, exp
);
2411 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
2413 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
2415 mpfr_div (result
->value
.real
, x
->value
.real
, pow2
, GFC_RND_MODE
);
2417 mpfr_clears (exp
, absv
, pow2
, NULL
);
2421 /* mpfr_frexp() correctly handles zeros and NaNs. */
2422 mpfr_frexp (&e
, result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2426 return range_check (result
, "FRACTION");
2431 gfc_simplify_gamma (gfc_expr
*x
)
2435 if (x
->expr_type
!= EXPR_CONSTANT
)
2438 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2439 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2441 return range_check (result
, "GAMMA");
2446 gfc_simplify_huge (gfc_expr
*e
)
2451 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2452 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2457 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2461 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
2473 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
2477 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2480 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2481 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
2482 return range_check (result
, "HYPOT");
2486 /* We use the processor's collating sequence, because all
2487 systems that gfortran currently works on are ASCII. */
2490 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
2496 if (e
->expr_type
!= EXPR_CONSTANT
)
2499 if (e
->value
.character
.length
!= 1)
2501 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
2502 return &gfc_bad_expr
;
2505 index
= e
->value
.character
.string
[0];
2507 if (warn_surprising
&& index
> 127)
2508 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2511 k
= get_kind (BT_INTEGER
, kind
, "IACHAR", gfc_default_integer_kind
);
2513 return &gfc_bad_expr
;
2515 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2517 return range_check (result
, "IACHAR");
2522 do_bit_and (gfc_expr
*result
, gfc_expr
*e
)
2524 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2525 gcc_assert (result
->ts
.type
== BT_INTEGER
2526 && result
->expr_type
== EXPR_CONSTANT
);
2528 mpz_and (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2534 gfc_simplify_iall (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2536 return simplify_transformation (array
, dim
, mask
, -1, do_bit_and
);
2541 do_bit_ior (gfc_expr
*result
, gfc_expr
*e
)
2543 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2544 gcc_assert (result
->ts
.type
== BT_INTEGER
2545 && result
->expr_type
== EXPR_CONSTANT
);
2547 mpz_ior (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2553 gfc_simplify_iany (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2555 return simplify_transformation (array
, dim
, mask
, 0, do_bit_ior
);
2560 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
2564 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2567 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2568 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2570 return range_check (result
, "IAND");
2575 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
2580 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2583 gfc_extract_int (y
, &pos
);
2585 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2587 result
= gfc_copy_expr (x
);
2589 convert_mpz_to_unsigned (result
->value
.integer
,
2590 gfc_integer_kinds
[k
].bit_size
);
2592 mpz_clrbit (result
->value
.integer
, pos
);
2594 gfc_convert_mpz_to_signed (result
->value
.integer
,
2595 gfc_integer_kinds
[k
].bit_size
);
2602 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
2609 if (x
->expr_type
!= EXPR_CONSTANT
2610 || y
->expr_type
!= EXPR_CONSTANT
2611 || z
->expr_type
!= EXPR_CONSTANT
)
2614 gfc_extract_int (y
, &pos
);
2615 gfc_extract_int (z
, &len
);
2617 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
2619 bitsize
= gfc_integer_kinds
[k
].bit_size
;
2621 if (pos
+ len
> bitsize
)
2623 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2624 "bit size at %L", &y
->where
);
2625 return &gfc_bad_expr
;
2628 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2629 convert_mpz_to_unsigned (result
->value
.integer
,
2630 gfc_integer_kinds
[k
].bit_size
);
2632 bits
= XCNEWVEC (int, bitsize
);
2634 for (i
= 0; i
< bitsize
; i
++)
2637 for (i
= 0; i
< len
; i
++)
2638 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
2640 for (i
= 0; i
< bitsize
; i
++)
2643 mpz_clrbit (result
->value
.integer
, i
);
2644 else if (bits
[i
] == 1)
2645 mpz_setbit (result
->value
.integer
, i
);
2647 gfc_internal_error ("IBITS: Bad bit");
2652 gfc_convert_mpz_to_signed (result
->value
.integer
,
2653 gfc_integer_kinds
[k
].bit_size
);
2660 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
2665 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2668 gfc_extract_int (y
, &pos
);
2670 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2672 result
= gfc_copy_expr (x
);
2674 convert_mpz_to_unsigned (result
->value
.integer
,
2675 gfc_integer_kinds
[k
].bit_size
);
2677 mpz_setbit (result
->value
.integer
, pos
);
2679 gfc_convert_mpz_to_signed (result
->value
.integer
,
2680 gfc_integer_kinds
[k
].bit_size
);
2687 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
2693 if (e
->expr_type
!= EXPR_CONSTANT
)
2696 if (e
->value
.character
.length
!= 1)
2698 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
2699 return &gfc_bad_expr
;
2702 index
= e
->value
.character
.string
[0];
2704 k
= get_kind (BT_INTEGER
, kind
, "ICHAR", gfc_default_integer_kind
);
2706 return &gfc_bad_expr
;
2708 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2710 return range_check (result
, "ICHAR");
2715 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
2719 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2722 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2723 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2725 return range_check (result
, "IEOR");
2730 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
2733 int back
, len
, lensub
;
2734 int i
, j
, k
, count
, index
= 0, start
;
2736 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
2737 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
2740 if (b
!= NULL
&& b
->value
.logical
!= 0)
2745 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
2747 return &gfc_bad_expr
;
2749 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
2751 len
= x
->value
.character
.length
;
2752 lensub
= y
->value
.character
.length
;
2756 mpz_set_si (result
->value
.integer
, 0);
2764 mpz_set_si (result
->value
.integer
, 1);
2767 else if (lensub
== 1)
2769 for (i
= 0; i
< len
; i
++)
2771 for (j
= 0; j
< lensub
; j
++)
2773 if (y
->value
.character
.string
[j
]
2774 == x
->value
.character
.string
[i
])
2784 for (i
= 0; i
< len
; i
++)
2786 for (j
= 0; j
< lensub
; j
++)
2788 if (y
->value
.character
.string
[j
]
2789 == x
->value
.character
.string
[i
])
2794 for (k
= 0; k
< lensub
; k
++)
2796 if (y
->value
.character
.string
[k
]
2797 == x
->value
.character
.string
[k
+ start
])
2801 if (count
== lensub
)
2816 mpz_set_si (result
->value
.integer
, len
+ 1);
2819 else if (lensub
== 1)
2821 for (i
= 0; i
< len
; i
++)
2823 for (j
= 0; j
< lensub
; j
++)
2825 if (y
->value
.character
.string
[j
]
2826 == x
->value
.character
.string
[len
- i
])
2828 index
= len
- i
+ 1;
2836 for (i
= 0; i
< len
; i
++)
2838 for (j
= 0; j
< lensub
; j
++)
2840 if (y
->value
.character
.string
[j
]
2841 == x
->value
.character
.string
[len
- i
])
2844 if (start
<= len
- lensub
)
2847 for (k
= 0; k
< lensub
; k
++)
2848 if (y
->value
.character
.string
[k
]
2849 == x
->value
.character
.string
[k
+ start
])
2852 if (count
== lensub
)
2869 mpz_set_si (result
->value
.integer
, index
);
2870 return range_check (result
, "INDEX");
2875 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
2877 gfc_expr
*result
= NULL
;
2879 if (e
->expr_type
!= EXPR_CONSTANT
)
2882 result
= gfc_convert_constant (e
, BT_INTEGER
, kind
);
2883 if (result
== &gfc_bad_expr
)
2884 return &gfc_bad_expr
;
2886 return range_check (result
, name
);
2891 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
2895 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
2897 return &gfc_bad_expr
;
2899 return simplify_intconv (e
, kind
, "INT");
2903 gfc_simplify_int2 (gfc_expr
*e
)
2905 return simplify_intconv (e
, 2, "INT2");
2910 gfc_simplify_int8 (gfc_expr
*e
)
2912 return simplify_intconv (e
, 8, "INT8");
2917 gfc_simplify_long (gfc_expr
*e
)
2919 return simplify_intconv (e
, 4, "LONG");
2924 gfc_simplify_ifix (gfc_expr
*e
)
2926 gfc_expr
*rtrunc
, *result
;
2928 if (e
->expr_type
!= EXPR_CONSTANT
)
2931 rtrunc
= gfc_copy_expr (e
);
2932 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
2934 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2936 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
2938 gfc_free_expr (rtrunc
);
2940 return range_check (result
, "IFIX");
2945 gfc_simplify_idint (gfc_expr
*e
)
2947 gfc_expr
*rtrunc
, *result
;
2949 if (e
->expr_type
!= EXPR_CONSTANT
)
2952 rtrunc
= gfc_copy_expr (e
);
2953 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
2955 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2957 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
2959 gfc_free_expr (rtrunc
);
2961 return range_check (result
, "IDINT");
2966 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
2970 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2973 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2974 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2976 return range_check (result
, "IOR");
2981 do_bit_xor (gfc_expr
*result
, gfc_expr
*e
)
2983 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2984 gcc_assert (result
->ts
.type
== BT_INTEGER
2985 && result
->expr_type
== EXPR_CONSTANT
);
2987 mpz_xor (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2993 gfc_simplify_iparity (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2995 return simplify_transformation (array
, dim
, mask
, 0, do_bit_xor
);
3000 gfc_simplify_is_iostat_end (gfc_expr
*x
)
3002 if (x
->expr_type
!= EXPR_CONSTANT
)
3005 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3006 mpz_cmp_si (x
->value
.integer
,
3007 LIBERROR_END
) == 0);
3012 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
3014 if (x
->expr_type
!= EXPR_CONSTANT
)
3017 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3018 mpz_cmp_si (x
->value
.integer
,
3019 LIBERROR_EOR
) == 0);
3024 gfc_simplify_isnan (gfc_expr
*x
)
3026 if (x
->expr_type
!= EXPR_CONSTANT
)
3029 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3030 mpfr_nan_p (x
->value
.real
));
3034 /* Performs a shift on its first argument. Depending on the last
3035 argument, the shift can be arithmetic, i.e. with filling from the
3036 left like in the SHIFTA intrinsic. */
3038 simplify_shift (gfc_expr
*e
, gfc_expr
*s
, const char *name
,
3039 bool arithmetic
, int direction
)
3042 int ashift
, *bits
, i
, k
, bitsize
, shift
;
3044 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3047 gfc_extract_int (s
, &shift
);
3049 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
3050 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3052 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3056 mpz_set (result
->value
.integer
, e
->value
.integer
);
3060 if (direction
> 0 && shift
< 0)
3062 /* Left shift, as in SHIFTL. */
3063 gfc_error ("Second argument of %s is negative at %L", name
, &e
->where
);
3064 return &gfc_bad_expr
;
3066 else if (direction
< 0)
3068 /* Right shift, as in SHIFTR or SHIFTA. */
3071 gfc_error ("Second argument of %s is negative at %L",
3073 return &gfc_bad_expr
;
3079 ashift
= (shift
>= 0 ? shift
: -shift
);
3081 if (ashift
> bitsize
)
3083 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3084 "at %L", name
, &e
->where
);
3085 return &gfc_bad_expr
;
3088 bits
= XCNEWVEC (int, bitsize
);
3090 for (i
= 0; i
< bitsize
; i
++)
3091 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3096 for (i
= 0; i
< shift
; i
++)
3097 mpz_clrbit (result
->value
.integer
, i
);
3099 for (i
= 0; i
< bitsize
- shift
; i
++)
3102 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3104 mpz_setbit (result
->value
.integer
, i
+ shift
);
3110 if (arithmetic
&& bits
[bitsize
- 1])
3111 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3112 mpz_setbit (result
->value
.integer
, i
);
3114 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3115 mpz_clrbit (result
->value
.integer
, i
);
3117 for (i
= bitsize
- 1; i
>= ashift
; i
--)
3120 mpz_clrbit (result
->value
.integer
, i
- ashift
);
3122 mpz_setbit (result
->value
.integer
, i
- ashift
);
3126 gfc_convert_mpz_to_signed (result
->value
.integer
, bitsize
);
3134 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
3136 return simplify_shift (e
, s
, "ISHFT", false, 0);
3141 gfc_simplify_lshift (gfc_expr
*e
, gfc_expr
*s
)
3143 return simplify_shift (e
, s
, "LSHIFT", false, 1);
3148 gfc_simplify_rshift (gfc_expr
*e
, gfc_expr
*s
)
3150 return simplify_shift (e
, s
, "RSHIFT", true, -1);
3155 gfc_simplify_shifta (gfc_expr
*e
, gfc_expr
*s
)
3157 return simplify_shift (e
, s
, "SHIFTA", true, -1);
3162 gfc_simplify_shiftl (gfc_expr
*e
, gfc_expr
*s
)
3164 return simplify_shift (e
, s
, "SHIFTL", false, 1);
3169 gfc_simplify_shiftr (gfc_expr
*e
, gfc_expr
*s
)
3171 return simplify_shift (e
, s
, "SHIFTR", false, -1);
3176 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
3179 int shift
, ashift
, isize
, ssize
, delta
, k
;
3182 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3185 gfc_extract_int (s
, &shift
);
3187 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3188 isize
= gfc_integer_kinds
[k
].bit_size
;
3192 if (sz
->expr_type
!= EXPR_CONSTANT
)
3195 gfc_extract_int (sz
, &ssize
);
3209 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3210 "BIT_SIZE of first argument at %L", &s
->where
);
3211 return &gfc_bad_expr
;
3214 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3216 mpz_set (result
->value
.integer
, e
->value
.integer
);
3221 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
3223 bits
= XCNEWVEC (int, ssize
);
3225 for (i
= 0; i
< ssize
; i
++)
3226 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3228 delta
= ssize
- ashift
;
3232 for (i
= 0; i
< delta
; i
++)
3235 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3237 mpz_setbit (result
->value
.integer
, i
+ shift
);
3240 for (i
= delta
; i
< ssize
; i
++)
3243 mpz_clrbit (result
->value
.integer
, i
- delta
);
3245 mpz_setbit (result
->value
.integer
, i
- delta
);
3250 for (i
= 0; i
< ashift
; i
++)
3253 mpz_clrbit (result
->value
.integer
, i
+ delta
);
3255 mpz_setbit (result
->value
.integer
, i
+ delta
);
3258 for (i
= ashift
; i
< ssize
; i
++)
3261 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3263 mpz_setbit (result
->value
.integer
, i
+ shift
);
3267 gfc_convert_mpz_to_signed (result
->value
.integer
, isize
);
3275 gfc_simplify_kind (gfc_expr
*e
)
3277 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, e
->ts
.kind
);
3282 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
3283 gfc_array_spec
*as
, gfc_ref
*ref
, bool coarray
)
3285 gfc_expr
*l
, *u
, *result
;
3288 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3289 gfc_default_integer_kind
);
3291 return &gfc_bad_expr
;
3293 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3295 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3296 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3297 if (!coarray
&& array
->expr_type
!= EXPR_VARIABLE
)
3301 gfc_expr
* dim
= result
;
3302 mpz_set_si (dim
->value
.integer
, d
);
3304 result
= simplify_size (array
, dim
, k
);
3305 gfc_free_expr (dim
);
3310 mpz_set_si (result
->value
.integer
, 1);
3315 /* Otherwise, we have a variable expression. */
3316 gcc_assert (array
->expr_type
== EXPR_VARIABLE
);
3319 if (!gfc_resolve_array_spec (as
, 0))
3322 /* The last dimension of an assumed-size array is special. */
3323 if ((!coarray
&& d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
3324 || (coarray
&& d
== as
->rank
+ as
->corank
3325 && (!upper
|| gfc_option
.coarray
== GFC_FCOARRAY_SINGLE
)))
3327 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
3329 gfc_free_expr (result
);
3330 return gfc_copy_expr (as
->lower
[d
-1]);
3336 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3338 /* Then, we need to know the extent of the given dimension. */
3339 if (coarray
|| ref
->u
.ar
.type
== AR_FULL
)
3344 if (l
->expr_type
!= EXPR_CONSTANT
|| u
== NULL
3345 || u
->expr_type
!= EXPR_CONSTANT
)
3348 if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
3352 mpz_set_si (result
->value
.integer
, 0);
3354 mpz_set_si (result
->value
.integer
, 1);
3358 /* Nonzero extent. */
3360 mpz_set (result
->value
.integer
, u
->value
.integer
);
3362 mpz_set (result
->value
.integer
, l
->value
.integer
);
3369 if (!gfc_ref_dimen_size (&ref
->u
.ar
, d
- 1, &result
->value
.integer
, NULL
))
3373 mpz_set_si (result
->value
.integer
, (long int) 1);
3377 return range_check (result
, upper
? "UBOUND" : "LBOUND");
3380 gfc_free_expr (result
);
3386 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3392 if (array
->ts
.type
== BT_CLASS
)
3395 if (array
->expr_type
!= EXPR_VARIABLE
)
3402 /* Follow any component references. */
3403 as
= array
->symtree
->n
.sym
->as
;
3404 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3409 switch (ref
->u
.ar
.type
)
3416 /* We're done because 'as' has already been set in the
3417 previous iteration. */
3434 as
= ref
->u
.c
.component
->as
;
3446 if (as
&& (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_SHAPE
3447 || as
->type
== AS_ASSUMED_RANK
))
3452 /* Multi-dimensional bounds. */
3453 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3457 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3458 if (upper
&& as
&& as
->type
== AS_ASSUMED_SIZE
)
3460 /* An error message will be emitted in
3461 check_assumed_size_reference (resolve.c). */
3462 return &gfc_bad_expr
;
3465 /* Simplify the bounds for each dimension. */
3466 for (d
= 0; d
< array
->rank
; d
++)
3468 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
, ref
,
3470 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3474 for (j
= 0; j
< d
; j
++)
3475 gfc_free_expr (bounds
[j
]);
3480 /* Allocate the result expression. */
3481 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3482 gfc_default_integer_kind
);
3484 return &gfc_bad_expr
;
3486 e
= gfc_get_array_expr (BT_INTEGER
, k
, &array
->where
);
3488 /* The result is a rank 1 array; its size is the rank of the first
3489 argument to {L,U}BOUND. */
3491 e
->shape
= gfc_get_shape (1);
3492 mpz_init_set_ui (e
->shape
[0], array
->rank
);
3494 /* Create the constructor for this array. */
3495 for (d
= 0; d
< array
->rank
; d
++)
3496 gfc_constructor_append_expr (&e
->value
.constructor
,
3497 bounds
[d
], &e
->where
);
3503 /* A DIM argument is specified. */
3504 if (dim
->expr_type
!= EXPR_CONSTANT
)
3507 d
= mpz_get_si (dim
->value
.integer
);
3509 if ((d
< 1 || d
> array
->rank
)
3510 || (d
== array
->rank
&& as
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
3512 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3513 return &gfc_bad_expr
;
3516 if (as
&& as
->type
== AS_ASSUMED_RANK
)
3519 return simplify_bound_dim (array
, kind
, d
, upper
, as
, ref
, false);
3525 simplify_cobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3531 if (array
->expr_type
!= EXPR_VARIABLE
)
3534 /* Follow any component references. */
3535 as
= (array
->ts
.type
== BT_CLASS
&& array
->ts
.u
.derived
->components
)
3536 ? array
->ts
.u
.derived
->components
->as
3537 : array
->symtree
->n
.sym
->as
;
3538 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3543 switch (ref
->u
.ar
.type
)
3546 if (ref
->u
.ar
.as
->corank
> 0)
3548 gcc_assert (as
== ref
->u
.ar
.as
);
3555 /* We're done because 'as' has already been set in the
3556 previous iteration. */
3573 as
= ref
->u
.c
.component
->as
;
3586 if (as
->cotype
== AS_DEFERRED
|| as
->cotype
== AS_ASSUMED_SHAPE
)
3591 /* Multi-dimensional cobounds. */
3592 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3596 /* Simplify the cobounds for each dimension. */
3597 for (d
= 0; d
< as
->corank
; d
++)
3599 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1 + as
->rank
,
3600 upper
, as
, ref
, true);
3601 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3605 for (j
= 0; j
< d
; j
++)
3606 gfc_free_expr (bounds
[j
]);
3611 /* Allocate the result expression. */
3612 e
= gfc_get_expr ();
3613 e
->where
= array
->where
;
3614 e
->expr_type
= EXPR_ARRAY
;
3615 e
->ts
.type
= BT_INTEGER
;
3616 k
= get_kind (BT_INTEGER
, kind
, upper
? "UCOBOUND" : "LCOBOUND",
3617 gfc_default_integer_kind
);
3621 return &gfc_bad_expr
;
3625 /* The result is a rank 1 array; its size is the rank of the first
3626 argument to {L,U}COBOUND. */
3628 e
->shape
= gfc_get_shape (1);
3629 mpz_init_set_ui (e
->shape
[0], as
->corank
);
3631 /* Create the constructor for this array. */
3632 for (d
= 0; d
< as
->corank
; d
++)
3633 gfc_constructor_append_expr (&e
->value
.constructor
,
3634 bounds
[d
], &e
->where
);
3639 /* A DIM argument is specified. */
3640 if (dim
->expr_type
!= EXPR_CONSTANT
)
3643 d
= mpz_get_si (dim
->value
.integer
);
3645 if (d
< 1 || d
> as
->corank
)
3647 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3648 return &gfc_bad_expr
;
3651 return simplify_bound_dim (array
, kind
, d
+as
->rank
, upper
, as
, ref
, true);
3657 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3659 return simplify_bound (array
, dim
, kind
, 0);
3664 gfc_simplify_lcobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3666 return simplify_cobound (array
, dim
, kind
, 0);
3670 gfc_simplify_leadz (gfc_expr
*e
)
3672 unsigned long lz
, bs
;
3675 if (e
->expr_type
!= EXPR_CONSTANT
)
3678 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3679 bs
= gfc_integer_kinds
[i
].bit_size
;
3680 if (mpz_cmp_si (e
->value
.integer
, 0) == 0)
3682 else if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
3685 lz
= bs
- mpz_sizeinbase (e
->value
.integer
, 2);
3687 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, lz
);
3692 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
3695 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
3698 return &gfc_bad_expr
;
3700 if (e
->expr_type
== EXPR_CONSTANT
)
3702 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
3703 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
3704 return range_check (result
, "LEN");
3706 else if (e
->ts
.u
.cl
!= NULL
&& e
->ts
.u
.cl
->length
!= NULL
3707 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
3708 && e
->ts
.u
.cl
->length
->ts
.type
== BT_INTEGER
)
3710 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
3711 mpz_set (result
->value
.integer
, e
->ts
.u
.cl
->length
->value
.integer
);
3712 return range_check (result
, "LEN");
3720 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
3724 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
3727 return &gfc_bad_expr
;
3729 if (e
->expr_type
!= EXPR_CONSTANT
)
3732 len
= e
->value
.character
.length
;
3733 for (count
= 0, i
= 1; i
<= len
; i
++)
3734 if (e
->value
.character
.string
[len
- i
] == ' ')
3739 result
= gfc_get_int_expr (k
, &e
->where
, len
- count
);
3740 return range_check (result
, "LEN_TRIM");
3744 gfc_simplify_lgamma (gfc_expr
*x
)
3749 if (x
->expr_type
!= EXPR_CONSTANT
)
3752 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3753 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
3755 return range_check (result
, "LGAMMA");
3760 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
3762 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3765 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3766 gfc_compare_string (a
, b
) >= 0);
3771 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
3773 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3776 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3777 gfc_compare_string (a
, b
) > 0);
3782 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
3784 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3787 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3788 gfc_compare_string (a
, b
) <= 0);
3793 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
3795 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3798 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3799 gfc_compare_string (a
, b
) < 0);
3804 gfc_simplify_log (gfc_expr
*x
)
3808 if (x
->expr_type
!= EXPR_CONSTANT
)
3811 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3816 if (mpfr_sgn (x
->value
.real
) <= 0)
3818 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3819 "to zero", &x
->where
);
3820 gfc_free_expr (result
);
3821 return &gfc_bad_expr
;
3824 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3828 if (mpfr_zero_p (mpc_realref (x
->value
.complex))
3829 && mpfr_zero_p (mpc_imagref (x
->value
.complex)))
3831 gfc_error ("Complex argument of LOG at %L cannot be zero",
3833 gfc_free_expr (result
);
3834 return &gfc_bad_expr
;
3837 gfc_set_model_kind (x
->ts
.kind
);
3838 mpc_log (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
3842 gfc_internal_error ("gfc_simplify_log: bad type");
3845 return range_check (result
, "LOG");
3850 gfc_simplify_log10 (gfc_expr
*x
)
3854 if (x
->expr_type
!= EXPR_CONSTANT
)
3857 if (mpfr_sgn (x
->value
.real
) <= 0)
3859 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3860 "to zero", &x
->where
);
3861 return &gfc_bad_expr
;
3864 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3865 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3867 return range_check (result
, "LOG10");
3872 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
3876 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
3878 return &gfc_bad_expr
;
3880 if (e
->expr_type
!= EXPR_CONSTANT
)
3883 return gfc_get_logical_expr (kind
, &e
->where
, e
->value
.logical
);
3888 gfc_simplify_matmul (gfc_expr
*matrix_a
, gfc_expr
*matrix_b
)
3891 int row
, result_rows
, col
, result_columns
;
3892 int stride_a
, offset_a
, stride_b
, offset_b
;
3894 if (!is_constant_array_expr (matrix_a
)
3895 || !is_constant_array_expr (matrix_b
))
3898 gcc_assert (gfc_compare_types (&matrix_a
->ts
, &matrix_b
->ts
));
3899 result
= gfc_get_array_expr (matrix_a
->ts
.type
,
3903 if (matrix_a
->rank
== 1 && matrix_b
->rank
== 2)
3906 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
3908 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
3911 result
->shape
= gfc_get_shape (result
->rank
);
3912 mpz_init_set_si (result
->shape
[0], result_columns
);
3914 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 1)
3916 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
3918 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
3922 result
->shape
= gfc_get_shape (result
->rank
);
3923 mpz_init_set_si (result
->shape
[0], result_rows
);
3925 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 2)
3927 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
3928 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
3929 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
3930 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
3933 result
->shape
= gfc_get_shape (result
->rank
);
3934 mpz_init_set_si (result
->shape
[0], result_rows
);
3935 mpz_init_set_si (result
->shape
[1], result_columns
);
3940 offset_a
= offset_b
= 0;
3941 for (col
= 0; col
< result_columns
; ++col
)
3945 for (row
= 0; row
< result_rows
; ++row
)
3947 gfc_expr
*e
= compute_dot_product (matrix_a
, stride_a
, offset_a
,
3948 matrix_b
, 1, offset_b
, false);
3949 gfc_constructor_append_expr (&result
->value
.constructor
,
3955 offset_b
+= stride_b
;
3963 gfc_simplify_maskr (gfc_expr
*i
, gfc_expr
*kind_arg
)
3969 if (i
->expr_type
!= EXPR_CONSTANT
)
3972 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKR", gfc_default_integer_kind
);
3974 return &gfc_bad_expr
;
3975 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
3977 s
= gfc_extract_int (i
, &arg
);
3980 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
3982 /* MASKR(n) = 2^n - 1 */
3983 mpz_set_ui (result
->value
.integer
, 1);
3984 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
, arg
);
3985 mpz_sub_ui (result
->value
.integer
, result
->value
.integer
, 1);
3987 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
3994 gfc_simplify_maskl (gfc_expr
*i
, gfc_expr
*kind_arg
)
4001 if (i
->expr_type
!= EXPR_CONSTANT
)
4004 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKL", gfc_default_integer_kind
);
4006 return &gfc_bad_expr
;
4007 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4009 s
= gfc_extract_int (i
, &arg
);
4012 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4014 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4015 mpz_init_set_ui (z
, 1);
4016 mpz_mul_2exp (z
, z
, gfc_integer_kinds
[k
].bit_size
);
4017 mpz_set_ui (result
->value
.integer
, 1);
4018 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
,
4019 gfc_integer_kinds
[k
].bit_size
- arg
);
4020 mpz_sub (result
->value
.integer
, z
, result
->value
.integer
);
4023 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4030 gfc_simplify_merge (gfc_expr
*tsource
, gfc_expr
*fsource
, gfc_expr
*mask
)
4033 gfc_constructor
*tsource_ctor
, *fsource_ctor
, *mask_ctor
;
4035 if (mask
->expr_type
== EXPR_CONSTANT
)
4036 return gfc_get_parentheses (gfc_copy_expr (mask
->value
.logical
4037 ? tsource
: fsource
));
4039 if (!mask
->rank
|| !is_constant_array_expr (mask
)
4040 || !is_constant_array_expr (tsource
) || !is_constant_array_expr (fsource
))
4043 result
= gfc_get_array_expr (tsource
->ts
.type
, tsource
->ts
.kind
,
4045 if (tsource
->ts
.type
== BT_DERIVED
)
4046 result
->ts
.u
.derived
= tsource
->ts
.u
.derived
;
4047 else if (tsource
->ts
.type
== BT_CHARACTER
)
4048 result
->ts
.u
.cl
= tsource
->ts
.u
.cl
;
4050 tsource_ctor
= gfc_constructor_first (tsource
->value
.constructor
);
4051 fsource_ctor
= gfc_constructor_first (fsource
->value
.constructor
);
4052 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4056 if (mask_ctor
->expr
->value
.logical
)
4057 gfc_constructor_append_expr (&result
->value
.constructor
,
4058 gfc_copy_expr (tsource_ctor
->expr
),
4061 gfc_constructor_append_expr (&result
->value
.constructor
,
4062 gfc_copy_expr (fsource_ctor
->expr
),
4064 tsource_ctor
= gfc_constructor_next (tsource_ctor
);
4065 fsource_ctor
= gfc_constructor_next (fsource_ctor
);
4066 mask_ctor
= gfc_constructor_next (mask_ctor
);
4069 result
->shape
= gfc_get_shape (1);
4070 gfc_array_size (result
, &result
->shape
[0]);
4077 gfc_simplify_merge_bits (gfc_expr
*i
, gfc_expr
*j
, gfc_expr
*mask_expr
)
4079 mpz_t arg1
, arg2
, mask
;
4082 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
4083 || mask_expr
->expr_type
!= EXPR_CONSTANT
)
4086 result
= gfc_get_constant_expr (BT_INTEGER
, i
->ts
.kind
, &i
->where
);
4088 /* Convert all argument to unsigned. */
4089 mpz_init_set (arg1
, i
->value
.integer
);
4090 mpz_init_set (arg2
, j
->value
.integer
);
4091 mpz_init_set (mask
, mask_expr
->value
.integer
);
4093 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4094 mpz_and (arg1
, arg1
, mask
);
4095 mpz_com (mask
, mask
);
4096 mpz_and (arg2
, arg2
, mask
);
4097 mpz_ior (result
->value
.integer
, arg1
, arg2
);
4107 /* Selects between current value and extremum for simplify_min_max
4108 and simplify_minval_maxval. */
4110 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
)
4112 switch (arg
->ts
.type
)
4115 if (mpz_cmp (arg
->value
.integer
,
4116 extremum
->value
.integer
) * sign
> 0)
4117 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
4121 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4123 mpfr_max (extremum
->value
.real
, extremum
->value
.real
,
4124 arg
->value
.real
, GFC_RND_MODE
);
4126 mpfr_min (extremum
->value
.real
, extremum
->value
.real
,
4127 arg
->value
.real
, GFC_RND_MODE
);
4131 #define LENGTH(x) ((x)->value.character.length)
4132 #define STRING(x) ((x)->value.character.string)
4133 if (LENGTH (extremum
) < LENGTH(arg
))
4135 gfc_char_t
*tmp
= STRING(extremum
);
4137 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
4138 memcpy (STRING(extremum
), tmp
,
4139 LENGTH(extremum
) * sizeof (gfc_char_t
));
4140 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
4141 LENGTH(arg
) - LENGTH(extremum
));
4142 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
4143 LENGTH(extremum
) = LENGTH(arg
);
4147 if (gfc_compare_string (arg
, extremum
) * sign
> 0)
4149 free (STRING(extremum
));
4150 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
4151 memcpy (STRING(extremum
), STRING(arg
),
4152 LENGTH(arg
) * sizeof (gfc_char_t
));
4153 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
4154 LENGTH(extremum
) - LENGTH(arg
));
4155 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
4162 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4167 /* This function is special since MAX() can take any number of
4168 arguments. The simplified expression is a rewritten version of the
4169 argument list containing at most one constant element. Other
4170 constant elements are deleted. Because the argument list has
4171 already been checked, this function always succeeds. sign is 1 for
4172 MAX(), -1 for MIN(). */
4175 simplify_min_max (gfc_expr
*expr
, int sign
)
4177 gfc_actual_arglist
*arg
, *last
, *extremum
;
4178 gfc_intrinsic_sym
* specific
;
4182 specific
= expr
->value
.function
.isym
;
4184 arg
= expr
->value
.function
.actual
;
4186 for (; arg
; last
= arg
, arg
= arg
->next
)
4188 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
4191 if (extremum
== NULL
)
4197 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
4199 /* Delete the extra constant argument. */
4200 last
->next
= arg
->next
;
4203 gfc_free_actual_arglist (arg
);
4207 /* If there is one value left, replace the function call with the
4209 if (expr
->value
.function
.actual
->next
!= NULL
)
4212 /* Convert to the correct type and kind. */
4213 if (expr
->ts
.type
!= BT_UNKNOWN
)
4214 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4215 expr
->ts
.type
, expr
->ts
.kind
);
4217 if (specific
->ts
.type
!= BT_UNKNOWN
)
4218 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4219 specific
->ts
.type
, specific
->ts
.kind
);
4221 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
4226 gfc_simplify_min (gfc_expr
*e
)
4228 return simplify_min_max (e
, -1);
4233 gfc_simplify_max (gfc_expr
*e
)
4235 return simplify_min_max (e
, 1);
4239 /* This is a simplified version of simplify_min_max to provide
4240 simplification of minval and maxval for a vector. */
4243 simplify_minval_maxval (gfc_expr
*expr
, int sign
)
4245 gfc_constructor
*c
, *extremum
;
4246 gfc_intrinsic_sym
* specific
;
4249 specific
= expr
->value
.function
.isym
;
4251 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4252 c
; c
= gfc_constructor_next (c
))
4254 if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
4257 if (extremum
== NULL
)
4263 min_max_choose (c
->expr
, extremum
->expr
, sign
);
4266 if (extremum
== NULL
)
4269 /* Convert to the correct type and kind. */
4270 if (expr
->ts
.type
!= BT_UNKNOWN
)
4271 return gfc_convert_constant (extremum
->expr
,
4272 expr
->ts
.type
, expr
->ts
.kind
);
4274 if (specific
->ts
.type
!= BT_UNKNOWN
)
4275 return gfc_convert_constant (extremum
->expr
,
4276 specific
->ts
.type
, specific
->ts
.kind
);
4278 return gfc_copy_expr (extremum
->expr
);
4283 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4285 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4288 return simplify_minval_maxval (array
, -1);
4293 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4295 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4298 return simplify_minval_maxval (array
, 1);
4303 gfc_simplify_maxexponent (gfc_expr
*x
)
4305 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4306 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4307 gfc_real_kinds
[i
].max_exponent
);
4312 gfc_simplify_minexponent (gfc_expr
*x
)
4314 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4315 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4316 gfc_real_kinds
[i
].min_exponent
);
4321 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
4326 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4329 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4330 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4335 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4337 /* Result is processor-dependent. */
4338 gfc_error ("Second argument MOD at %L is zero", &a
->where
);
4339 gfc_free_expr (result
);
4340 return &gfc_bad_expr
;
4342 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4346 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4348 /* Result is processor-dependent. */
4349 gfc_error ("Second argument of MOD at %L is zero", &p
->where
);
4350 gfc_free_expr (result
);
4351 return &gfc_bad_expr
;
4354 gfc_set_model_kind (kind
);
4355 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4360 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4363 return range_check (result
, "MOD");
4368 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
4373 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4376 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4377 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4382 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4384 /* Result is processor-dependent. This processor just opts
4385 to not handle it at all. */
4386 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
4387 gfc_free_expr (result
);
4388 return &gfc_bad_expr
;
4390 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4395 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4397 /* Result is processor-dependent. */
4398 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
4399 gfc_free_expr (result
);
4400 return &gfc_bad_expr
;
4403 gfc_set_model_kind (kind
);
4404 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4406 if (mpfr_cmp_ui (result
->value
.real
, 0) != 0)
4408 if (mpfr_signbit (a
->value
.real
) != mpfr_signbit (p
->value
.real
))
4409 mpfr_add (result
->value
.real
, result
->value
.real
, p
->value
.real
,
4413 mpfr_copysign (result
->value
.real
, result
->value
.real
,
4414 p
->value
.real
, GFC_RND_MODE
);
4418 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4421 return range_check (result
, "MODULO");
4425 /* Exists for the sole purpose of consistency with other intrinsics. */
4427 gfc_simplify_mvbits (gfc_expr
*f ATTRIBUTE_UNUSED
,
4428 gfc_expr
*fp ATTRIBUTE_UNUSED
,
4429 gfc_expr
*l ATTRIBUTE_UNUSED
,
4430 gfc_expr
*to ATTRIBUTE_UNUSED
,
4431 gfc_expr
*tp ATTRIBUTE_UNUSED
)
4438 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
4441 mp_exp_t emin
, emax
;
4444 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
4447 result
= gfc_copy_expr (x
);
4449 /* Save current values of emin and emax. */
4450 emin
= mpfr_get_emin ();
4451 emax
= mpfr_get_emax ();
4453 /* Set emin and emax for the current model number. */
4454 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
4455 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
4456 mpfr_get_prec(result
->value
.real
) + 1);
4457 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
4458 mpfr_check_range (result
->value
.real
, 0, GMP_RNDU
);
4460 if (mpfr_sgn (s
->value
.real
) > 0)
4462 mpfr_nextabove (result
->value
.real
);
4463 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
4467 mpfr_nextbelow (result
->value
.real
);
4468 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
4471 mpfr_set_emin (emin
);
4472 mpfr_set_emax (emax
);
4474 /* Only NaN can occur. Do not use range check as it gives an
4475 error for denormal numbers. */
4476 if (mpfr_nan_p (result
->value
.real
) && gfc_option
.flag_range_check
)
4478 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
4479 gfc_free_expr (result
);
4480 return &gfc_bad_expr
;
4488 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
4490 gfc_expr
*itrunc
, *result
;
4493 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
4495 return &gfc_bad_expr
;
4497 if (e
->expr_type
!= EXPR_CONSTANT
)
4500 itrunc
= gfc_copy_expr (e
);
4501 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
4503 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
4504 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
4506 gfc_free_expr (itrunc
);
4508 return range_check (result
, name
);
4513 gfc_simplify_new_line (gfc_expr
*e
)
4517 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 1);
4518 result
->value
.character
.string
[0] = '\n';
4525 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
4527 return simplify_nint ("NINT", e
, k
);
4532 gfc_simplify_idnint (gfc_expr
*e
)
4534 return simplify_nint ("IDNINT", e
, NULL
);
4539 add_squared (gfc_expr
*result
, gfc_expr
*e
)
4543 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4544 gcc_assert (result
->ts
.type
== BT_REAL
4545 && result
->expr_type
== EXPR_CONSTANT
);
4547 gfc_set_model_kind (result
->ts
.kind
);
4549 mpfr_pow_ui (tmp
, e
->value
.real
, 2, GFC_RND_MODE
);
4550 mpfr_add (result
->value
.real
, result
->value
.real
, tmp
,
4559 do_sqrt (gfc_expr
*result
, gfc_expr
*e
)
4561 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4562 gcc_assert (result
->ts
.type
== BT_REAL
4563 && result
->expr_type
== EXPR_CONSTANT
);
4565 mpfr_set (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
4566 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4572 gfc_simplify_norm2 (gfc_expr
*e
, gfc_expr
*dim
)
4576 if (!is_constant_array_expr (e
)
4577 || (dim
!= NULL
&& !gfc_is_constant_expr (dim
)))
4580 result
= transformational_result (e
, dim
, e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4581 init_result_expr (result
, 0, NULL
);
4583 if (!dim
|| e
->rank
== 1)
4585 result
= simplify_transformation_to_scalar (result
, e
, NULL
,
4587 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4590 result
= simplify_transformation_to_array (result
, e
, dim
, NULL
,
4591 add_squared
, &do_sqrt
);
4598 gfc_simplify_not (gfc_expr
*e
)
4602 if (e
->expr_type
!= EXPR_CONSTANT
)
4605 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4606 mpz_com (result
->value
.integer
, e
->value
.integer
);
4608 return range_check (result
, "NOT");
4613 gfc_simplify_null (gfc_expr
*mold
)
4619 result
= gfc_copy_expr (mold
);
4620 result
->expr_type
= EXPR_NULL
;
4623 result
= gfc_get_null_expr (NULL
);
4630 gfc_simplify_num_images (gfc_expr
*distance ATTRIBUTE_UNUSED
, gfc_expr
*failed
)
4634 if (gfc_option
.coarray
== GFC_FCOARRAY_NONE
)
4636 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
4637 return &gfc_bad_expr
;
4640 if (gfc_option
.coarray
!= GFC_FCOARRAY_SINGLE
)
4643 if (failed
&& failed
->expr_type
!= EXPR_CONSTANT
)
4646 /* FIXME: gfc_current_locus is wrong. */
4647 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
4648 &gfc_current_locus
);
4650 if (failed
&& failed
->value
.logical
!= 0)
4651 mpz_set_si (result
->value
.integer
, 0);
4653 mpz_set_si (result
->value
.integer
, 1);
4660 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
4665 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
4668 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
4673 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
4674 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
4675 return range_check (result
, "OR");
4678 return gfc_get_logical_expr (kind
, &x
->where
,
4679 x
->value
.logical
|| y
->value
.logical
);
4687 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
4690 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
4692 if (!is_constant_array_expr (array
)
4693 || !is_constant_array_expr (vector
)
4694 || (!gfc_is_constant_expr (mask
)
4695 && !is_constant_array_expr (mask
)))
4698 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
4699 if (array
->ts
.type
== BT_DERIVED
)
4700 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
4702 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
4703 vector_ctor
= vector
4704 ? gfc_constructor_first (vector
->value
.constructor
)
4707 if (mask
->expr_type
== EXPR_CONSTANT
4708 && mask
->value
.logical
)
4710 /* Copy all elements of ARRAY to RESULT. */
4713 gfc_constructor_append_expr (&result
->value
.constructor
,
4714 gfc_copy_expr (array_ctor
->expr
),
4717 array_ctor
= gfc_constructor_next (array_ctor
);
4718 vector_ctor
= gfc_constructor_next (vector_ctor
);
4721 else if (mask
->expr_type
== EXPR_ARRAY
)
4723 /* Copy only those elements of ARRAY to RESULT whose
4724 MASK equals .TRUE.. */
4725 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4728 if (mask_ctor
->expr
->value
.logical
)
4730 gfc_constructor_append_expr (&result
->value
.constructor
,
4731 gfc_copy_expr (array_ctor
->expr
),
4733 vector_ctor
= gfc_constructor_next (vector_ctor
);
4736 array_ctor
= gfc_constructor_next (array_ctor
);
4737 mask_ctor
= gfc_constructor_next (mask_ctor
);
4741 /* Append any left-over elements from VECTOR to RESULT. */
4744 gfc_constructor_append_expr (&result
->value
.constructor
,
4745 gfc_copy_expr (vector_ctor
->expr
),
4747 vector_ctor
= gfc_constructor_next (vector_ctor
);
4750 result
->shape
= gfc_get_shape (1);
4751 gfc_array_size (result
, &result
->shape
[0]);
4753 if (array
->ts
.type
== BT_CHARACTER
)
4754 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
4761 do_xor (gfc_expr
*result
, gfc_expr
*e
)
4763 gcc_assert (e
->ts
.type
== BT_LOGICAL
&& e
->expr_type
== EXPR_CONSTANT
);
4764 gcc_assert (result
->ts
.type
== BT_LOGICAL
4765 && result
->expr_type
== EXPR_CONSTANT
);
4767 result
->value
.logical
= result
->value
.logical
!= e
->value
.logical
;
4774 gfc_simplify_parity (gfc_expr
*e
, gfc_expr
*dim
)
4776 return simplify_transformation (e
, dim
, NULL
, 0, do_xor
);
4781 gfc_simplify_popcnt (gfc_expr
*e
)
4786 if (e
->expr_type
!= EXPR_CONSTANT
)
4789 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4791 /* Convert argument to unsigned, then count the '1' bits. */
4792 mpz_init_set (x
, e
->value
.integer
);
4793 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
4794 res
= mpz_popcount (x
);
4797 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, res
);
4802 gfc_simplify_poppar (gfc_expr
*e
)
4808 if (e
->expr_type
!= EXPR_CONSTANT
)
4811 popcnt
= gfc_simplify_popcnt (e
);
4812 gcc_assert (popcnt
);
4814 s
= gfc_extract_int (popcnt
, &i
);
4817 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
% 2);
4822 gfc_simplify_precision (gfc_expr
*e
)
4824 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4825 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
,
4826 gfc_real_kinds
[i
].precision
);
4831 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
4833 return simplify_transformation (array
, dim
, mask
, 1, gfc_multiply
);
4838 gfc_simplify_radix (gfc_expr
*e
)
4841 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4846 i
= gfc_integer_kinds
[i
].radix
;
4850 i
= gfc_real_kinds
[i
].radix
;
4857 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
4862 gfc_simplify_range (gfc_expr
*e
)
4865 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4870 i
= gfc_integer_kinds
[i
].range
;
4875 i
= gfc_real_kinds
[i
].range
;
4882 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
4887 gfc_simplify_rank (gfc_expr
*e
)
4893 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, e
->rank
);
4898 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
4900 gfc_expr
*result
= NULL
;
4903 if (e
->ts
.type
== BT_COMPLEX
)
4904 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
4906 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
4909 return &gfc_bad_expr
;
4911 if (e
->expr_type
!= EXPR_CONSTANT
)
4914 if (convert_boz (e
, kind
) == &gfc_bad_expr
)
4915 return &gfc_bad_expr
;
4917 result
= gfc_convert_constant (e
, BT_REAL
, kind
);
4918 if (result
== &gfc_bad_expr
)
4919 return &gfc_bad_expr
;
4921 return range_check (result
, "REAL");
4926 gfc_simplify_realpart (gfc_expr
*e
)
4930 if (e
->expr_type
!= EXPR_CONSTANT
)
4933 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
4934 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
4936 return range_check (result
, "REALPART");
4940 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
4943 int i
, j
, len
, ncop
, nlen
;
4945 bool have_length
= false;
4947 /* If NCOPIES isn't a constant, there's nothing we can do. */
4948 if (n
->expr_type
!= EXPR_CONSTANT
)
4951 /* If NCOPIES is negative, it's an error. */
4952 if (mpz_sgn (n
->value
.integer
) < 0)
4954 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4956 return &gfc_bad_expr
;
4959 /* If we don't know the character length, we can do no more. */
4960 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
4961 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
4963 len
= mpz_get_si (e
->ts
.u
.cl
->length
->value
.integer
);
4966 else if (e
->expr_type
== EXPR_CONSTANT
4967 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
4969 len
= e
->value
.character
.length
;
4974 /* If the source length is 0, any value of NCOPIES is valid
4975 and everything behaves as if NCOPIES == 0. */
4978 mpz_set_ui (ncopies
, 0);
4980 mpz_set (ncopies
, n
->value
.integer
);
4982 /* Check that NCOPIES isn't too large. */
4988 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4990 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
4994 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
4995 e
->ts
.u
.cl
->length
->value
.integer
);
4999 mpz_init_set_si (mlen
, len
);
5000 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
5004 /* The check itself. */
5005 if (mpz_cmp (ncopies
, max
) > 0)
5008 mpz_clear (ncopies
);
5009 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
5011 return &gfc_bad_expr
;
5016 mpz_clear (ncopies
);
5018 /* For further simplification, we need the character string to be
5020 if (e
->expr_type
!= EXPR_CONSTANT
)
5024 (e
->ts
.u
.cl
->length
&&
5025 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
)) != 0)
5027 const char *res
= gfc_extract_int (n
, &ncop
);
5028 gcc_assert (res
== NULL
);
5034 return gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 0);
5036 len
= e
->value
.character
.length
;
5039 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, nlen
);
5040 for (i
= 0; i
< ncop
; i
++)
5041 for (j
= 0; j
< len
; j
++)
5042 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
5044 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
5049 /* This one is a bear, but mainly has to do with shuffling elements. */
5052 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
5053 gfc_expr
*pad
, gfc_expr
*order_exp
)
5055 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
5056 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
5060 gfc_expr
*e
, *result
;
5062 /* Check that argument expression types are OK. */
5063 if (!is_constant_array_expr (source
)
5064 || !is_constant_array_expr (shape_exp
)
5065 || !is_constant_array_expr (pad
)
5066 || !is_constant_array_expr (order_exp
))
5069 /* Proceed with simplification, unpacking the array. */
5076 e
= gfc_constructor_lookup_expr (shape_exp
->value
.constructor
, rank
);
5080 gfc_extract_int (e
, &shape
[rank
]);
5082 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
5083 gcc_assert (shape
[rank
] >= 0);
5088 gcc_assert (rank
> 0);
5090 /* Now unpack the order array if present. */
5091 if (order_exp
== NULL
)
5093 for (i
= 0; i
< rank
; i
++)
5098 for (i
= 0; i
< rank
; i
++)
5101 for (i
= 0; i
< rank
; i
++)
5103 e
= gfc_constructor_lookup_expr (order_exp
->value
.constructor
, i
);
5106 gfc_extract_int (e
, &order
[i
]);
5108 gcc_assert (order
[i
] >= 1 && order
[i
] <= rank
);
5110 gcc_assert (x
[order
[i
]] == 0);
5115 /* Count the elements in the source and padding arrays. */
5120 gfc_array_size (pad
, &size
);
5121 npad
= mpz_get_ui (size
);
5125 gfc_array_size (source
, &size
);
5126 nsource
= mpz_get_ui (size
);
5129 /* If it weren't for that pesky permutation we could just loop
5130 through the source and round out any shortage with pad elements.
5131 But no, someone just had to have the compiler do something the
5132 user should be doing. */
5134 for (i
= 0; i
< rank
; i
++)
5137 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5139 if (source
->ts
.type
== BT_DERIVED
)
5140 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5141 result
->rank
= rank
;
5142 result
->shape
= gfc_get_shape (rank
);
5143 for (i
= 0; i
< rank
; i
++)
5144 mpz_init_set_ui (result
->shape
[i
], shape
[i
]);
5146 while (nsource
> 0 || npad
> 0)
5148 /* Figure out which element to extract. */
5149 mpz_set_ui (index
, 0);
5151 for (i
= rank
- 1; i
>= 0; i
--)
5153 mpz_add_ui (index
, index
, x
[order
[i
]]);
5155 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
5158 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
5159 gfc_internal_error ("Reshaped array too large at %C");
5161 j
= mpz_get_ui (index
);
5164 e
= gfc_constructor_lookup_expr (source
->value
.constructor
, j
);
5167 gcc_assert (npad
> 0);
5171 e
= gfc_constructor_lookup_expr (pad
->value
.constructor
, j
);
5175 gfc_constructor_append_expr (&result
->value
.constructor
,
5176 gfc_copy_expr (e
), &e
->where
);
5178 /* Calculate the next element. */
5182 if (++x
[i
] < shape
[i
])
5198 gfc_simplify_rrspacing (gfc_expr
*x
)
5204 if (x
->expr_type
!= EXPR_CONSTANT
)
5207 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
5209 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5211 /* RRSPACING(+/- 0.0) = 0.0 */
5212 if (mpfr_zero_p (x
->value
.real
))
5214 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5218 /* RRSPACING(inf) = NaN */
5219 if (mpfr_inf_p (x
->value
.real
))
5221 mpfr_set_nan (result
->value
.real
);
5225 /* RRSPACING(NaN) = same NaN */
5226 if (mpfr_nan_p (x
->value
.real
))
5228 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5232 /* | x * 2**(-e) | * 2**p. */
5233 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5234 e
= - (long int) mpfr_get_exp (x
->value
.real
);
5235 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
5237 p
= (long int) gfc_real_kinds
[i
].digits
;
5238 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
5240 return range_check (result
, "RRSPACING");
5245 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
5247 int k
, neg_flag
, power
, exp_range
;
5248 mpfr_t scale
, radix
;
5251 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5254 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5256 if (mpfr_zero_p (x
->value
.real
))
5258 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5262 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5264 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
5266 /* This check filters out values of i that would overflow an int. */
5267 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
5268 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
5270 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
5271 gfc_free_expr (result
);
5272 return &gfc_bad_expr
;
5275 /* Compute scale = radix ** power. */
5276 power
= mpz_get_si (i
->value
.integer
);
5286 gfc_set_model_kind (x
->ts
.kind
);
5289 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
5290 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
5293 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5295 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5297 mpfr_clears (scale
, radix
, NULL
);
5299 return range_check (result
, "SCALE");
5303 /* Variants of strspn and strcspn that operate on wide characters. */
5306 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5309 const gfc_char_t
*c
;
5313 for (c
= s2
; *c
; c
++)
5327 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5330 const gfc_char_t
*c
;
5334 for (c
= s2
; *c
; c
++)
5349 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
5354 size_t indx
, len
, lenc
;
5355 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
5358 return &gfc_bad_expr
;
5360 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
5361 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
5364 if (b
!= NULL
&& b
->value
.logical
!= 0)
5369 len
= e
->value
.character
.length
;
5370 lenc
= c
->value
.character
.length
;
5372 if (len
== 0 || lenc
== 0)
5380 indx
= wide_strcspn (e
->value
.character
.string
,
5381 c
->value
.character
.string
) + 1;
5388 for (indx
= len
; indx
> 0; indx
--)
5390 for (i
= 0; i
< lenc
; i
++)
5392 if (c
->value
.character
.string
[i
]
5393 == e
->value
.character
.string
[indx
- 1])
5402 result
= gfc_get_int_expr (k
, &e
->where
, indx
);
5403 return range_check (result
, "SCAN");
5408 gfc_simplify_selected_char_kind (gfc_expr
*e
)
5412 if (e
->expr_type
!= EXPR_CONSTANT
)
5415 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
5416 || gfc_compare_with_Cstring (e
, "default", false) == 0)
5418 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
5423 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5428 gfc_simplify_selected_int_kind (gfc_expr
*e
)
5432 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
) != NULL
)
5437 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
5438 if (gfc_integer_kinds
[i
].range
>= range
5439 && gfc_integer_kinds
[i
].kind
< kind
)
5440 kind
= gfc_integer_kinds
[i
].kind
;
5442 if (kind
== INT_MAX
)
5445 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5450 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
, gfc_expr
*rdx
)
5452 int range
, precision
, radix
, i
, kind
, found_precision
, found_range
,
5454 locus
*loc
= &gfc_current_locus
;
5460 if (p
->expr_type
!= EXPR_CONSTANT
5461 || gfc_extract_int (p
, &precision
) != NULL
)
5470 if (q
->expr_type
!= EXPR_CONSTANT
5471 || gfc_extract_int (q
, &range
) != NULL
)
5482 if (rdx
->expr_type
!= EXPR_CONSTANT
5483 || gfc_extract_int (rdx
, &radix
) != NULL
)
5491 found_precision
= 0;
5495 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
5497 if (gfc_real_kinds
[i
].precision
>= precision
)
5498 found_precision
= 1;
5500 if (gfc_real_kinds
[i
].range
>= range
)
5503 if (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
5506 if (gfc_real_kinds
[i
].precision
>= precision
5507 && gfc_real_kinds
[i
].range
>= range
5508 && (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
5509 && gfc_real_kinds
[i
].kind
< kind
)
5510 kind
= gfc_real_kinds
[i
].kind
;
5513 if (kind
== INT_MAX
)
5515 if (found_radix
&& found_range
&& !found_precision
)
5517 else if (found_radix
&& found_precision
&& !found_range
)
5519 else if (found_radix
&& !found_precision
&& !found_range
)
5521 else if (found_radix
)
5527 return gfc_get_int_expr (gfc_default_integer_kind
, loc
, kind
);
5532 gfc_simplify_ieee_selected_real_kind (gfc_expr
*expr
)
5534 gfc_actual_arglist
*arg
= expr
->value
.function
.actual
;
5535 gfc_expr
*p
= arg
->expr
, *r
= arg
->next
->expr
,
5536 *rad
= arg
->next
->next
->expr
;
5537 int precision
, range
, radix
, res
;
5538 int found_precision
, found_range
, found_radix
, i
;
5542 if (p
->expr_type
!= EXPR_CONSTANT
5543 || gfc_extract_int (p
, &precision
) != NULL
)
5551 if (r
->expr_type
!= EXPR_CONSTANT
5552 || gfc_extract_int (r
, &range
) != NULL
)
5560 if (rad
->expr_type
!= EXPR_CONSTANT
5561 || gfc_extract_int (rad
, &radix
) != NULL
)
5568 found_precision
= 0;
5572 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
5574 /* We only support the target's float and double types. */
5575 if (!gfc_real_kinds
[i
].c_float
&& !gfc_real_kinds
[i
].c_double
)
5578 if (gfc_real_kinds
[i
].precision
>= precision
)
5579 found_precision
= 1;
5581 if (gfc_real_kinds
[i
].range
>= range
)
5584 if (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
5587 if (gfc_real_kinds
[i
].precision
>= precision
5588 && gfc_real_kinds
[i
].range
>= range
5589 && (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
5590 && gfc_real_kinds
[i
].kind
< res
)
5591 res
= gfc_real_kinds
[i
].kind
;
5596 if (found_radix
&& found_range
&& !found_precision
)
5598 else if (found_radix
&& found_precision
&& !found_range
)
5600 else if (found_radix
&& !found_precision
&& !found_range
)
5602 else if (found_radix
)
5608 return gfc_get_int_expr (gfc_default_integer_kind
, &expr
->where
, res
);
5613 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
5616 mpfr_t exp
, absv
, log2
, pow2
, frac
;
5619 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5622 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5624 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
5625 SET_EXPONENT (NaN) = same NaN */
5626 if (mpfr_zero_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
5628 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5632 /* SET_EXPONENT (inf) = NaN */
5633 if (mpfr_inf_p (x
->value
.real
))
5635 mpfr_set_nan (result
->value
.real
);
5639 gfc_set_model_kind (x
->ts
.kind
);
5646 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
5647 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
5649 mpfr_trunc (log2
, log2
);
5650 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
5652 /* Old exponent value, and fraction. */
5653 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
5655 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
5658 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
5659 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
5661 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
5663 return range_check (result
, "SET_EXPONENT");
5668 gfc_simplify_shape (gfc_expr
*source
, gfc_expr
*kind
)
5670 mpz_t shape
[GFC_MAX_DIMENSIONS
];
5671 gfc_expr
*result
, *e
, *f
;
5675 int k
= get_kind (BT_INTEGER
, kind
, "SHAPE", gfc_default_integer_kind
);
5677 if (source
->rank
== -1)
5680 result
= gfc_get_array_expr (BT_INTEGER
, k
, &source
->where
);
5682 if (source
->rank
== 0)
5685 if (source
->expr_type
== EXPR_VARIABLE
)
5687 ar
= gfc_find_array_ref (source
);
5688 t
= gfc_array_ref_shape (ar
, shape
);
5690 else if (source
->shape
)
5693 for (n
= 0; n
< source
->rank
; n
++)
5695 mpz_init (shape
[n
]);
5696 mpz_set (shape
[n
], source
->shape
[n
]);
5702 for (n
= 0; n
< source
->rank
; n
++)
5704 e
= gfc_get_constant_expr (BT_INTEGER
, k
, &source
->where
);
5707 mpz_set (e
->value
.integer
, shape
[n
]);
5710 mpz_set_ui (e
->value
.integer
, n
+ 1);
5712 f
= simplify_size (source
, e
, k
);
5716 gfc_free_expr (result
);
5723 if (e
== &gfc_bad_expr
|| range_check (e
, "SHAPE") == &gfc_bad_expr
)
5725 gfc_free_expr (result
);
5727 gfc_clear_shape (shape
, source
->rank
);
5728 return &gfc_bad_expr
;
5731 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
5735 gfc_clear_shape (shape
, source
->rank
);
5742 simplify_size (gfc_expr
*array
, gfc_expr
*dim
, int k
)
5745 gfc_expr
*return_value
;
5748 /* For unary operations, the size of the result is given by the size
5749 of the operand. For binary ones, it's the size of the first operand
5750 unless it is scalar, then it is the size of the second. */
5751 if (array
->expr_type
== EXPR_OP
&& !array
->value
.op
.uop
)
5753 gfc_expr
* replacement
;
5754 gfc_expr
* simplified
;
5756 switch (array
->value
.op
.op
)
5758 /* Unary operations. */
5760 case INTRINSIC_UPLUS
:
5761 case INTRINSIC_UMINUS
:
5762 case INTRINSIC_PARENTHESES
:
5763 replacement
= array
->value
.op
.op1
;
5766 /* Binary operations. If any one of the operands is scalar, take
5767 the other one's size. If both of them are arrays, it does not
5768 matter -- try to find one with known shape, if possible. */
5770 if (array
->value
.op
.op1
->rank
== 0)
5771 replacement
= array
->value
.op
.op2
;
5772 else if (array
->value
.op
.op2
->rank
== 0)
5773 replacement
= array
->value
.op
.op1
;
5776 simplified
= simplify_size (array
->value
.op
.op1
, dim
, k
);
5780 replacement
= array
->value
.op
.op2
;
5785 /* Try to reduce it directly if possible. */
5786 simplified
= simplify_size (replacement
, dim
, k
);
5788 /* Otherwise, we build a new SIZE call. This is hopefully at least
5789 simpler than the original one. */
5792 gfc_expr
*kind
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, k
);
5793 simplified
= gfc_build_intrinsic_call (gfc_current_ns
,
5794 GFC_ISYM_SIZE
, "size",
5796 gfc_copy_expr (replacement
),
5797 gfc_copy_expr (dim
),
5805 if (!gfc_array_size (array
, &size
))
5810 if (dim
->expr_type
!= EXPR_CONSTANT
)
5813 d
= mpz_get_ui (dim
->value
.integer
) - 1;
5814 if (!gfc_array_dimen_size (array
, d
, &size
))
5818 return_value
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
5819 mpz_set (return_value
->value
.integer
, size
);
5822 return return_value
;
5827 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
5830 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
5833 return &gfc_bad_expr
;
5835 result
= simplify_size (array
, dim
, k
);
5836 if (result
== NULL
|| result
== &gfc_bad_expr
)
5839 return range_check (result
, "SIZE");
5843 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
5844 multiplied by the array size. */
5847 gfc_simplify_sizeof (gfc_expr
*x
)
5849 gfc_expr
*result
= NULL
;
5852 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
5855 if (x
->ts
.type
== BT_CHARACTER
5856 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
5857 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
5860 if (x
->rank
&& x
->expr_type
!= EXPR_ARRAY
5861 && !gfc_array_size (x
, &array_size
))
5864 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_index_integer_kind
,
5866 mpz_set_si (result
->value
.integer
, gfc_target_expr_size (x
));
5872 /* STORAGE_SIZE returns the size in bits of a single array element. */
5875 gfc_simplify_storage_size (gfc_expr
*x
,
5878 gfc_expr
*result
= NULL
;
5881 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
5884 if (x
->ts
.type
== BT_CHARACTER
&& x
->expr_type
!= EXPR_CONSTANT
5885 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
5886 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
5889 k
= get_kind (BT_INTEGER
, kind
, "STORAGE_SIZE", gfc_default_integer_kind
);
5891 return &gfc_bad_expr
;
5893 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
5895 mpz_set_si (result
->value
.integer
, gfc_element_size (x
));
5896 mpz_mul_ui (result
->value
.integer
, result
->value
.integer
, BITS_PER_UNIT
);
5898 return range_check (result
, "STORAGE_SIZE");
5903 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
5907 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
5910 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5915 mpz_abs (result
->value
.integer
, x
->value
.integer
);
5916 if (mpz_sgn (y
->value
.integer
) < 0)
5917 mpz_neg (result
->value
.integer
, result
->value
.integer
);
5921 if (gfc_option
.flag_sign_zero
)
5922 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
5925 mpfr_setsign (result
->value
.real
, x
->value
.real
,
5926 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
5930 gfc_internal_error ("Bad type in gfc_simplify_sign");
5938 gfc_simplify_sin (gfc_expr
*x
)
5942 if (x
->expr_type
!= EXPR_CONSTANT
)
5945 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5950 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5954 gfc_set_model (x
->value
.real
);
5955 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5959 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
5962 return range_check (result
, "SIN");
5967 gfc_simplify_sinh (gfc_expr
*x
)
5971 if (x
->expr_type
!= EXPR_CONSTANT
)
5974 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5979 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5983 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5990 return range_check (result
, "SINH");
5994 /* The argument is always a double precision real that is converted to
5995 single precision. TODO: Rounding! */
5998 gfc_simplify_sngl (gfc_expr
*a
)
6002 if (a
->expr_type
!= EXPR_CONSTANT
)
6005 result
= gfc_real2real (a
, gfc_default_real_kind
);
6006 return range_check (result
, "SNGL");
6011 gfc_simplify_spacing (gfc_expr
*x
)
6017 if (x
->expr_type
!= EXPR_CONSTANT
)
6020 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
6021 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6023 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
6024 if (mpfr_zero_p (x
->value
.real
))
6026 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
6030 /* SPACING(inf) = NaN */
6031 if (mpfr_inf_p (x
->value
.real
))
6033 mpfr_set_nan (result
->value
.real
);
6037 /* SPACING(NaN) = same NaN */
6038 if (mpfr_nan_p (x
->value
.real
))
6040 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6044 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
6045 are the radix, exponent of x, and precision. This excludes the
6046 possibility of subnormal numbers. Fortran 2003 states the result is
6047 b**max(e - p, emin - 1). */
6049 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
6050 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
6051 en
= en
> ep
? en
: ep
;
6053 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
6054 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
6056 return range_check (result
, "SPACING");
6061 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
6063 gfc_expr
*result
= 0L;
6064 int i
, j
, dim
, ncopies
;
6067 if ((!gfc_is_constant_expr (source
)
6068 && !is_constant_array_expr (source
))
6069 || !gfc_is_constant_expr (dim_expr
)
6070 || !gfc_is_constant_expr (ncopies_expr
))
6073 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
6074 gfc_extract_int (dim_expr
, &dim
);
6075 dim
-= 1; /* zero-base DIM */
6077 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
6078 gfc_extract_int (ncopies_expr
, &ncopies
);
6079 ncopies
= MAX (ncopies
, 0);
6081 /* Do not allow the array size to exceed the limit for an array
6083 if (source
->expr_type
== EXPR_ARRAY
)
6085 if (!gfc_array_size (source
, &size
))
6086 gfc_internal_error ("Failure getting length of a constant array.");
6089 mpz_init_set_ui (size
, 1);
6091 if (mpz_get_si (size
)*ncopies
> gfc_option
.flag_max_array_constructor
)
6094 if (source
->expr_type
== EXPR_CONSTANT
)
6096 gcc_assert (dim
== 0);
6098 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6100 if (source
->ts
.type
== BT_DERIVED
)
6101 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6103 result
->shape
= gfc_get_shape (result
->rank
);
6104 mpz_init_set_si (result
->shape
[0], ncopies
);
6106 for (i
= 0; i
< ncopies
; ++i
)
6107 gfc_constructor_append_expr (&result
->value
.constructor
,
6108 gfc_copy_expr (source
), NULL
);
6110 else if (source
->expr_type
== EXPR_ARRAY
)
6112 int offset
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
6113 gfc_constructor
*source_ctor
;
6115 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
6116 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
6118 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6120 if (source
->ts
.type
== BT_DERIVED
)
6121 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6122 result
->rank
= source
->rank
+ 1;
6123 result
->shape
= gfc_get_shape (result
->rank
);
6125 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
6128 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
6130 mpz_init_set_si (result
->shape
[i
], ncopies
);
6132 extent
[i
] = mpz_get_si (result
->shape
[i
]);
6133 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
6137 for (source_ctor
= gfc_constructor_first (source
->value
.constructor
);
6138 source_ctor
; source_ctor
= gfc_constructor_next (source_ctor
))
6140 for (i
= 0; i
< ncopies
; ++i
)
6141 gfc_constructor_insert_expr (&result
->value
.constructor
,
6142 gfc_copy_expr (source_ctor
->expr
),
6143 NULL
, offset
+ i
* rstride
[dim
]);
6145 offset
+= (dim
== 0 ? ncopies
: 1);
6149 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
6150 Replace NULL with gcc_unreachable() after implementing
6151 gfc_simplify_cshift(). */
6154 if (source
->ts
.type
== BT_CHARACTER
)
6155 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
6162 gfc_simplify_sqrt (gfc_expr
*e
)
6164 gfc_expr
*result
= NULL
;
6166 if (e
->expr_type
!= EXPR_CONSTANT
)
6172 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
6174 gfc_error ("Argument of SQRT at %L has a negative value",
6176 return &gfc_bad_expr
;
6178 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6179 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
6183 gfc_set_model (e
->value
.real
);
6185 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6186 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
6190 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
6193 return range_check (result
, "SQRT");
6198 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
6200 return simplify_transformation (array
, dim
, mask
, 0, gfc_add
);
6205 gfc_simplify_tan (gfc_expr
*x
)
6209 if (x
->expr_type
!= EXPR_CONSTANT
)
6212 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6217 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6221 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6228 return range_check (result
, "TAN");
6233 gfc_simplify_tanh (gfc_expr
*x
)
6237 if (x
->expr_type
!= EXPR_CONSTANT
)
6240 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6245 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6249 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6256 return range_check (result
, "TANH");
6261 gfc_simplify_tiny (gfc_expr
*e
)
6266 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
6268 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
6269 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
6276 gfc_simplify_trailz (gfc_expr
*e
)
6278 unsigned long tz
, bs
;
6281 if (e
->expr_type
!= EXPR_CONSTANT
)
6284 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
6285 bs
= gfc_integer_kinds
[i
].bit_size
;
6286 tz
= mpz_scan1 (e
->value
.integer
, 0);
6288 return gfc_get_int_expr (gfc_default_integer_kind
,
6289 &e
->where
, MIN (tz
, bs
));
6294 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
6297 gfc_expr
*mold_element
;
6302 unsigned char *buffer
;
6303 size_t result_length
;
6306 if (!gfc_is_constant_expr (source
)
6307 || (gfc_init_expr_flag
&& !gfc_is_constant_expr (mold
))
6308 || !gfc_is_constant_expr (size
))
6311 if (!gfc_calculate_transfer_sizes (source
, mold
, size
, &source_size
,
6312 &result_size
, &result_length
))
6315 /* Calculate the size of the source. */
6316 if (source
->expr_type
== EXPR_ARRAY
6317 && !gfc_array_size (source
, &tmp
))
6318 gfc_internal_error ("Failure getting length of a constant array.");
6320 /* Create an empty new expression with the appropriate characteristics. */
6321 result
= gfc_get_constant_expr (mold
->ts
.type
, mold
->ts
.kind
,
6323 result
->ts
= mold
->ts
;
6325 mold_element
= mold
->expr_type
== EXPR_ARRAY
6326 ? gfc_constructor_first (mold
->value
.constructor
)->expr
6329 /* Set result character length, if needed. Note that this needs to be
6330 set even for array expressions, in order to pass this information into
6331 gfc_target_interpret_expr. */
6332 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
6333 result
->value
.character
.length
= mold_element
->value
.character
.length
;
6335 /* Set the number of elements in the result, and determine its size. */
6337 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
6339 result
->expr_type
= EXPR_ARRAY
;
6341 result
->shape
= gfc_get_shape (1);
6342 mpz_init_set_ui (result
->shape
[0], result_length
);
6347 /* Allocate the buffer to store the binary version of the source. */
6348 buffer_size
= MAX (source_size
, result_size
);
6349 buffer
= (unsigned char*)alloca (buffer_size
);
6350 memset (buffer
, 0, buffer_size
);
6352 /* Now write source to the buffer. */
6353 gfc_target_encode_expr (source
, buffer
, buffer_size
);
6355 /* And read the buffer back into the new expression. */
6356 gfc_target_interpret_expr (buffer
, buffer_size
, result
, false);
6363 gfc_simplify_transpose (gfc_expr
*matrix
)
6365 int row
, matrix_rows
, col
, matrix_cols
;
6368 if (!is_constant_array_expr (matrix
))
6371 gcc_assert (matrix
->rank
== 2);
6373 result
= gfc_get_array_expr (matrix
->ts
.type
, matrix
->ts
.kind
,
6376 result
->shape
= gfc_get_shape (result
->rank
);
6377 mpz_set (result
->shape
[0], matrix
->shape
[1]);
6378 mpz_set (result
->shape
[1], matrix
->shape
[0]);
6380 if (matrix
->ts
.type
== BT_CHARACTER
)
6381 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
6382 else if (matrix
->ts
.type
== BT_DERIVED
)
6383 result
->ts
.u
.derived
= matrix
->ts
.u
.derived
;
6385 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
6386 matrix_cols
= mpz_get_si (matrix
->shape
[1]);
6387 for (row
= 0; row
< matrix_rows
; ++row
)
6388 for (col
= 0; col
< matrix_cols
; ++col
)
6390 gfc_expr
*e
= gfc_constructor_lookup_expr (matrix
->value
.constructor
,
6391 col
* matrix_rows
+ row
);
6392 gfc_constructor_insert_expr (&result
->value
.constructor
,
6393 gfc_copy_expr (e
), &matrix
->where
,
6394 row
* matrix_cols
+ col
);
6402 gfc_simplify_trim (gfc_expr
*e
)
6405 int count
, i
, len
, lentrim
;
6407 if (e
->expr_type
!= EXPR_CONSTANT
)
6410 len
= e
->value
.character
.length
;
6411 for (count
= 0, i
= 1; i
<= len
; ++i
)
6413 if (e
->value
.character
.string
[len
- i
] == ' ')
6419 lentrim
= len
- count
;
6421 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, lentrim
);
6422 for (i
= 0; i
< lentrim
; i
++)
6423 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
6430 gfc_simplify_image_index (gfc_expr
*coarray
, gfc_expr
*sub
)
6435 gfc_constructor
*sub_cons
;
6439 if (!is_constant_array_expr (sub
))
6442 /* Follow any component references. */
6443 as
= coarray
->symtree
->n
.sym
->as
;
6444 for (ref
= coarray
->ref
; ref
; ref
= ref
->next
)
6445 if (ref
->type
== REF_COMPONENT
)
6448 if (as
->type
== AS_DEFERRED
)
6451 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6452 the cosubscript addresses the first image. */
6454 sub_cons
= gfc_constructor_first (sub
->value
.constructor
);
6457 for (d
= 1; d
<= as
->corank
; d
++)
6462 gcc_assert (sub_cons
!= NULL
);
6464 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 0, as
,
6466 if (ca_bound
== NULL
)
6469 if (ca_bound
== &gfc_bad_expr
)
6472 cmp
= mpz_cmp (ca_bound
->value
.integer
, sub_cons
->expr
->value
.integer
);
6476 gfc_free_expr (ca_bound
);
6477 sub_cons
= gfc_constructor_next (sub_cons
);
6481 first_image
= false;
6485 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6486 "SUB has %ld and COARRAY lower bound is %ld)",
6488 mpz_get_si (sub_cons
->expr
->value
.integer
),
6489 mpz_get_si (ca_bound
->value
.integer
));
6490 gfc_free_expr (ca_bound
);
6491 return &gfc_bad_expr
;
6494 gfc_free_expr (ca_bound
);
6496 /* Check whether upperbound is valid for the multi-images case. */
6499 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 1, as
,
6501 if (ca_bound
== &gfc_bad_expr
)
6504 if (ca_bound
&& ca_bound
->expr_type
== EXPR_CONSTANT
6505 && mpz_cmp (ca_bound
->value
.integer
,
6506 sub_cons
->expr
->value
.integer
) < 0)
6508 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6509 "SUB has %ld and COARRAY upper bound is %ld)",
6511 mpz_get_si (sub_cons
->expr
->value
.integer
),
6512 mpz_get_si (ca_bound
->value
.integer
));
6513 gfc_free_expr (ca_bound
);
6514 return &gfc_bad_expr
;
6518 gfc_free_expr (ca_bound
);
6521 sub_cons
= gfc_constructor_next (sub_cons
);
6524 gcc_assert (sub_cons
== NULL
);
6526 if (gfc_option
.coarray
!= GFC_FCOARRAY_SINGLE
&& !first_image
)
6529 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6530 &gfc_current_locus
);
6532 mpz_set_si (result
->value
.integer
, 1);
6534 mpz_set_si (result
->value
.integer
, 0);
6541 gfc_simplify_this_image (gfc_expr
*coarray
, gfc_expr
*dim
,
6542 gfc_expr
*distance ATTRIBUTE_UNUSED
)
6544 if (gfc_option
.coarray
!= GFC_FCOARRAY_SINGLE
)
6547 /* If no coarray argument has been passed or when the first argument
6548 is actually a distance argment. */
6549 if (coarray
== NULL
|| !gfc_is_coarray (coarray
))
6552 /* FIXME: gfc_current_locus is wrong. */
6553 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6554 &gfc_current_locus
);
6555 mpz_set_si (result
->value
.integer
, 1);
6559 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6560 return simplify_cobound (coarray
, dim
, NULL
, 0);
6565 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6567 return simplify_bound (array
, dim
, kind
, 1);
6571 gfc_simplify_ucobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6573 return simplify_cobound (array
, dim
, kind
, 1);
6578 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
6580 gfc_expr
*result
, *e
;
6581 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
6583 if (!is_constant_array_expr (vector
)
6584 || !is_constant_array_expr (mask
)
6585 || (!gfc_is_constant_expr (field
)
6586 && !is_constant_array_expr (field
)))
6589 result
= gfc_get_array_expr (vector
->ts
.type
, vector
->ts
.kind
,
6591 if (vector
->ts
.type
== BT_DERIVED
)
6592 result
->ts
.u
.derived
= vector
->ts
.u
.derived
;
6593 result
->rank
= mask
->rank
;
6594 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
6596 if (vector
->ts
.type
== BT_CHARACTER
)
6597 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
6599 vector_ctor
= gfc_constructor_first (vector
->value
.constructor
);
6600 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
6602 = field
->expr_type
== EXPR_ARRAY
6603 ? gfc_constructor_first (field
->value
.constructor
)
6608 if (mask_ctor
->expr
->value
.logical
)
6610 gcc_assert (vector_ctor
);
6611 e
= gfc_copy_expr (vector_ctor
->expr
);
6612 vector_ctor
= gfc_constructor_next (vector_ctor
);
6614 else if (field
->expr_type
== EXPR_ARRAY
)
6615 e
= gfc_copy_expr (field_ctor
->expr
);
6617 e
= gfc_copy_expr (field
);
6619 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
6621 mask_ctor
= gfc_constructor_next (mask_ctor
);
6622 field_ctor
= gfc_constructor_next (field_ctor
);
6630 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
6634 size_t index
, len
, lenset
;
6636 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
6639 return &gfc_bad_expr
;
6641 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
6642 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
6645 if (b
!= NULL
&& b
->value
.logical
!= 0)
6650 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &s
->where
);
6652 len
= s
->value
.character
.length
;
6653 lenset
= set
->value
.character
.length
;
6657 mpz_set_ui (result
->value
.integer
, 0);
6665 mpz_set_ui (result
->value
.integer
, 1);
6669 index
= wide_strspn (s
->value
.character
.string
,
6670 set
->value
.character
.string
) + 1;
6679 mpz_set_ui (result
->value
.integer
, len
);
6682 for (index
= len
; index
> 0; index
--)
6684 for (i
= 0; i
< lenset
; i
++)
6686 if (s
->value
.character
.string
[index
- 1]
6687 == set
->value
.character
.string
[i
])
6695 mpz_set_ui (result
->value
.integer
, index
);
6701 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
6706 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6709 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
6714 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
6715 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
6716 return range_check (result
, "XOR");
6719 return gfc_get_logical_expr (kind
, &x
->where
,
6720 (x
->value
.logical
&& !y
->value
.logical
)
6721 || (!x
->value
.logical
&& y
->value
.logical
));
6729 /****************** Constant simplification *****************/
6731 /* Master function to convert one constant to another. While this is
6732 used as a simplification function, it requires the destination type
6733 and kind information which is supplied by a special case in
6737 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
6739 gfc_expr
*g
, *result
, *(*f
) (gfc_expr
*, int);
6754 f
= gfc_int2complex
;
6774 f
= gfc_real2complex
;
6785 f
= gfc_complex2int
;
6788 f
= gfc_complex2real
;
6791 f
= gfc_complex2complex
;
6817 f
= gfc_hollerith2int
;
6821 f
= gfc_hollerith2real
;
6825 f
= gfc_hollerith2complex
;
6829 f
= gfc_hollerith2character
;
6833 f
= gfc_hollerith2logical
;
6843 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
6848 switch (e
->expr_type
)
6851 result
= f (e
, kind
);
6853 return &gfc_bad_expr
;
6857 if (!gfc_is_constant_expr (e
))
6860 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
6861 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
6862 result
->rank
= e
->rank
;
6864 for (c
= gfc_constructor_first (e
->value
.constructor
);
6865 c
; c
= gfc_constructor_next (c
))
6868 if (c
->iterator
== NULL
)
6869 tmp
= f (c
->expr
, kind
);
6872 g
= gfc_convert_constant (c
->expr
, type
, kind
);
6873 if (g
== &gfc_bad_expr
)
6875 gfc_free_expr (result
);
6883 gfc_free_expr (result
);
6887 gfc_constructor_append_expr (&result
->value
.constructor
,
6901 /* Function for converting character constants. */
6903 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
6908 if (!gfc_is_constant_expr (e
))
6911 if (e
->expr_type
== EXPR_CONSTANT
)
6913 /* Simple case of a scalar. */
6914 result
= gfc_get_constant_expr (BT_CHARACTER
, kind
, &e
->where
);
6916 return &gfc_bad_expr
;
6918 result
->value
.character
.length
= e
->value
.character
.length
;
6919 result
->value
.character
.string
6920 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
6921 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
6922 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
6924 /* Check we only have values representable in the destination kind. */
6925 for (i
= 0; i
< result
->value
.character
.length
; i
++)
6926 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
6929 gfc_error ("Character '%s' in string at %L cannot be converted "
6930 "into character kind %d",
6931 gfc_print_wide_char (result
->value
.character
.string
[i
]),
6933 return &gfc_bad_expr
;
6938 else if (e
->expr_type
== EXPR_ARRAY
)
6940 /* For an array constructor, we convert each constructor element. */
6943 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
6944 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
6945 result
->rank
= e
->rank
;
6946 result
->ts
.u
.cl
= e
->ts
.u
.cl
;
6948 for (c
= gfc_constructor_first (e
->value
.constructor
);
6949 c
; c
= gfc_constructor_next (c
))
6951 gfc_expr
*tmp
= gfc_convert_char_constant (c
->expr
, type
, kind
);
6952 if (tmp
== &gfc_bad_expr
)
6954 gfc_free_expr (result
);
6955 return &gfc_bad_expr
;
6960 gfc_free_expr (result
);
6964 gfc_constructor_append_expr (&result
->value
.constructor
,
6976 gfc_simplify_compiler_options (void)
6981 str
= gfc_get_option_string ();
6982 result
= gfc_get_character_expr (gfc_default_character_kind
,
6983 &gfc_current_locus
, str
, strlen (str
));
6990 gfc_simplify_compiler_version (void)
6995 len
= strlen ("GCC version ") + strlen (version_string
);
6996 buffer
= XALLOCAVEC (char, len
+ 1);
6997 snprintf (buffer
, len
+ 1, "GCC version %s", version_string
);
6998 return gfc_get_character_expr (gfc_default_character_kind
,
6999 &gfc_current_locus
, buffer
, len
);