1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
3 Contributed by Andy Vaught & Katherine Holcomb
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
24 #include "tm.h" /* For BITS_PER_UNIT. */
27 #include "intrinsic.h"
28 #include "target-memory.h"
29 #include "constructor.h"
30 #include "version.h" /* For version_string. */
33 gfc_expr gfc_bad_expr
;
35 static gfc_expr
*simplify_size (gfc_expr
*, gfc_expr
*, int);
38 /* Note that 'simplification' is not just transforming expressions.
39 For functions that are not simplified at compile time, range
40 checking is done if possible.
42 The return convention is that each simplification function returns:
44 A new expression node corresponding to the simplified arguments.
45 The original arguments are destroyed by the caller, and must not
46 be a part of the new expression.
48 NULL pointer indicating that no simplification was possible and
49 the original expression should remain intact.
51 An expression pointer to gfc_bad_expr (a static placeholder)
52 indicating that some error has prevented simplification. The
53 error is generated within the function and should be propagated
56 By the time a simplification function gets control, it has been
57 decided that the function call is really supposed to be the
58 intrinsic. No type checking is strictly necessary, since only
59 valid types will be passed on. On the other hand, a simplification
60 subroutine may have to look at the type of an argument as part of
63 Array arguments are only passed to these subroutines that implement
64 the simplification of transformational intrinsics.
66 The functions in this file don't have much comment with them, but
67 everything is reasonably straight-forward. The Standard, chapter 13
68 is the best comment you'll find for this file anyway. */
70 /* Range checks an expression node. If all goes well, returns the
71 node, otherwise returns &gfc_bad_expr and frees the node. */
74 range_check (gfc_expr
*result
, const char *name
)
79 if (result
->expr_type
!= EXPR_CONSTANT
)
82 switch (gfc_range_check (result
))
88 gfc_error ("Result of %s overflows its kind at %L", name
,
93 gfc_error ("Result of %s underflows its kind at %L", name
,
98 gfc_error ("Result of %s is NaN at %L", name
, &result
->where
);
102 gfc_error ("Result of %s gives range error for its kind at %L", name
,
107 gfc_free_expr (result
);
108 return &gfc_bad_expr
;
112 /* A helper function that gets an optional and possibly missing
113 kind parameter. Returns the kind, -1 if something went wrong. */
116 get_kind (bt type
, gfc_expr
*k
, const char *name
, int default_kind
)
123 if (k
->expr_type
!= EXPR_CONSTANT
)
125 gfc_error ("KIND parameter of %s at %L must be an initialization "
126 "expression", name
, &k
->where
);
130 if (gfc_extract_int (k
, &kind
)
131 || gfc_validate_kind (type
, kind
, true) < 0)
133 gfc_error ("Invalid KIND parameter of %s at %L", name
, &k
->where
);
141 /* Converts an mpz_t signed variable into an unsigned one, assuming
142 two's complement representations and a binary width of bitsize.
143 The conversion is a no-op unless x is negative; otherwise, it can
144 be accomplished by masking out the high bits. */
147 convert_mpz_to_unsigned (mpz_t x
, int bitsize
)
153 /* Confirm that no bits above the signed range are unset if we
154 are doing range checking. */
155 if (flag_range_check
!= 0)
156 gcc_assert (mpz_scan0 (x
, bitsize
-1) == ULONG_MAX
);
158 mpz_init_set_ui (mask
, 1);
159 mpz_mul_2exp (mask
, mask
, bitsize
);
160 mpz_sub_ui (mask
, mask
, 1);
162 mpz_and (x
, x
, mask
);
168 /* Confirm that no bits above the signed range are set. */
169 gcc_assert (mpz_scan1 (x
, bitsize
-1) == ULONG_MAX
);
174 /* Converts an mpz_t unsigned variable into a signed one, assuming
175 two's complement representations and a binary width of bitsize.
176 If the bitsize-1 bit is set, this is taken as a sign bit and
177 the number is converted to the corresponding negative number. */
180 gfc_convert_mpz_to_signed (mpz_t x
, int bitsize
)
184 /* Confirm that no bits above the unsigned range are set if we are
185 doing range checking. */
186 if (flag_range_check
!= 0)
187 gcc_assert (mpz_scan1 (x
, bitsize
) == ULONG_MAX
);
189 if (mpz_tstbit (x
, bitsize
- 1) == 1)
191 mpz_init_set_ui (mask
, 1);
192 mpz_mul_2exp (mask
, mask
, bitsize
);
193 mpz_sub_ui (mask
, mask
, 1);
195 /* We negate the number by hand, zeroing the high bits, that is
196 make it the corresponding positive number, and then have it
197 negated by GMP, giving the correct representation of the
200 mpz_add_ui (x
, x
, 1);
201 mpz_and (x
, x
, mask
);
210 /* In-place convert BOZ to REAL of the specified kind. */
213 convert_boz (gfc_expr
*x
, int kind
)
215 if (x
&& x
->ts
.type
== BT_INTEGER
&& x
->is_boz
)
222 if (!gfc_convert_boz (x
, &ts
))
223 return &gfc_bad_expr
;
230 /* Test that the expression is an constant array. */
233 is_constant_array_expr (gfc_expr
*e
)
240 if (e
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (e
))
243 for (c
= gfc_constructor_first (e
->value
.constructor
);
244 c
; c
= gfc_constructor_next (c
))
245 if (c
->expr
->expr_type
!= EXPR_CONSTANT
246 && c
->expr
->expr_type
!= EXPR_STRUCTURE
)
253 /* Initialize a transformational result expression with a given value. */
256 init_result_expr (gfc_expr
*e
, int init
, gfc_expr
*array
)
258 if (e
&& e
->expr_type
== EXPR_ARRAY
)
260 gfc_constructor
*ctor
= gfc_constructor_first (e
->value
.constructor
);
263 init_result_expr (ctor
->expr
, init
, array
);
264 ctor
= gfc_constructor_next (ctor
);
267 else if (e
&& e
->expr_type
== EXPR_CONSTANT
)
269 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
276 e
->value
.logical
= (init
? 1 : 0);
281 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].min_int
);
282 else if (init
== INT_MAX
)
283 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].huge
);
285 mpz_set_si (e
->value
.integer
, init
);
291 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
292 mpfr_neg (e
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
294 else if (init
== INT_MAX
)
295 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
297 mpfr_set_si (e
->value
.real
, init
, GFC_RND_MODE
);
301 mpc_set_si (e
->value
.complex, init
, GFC_MPC_RND_MODE
);
307 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
308 gfc_extract_int (len
, &length
);
309 string
= gfc_get_wide_string (length
+ 1);
310 gfc_wide_memset (string
, 0, length
);
312 else if (init
== INT_MAX
)
314 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
315 gfc_extract_int (len
, &length
);
316 string
= gfc_get_wide_string (length
+ 1);
317 gfc_wide_memset (string
, 255, length
);
322 string
= gfc_get_wide_string (1);
325 string
[length
] = '\0';
326 e
->value
.character
.length
= length
;
327 e
->value
.character
.string
= string
;
339 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
340 if conj_a is true, the matrix_a is complex conjugated. */
343 compute_dot_product (gfc_expr
*matrix_a
, int stride_a
, int offset_a
,
344 gfc_expr
*matrix_b
, int stride_b
, int offset_b
,
347 gfc_expr
*result
, *a
, *b
, *c
;
349 result
= gfc_get_constant_expr (matrix_a
->ts
.type
, matrix_a
->ts
.kind
,
351 init_result_expr (result
, 0, NULL
);
353 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
354 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
357 /* Copying of expressions is required as operands are free'd
358 by the gfc_arith routines. */
359 switch (result
->ts
.type
)
362 result
= gfc_or (result
,
363 gfc_and (gfc_copy_expr (a
),
370 if (conj_a
&& a
->ts
.type
== BT_COMPLEX
)
371 c
= gfc_simplify_conjg (a
);
373 c
= gfc_copy_expr (a
);
374 result
= gfc_add (result
, gfc_multiply (c
, gfc_copy_expr (b
)));
381 offset_a
+= stride_a
;
382 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
384 offset_b
+= stride_b
;
385 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
392 /* Build a result expression for transformational intrinsics,
396 transformational_result (gfc_expr
*array
, gfc_expr
*dim
, bt type
,
397 int kind
, locus
* where
)
402 if (!dim
|| array
->rank
== 1)
403 return gfc_get_constant_expr (type
, kind
, where
);
405 result
= gfc_get_array_expr (type
, kind
, where
);
406 result
->shape
= gfc_copy_shape_excluding (array
->shape
, array
->rank
, dim
);
407 result
->rank
= array
->rank
- 1;
409 /* gfc_array_size() would count the number of elements in the constructor,
410 we have not built those yet. */
412 for (i
= 0; i
< result
->rank
; ++i
)
413 nelem
*= mpz_get_ui (result
->shape
[i
]);
415 for (i
= 0; i
< nelem
; ++i
)
417 gfc_constructor_append_expr (&result
->value
.constructor
,
418 gfc_get_constant_expr (type
, kind
, where
),
426 typedef gfc_expr
* (*transformational_op
)(gfc_expr
*, gfc_expr
*);
428 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
429 of COUNT intrinsic is .TRUE..
431 Interface and implementation mimics arith functions as
432 gfc_add, gfc_multiply, etc. */
434 static gfc_expr
* gfc_count (gfc_expr
*op1
, gfc_expr
*op2
)
438 gcc_assert (op1
->ts
.type
== BT_INTEGER
);
439 gcc_assert (op2
->ts
.type
== BT_LOGICAL
);
440 gcc_assert (op2
->value
.logical
);
442 result
= gfc_copy_expr (op1
);
443 mpz_add_ui (result
->value
.integer
, result
->value
.integer
, 1);
451 /* Transforms an ARRAY with operation OP, according to MASK, to a
452 scalar RESULT. E.g. called if
454 REAL, PARAMETER :: array(n, m) = ...
455 REAL, PARAMETER :: s = SUM(array)
457 where OP == gfc_add(). */
460 simplify_transformation_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
461 transformational_op op
)
464 gfc_constructor
*array_ctor
, *mask_ctor
;
466 /* Shortcut for constant .FALSE. MASK. */
468 && mask
->expr_type
== EXPR_CONSTANT
469 && !mask
->value
.logical
)
472 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
474 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
475 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
479 a
= array_ctor
->expr
;
480 array_ctor
= gfc_constructor_next (array_ctor
);
482 /* A constant MASK equals .TRUE. here and can be ignored. */
486 mask_ctor
= gfc_constructor_next (mask_ctor
);
487 if (!m
->value
.logical
)
491 result
= op (result
, gfc_copy_expr (a
));
499 /* Transforms an ARRAY with operation OP, according to MASK, to an
500 array RESULT. E.g. called if
502 REAL, PARAMETER :: array(n, m) = ...
503 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
505 where OP == gfc_multiply().
506 The result might be post processed using post_op. */
509 simplify_transformation_to_array (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*dim
,
510 gfc_expr
*mask
, transformational_op op
,
511 transformational_op post_op
)
514 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
515 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
516 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
518 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
519 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
520 tmpstride
[GFC_MAX_DIMENSIONS
];
522 /* Shortcut for constant .FALSE. MASK. */
524 && mask
->expr_type
== EXPR_CONSTANT
525 && !mask
->value
.logical
)
528 /* Build an indexed table for array element expressions to minimize
529 linked-list traversal. Masked elements are set to NULL. */
530 gfc_array_size (array
, &size
);
531 arraysize
= mpz_get_ui (size
);
534 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
536 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
538 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
539 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
541 for (i
= 0; i
< arraysize
; ++i
)
543 arrayvec
[i
] = array_ctor
->expr
;
544 array_ctor
= gfc_constructor_next (array_ctor
);
548 if (!mask_ctor
->expr
->value
.logical
)
551 mask_ctor
= gfc_constructor_next (mask_ctor
);
555 /* Same for the result expression. */
556 gfc_array_size (result
, &size
);
557 resultsize
= mpz_get_ui (size
);
560 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
561 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
562 for (i
= 0; i
< resultsize
; ++i
)
564 resultvec
[i
] = result_ctor
->expr
;
565 result_ctor
= gfc_constructor_next (result_ctor
);
568 gfc_extract_int (dim
, &dim_index
);
569 dim_index
-= 1; /* zero-base index */
573 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
576 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
579 dim_extent
= mpz_get_si (array
->shape
[i
]);
580 dim_stride
= tmpstride
[i
];
584 extent
[n
] = mpz_get_si (array
->shape
[i
]);
585 sstride
[n
] = tmpstride
[i
];
586 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
595 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
597 *dest
= op (*dest
, gfc_copy_expr (*src
));
604 while (!done
&& count
[n
] == extent
[n
])
607 base
-= sstride
[n
] * extent
[n
];
608 dest
-= dstride
[n
] * extent
[n
];
611 if (n
< result
->rank
)
613 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
614 times, we'd warn for the last iteration, because the
615 array index will have already been incremented to the
616 array sizes, and we can't tell that this must make
617 the test against result->rank false, because ranks
618 must not exceed GFC_MAX_DIMENSIONS. */
619 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray
-bounds
)
630 /* Place updated expression in result constructor. */
631 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
632 for (i
= 0; i
< resultsize
; ++i
)
635 result_ctor
->expr
= post_op (result_ctor
->expr
, resultvec
[i
]);
637 result_ctor
->expr
= resultvec
[i
];
638 result_ctor
= gfc_constructor_next (result_ctor
);
648 simplify_transformation (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
649 int init_val
, transformational_op op
)
653 if (!is_constant_array_expr (array
)
654 || !gfc_is_constant_expr (dim
))
658 && !is_constant_array_expr (mask
)
659 && mask
->expr_type
!= EXPR_CONSTANT
)
662 result
= transformational_result (array
, dim
, array
->ts
.type
,
663 array
->ts
.kind
, &array
->where
);
664 init_result_expr (result
, init_val
, NULL
);
666 return !dim
|| array
->rank
== 1 ?
667 simplify_transformation_to_scalar (result
, array
, mask
, op
) :
668 simplify_transformation_to_array (result
, array
, dim
, mask
, op
, NULL
);
672 /********************** Simplification functions *****************************/
675 gfc_simplify_abs (gfc_expr
*e
)
679 if (e
->expr_type
!= EXPR_CONSTANT
)
685 result
= gfc_get_constant_expr (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
686 mpz_abs (result
->value
.integer
, e
->value
.integer
);
687 return range_check (result
, "IABS");
690 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
691 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
692 return range_check (result
, "ABS");
695 gfc_set_model_kind (e
->ts
.kind
);
696 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
697 mpc_abs (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
698 return range_check (result
, "CABS");
701 gfc_internal_error ("gfc_simplify_abs(): Bad type");
707 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
711 bool too_large
= false;
713 if (e
->expr_type
!= EXPR_CONSTANT
)
716 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
718 return &gfc_bad_expr
;
720 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
722 gfc_error ("Argument of %s function at %L is negative", name
,
724 return &gfc_bad_expr
;
727 if (ascii
&& warn_surprising
&& mpz_cmp_si (e
->value
.integer
, 127) > 0)
728 gfc_warning (OPT_Wsurprising
,
729 "Argument of %s function at %L outside of range [0,127]",
732 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
737 mpz_init_set_ui (t
, 2);
738 mpz_pow_ui (t
, t
, 32);
739 mpz_sub_ui (t
, t
, 1);
740 if (mpz_cmp (e
->value
.integer
, t
) > 0)
747 gfc_error ("Argument of %s function at %L is too large for the "
748 "collating sequence of kind %d", name
, &e
->where
, kind
);
749 return &gfc_bad_expr
;
752 result
= gfc_get_character_expr (kind
, &e
->where
, NULL
, 1);
753 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
760 /* We use the processor's collating sequence, because all
761 systems that gfortran currently works on are ASCII. */
764 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
766 return simplify_achar_char (e
, k
, "ACHAR", true);
771 gfc_simplify_acos (gfc_expr
*x
)
775 if (x
->expr_type
!= EXPR_CONSTANT
)
781 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
782 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
784 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
786 return &gfc_bad_expr
;
788 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
789 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
793 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
794 mpc_acos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
798 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
801 return range_check (result
, "ACOS");
805 gfc_simplify_acosh (gfc_expr
*x
)
809 if (x
->expr_type
!= EXPR_CONSTANT
)
815 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
817 gfc_error ("Argument of ACOSH at %L must not be less than 1",
819 return &gfc_bad_expr
;
822 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
823 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
827 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
828 mpc_acosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
832 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
835 return range_check (result
, "ACOSH");
839 gfc_simplify_adjustl (gfc_expr
*e
)
845 if (e
->expr_type
!= EXPR_CONSTANT
)
848 len
= e
->value
.character
.length
;
850 for (count
= 0, i
= 0; i
< len
; ++i
)
852 ch
= e
->value
.character
.string
[i
];
858 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
859 for (i
= 0; i
< len
- count
; ++i
)
860 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
867 gfc_simplify_adjustr (gfc_expr
*e
)
873 if (e
->expr_type
!= EXPR_CONSTANT
)
876 len
= e
->value
.character
.length
;
878 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
880 ch
= e
->value
.character
.string
[i
];
886 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
887 for (i
= 0; i
< count
; ++i
)
888 result
->value
.character
.string
[i
] = ' ';
890 for (i
= count
; i
< len
; ++i
)
891 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
898 gfc_simplify_aimag (gfc_expr
*e
)
902 if (e
->expr_type
!= EXPR_CONSTANT
)
905 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
906 mpfr_set (result
->value
.real
, mpc_imagref (e
->value
.complex), GFC_RND_MODE
);
908 return range_check (result
, "AIMAG");
913 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
915 gfc_expr
*rtrunc
, *result
;
918 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
920 return &gfc_bad_expr
;
922 if (e
->expr_type
!= EXPR_CONSTANT
)
925 rtrunc
= gfc_copy_expr (e
);
926 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
928 result
= gfc_real2real (rtrunc
, kind
);
930 gfc_free_expr (rtrunc
);
932 return range_check (result
, "AINT");
937 gfc_simplify_all (gfc_expr
*mask
, gfc_expr
*dim
)
939 return simplify_transformation (mask
, dim
, NULL
, true, gfc_and
);
944 gfc_simplify_dint (gfc_expr
*e
)
946 gfc_expr
*rtrunc
, *result
;
948 if (e
->expr_type
!= EXPR_CONSTANT
)
951 rtrunc
= gfc_copy_expr (e
);
952 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
954 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
956 gfc_free_expr (rtrunc
);
958 return range_check (result
, "DINT");
963 gfc_simplify_dreal (gfc_expr
*e
)
965 gfc_expr
*result
= NULL
;
967 if (e
->expr_type
!= EXPR_CONSTANT
)
970 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
971 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
973 return range_check (result
, "DREAL");
978 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
983 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
985 return &gfc_bad_expr
;
987 if (e
->expr_type
!= EXPR_CONSTANT
)
990 result
= gfc_get_constant_expr (e
->ts
.type
, kind
, &e
->where
);
991 mpfr_round (result
->value
.real
, e
->value
.real
);
993 return range_check (result
, "ANINT");
998 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
1003 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1006 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1011 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
1012 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1013 return range_check (result
, "AND");
1016 return gfc_get_logical_expr (kind
, &x
->where
,
1017 x
->value
.logical
&& y
->value
.logical
);
1026 gfc_simplify_any (gfc_expr
*mask
, gfc_expr
*dim
)
1028 return simplify_transformation (mask
, dim
, NULL
, false, gfc_or
);
1033 gfc_simplify_dnint (gfc_expr
*e
)
1037 if (e
->expr_type
!= EXPR_CONSTANT
)
1040 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &e
->where
);
1041 mpfr_round (result
->value
.real
, e
->value
.real
);
1043 return range_check (result
, "DNINT");
1048 gfc_simplify_asin (gfc_expr
*x
)
1052 if (x
->expr_type
!= EXPR_CONSTANT
)
1058 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1059 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1061 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1063 return &gfc_bad_expr
;
1065 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1066 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1070 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1071 mpc_asin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1075 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1078 return range_check (result
, "ASIN");
1083 gfc_simplify_asinh (gfc_expr
*x
)
1087 if (x
->expr_type
!= EXPR_CONSTANT
)
1090 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1095 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1099 mpc_asinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1103 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1106 return range_check (result
, "ASINH");
1111 gfc_simplify_atan (gfc_expr
*x
)
1115 if (x
->expr_type
!= EXPR_CONSTANT
)
1118 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1123 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1127 mpc_atan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1131 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1134 return range_check (result
, "ATAN");
1139 gfc_simplify_atanh (gfc_expr
*x
)
1143 if (x
->expr_type
!= EXPR_CONSTANT
)
1149 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
1150 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
1152 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1154 return &gfc_bad_expr
;
1156 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1157 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1161 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1162 mpc_atanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1166 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1169 return range_check (result
, "ATANH");
1174 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
1178 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1181 if (mpfr_zero_p (y
->value
.real
) && mpfr_zero_p (x
->value
.real
))
1183 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1184 "second argument must not be zero", &x
->where
);
1185 return &gfc_bad_expr
;
1188 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1189 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1191 return range_check (result
, "ATAN2");
1196 gfc_simplify_bessel_j0 (gfc_expr
*x
)
1200 if (x
->expr_type
!= EXPR_CONSTANT
)
1203 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1204 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1206 return range_check (result
, "BESSEL_J0");
1211 gfc_simplify_bessel_j1 (gfc_expr
*x
)
1215 if (x
->expr_type
!= EXPR_CONSTANT
)
1218 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1219 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1221 return range_check (result
, "BESSEL_J1");
1226 gfc_simplify_bessel_jn (gfc_expr
*order
, gfc_expr
*x
)
1231 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1234 n
= mpz_get_si (order
->value
.integer
);
1235 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1236 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1238 return range_check (result
, "BESSEL_JN");
1242 /* Simplify transformational form of JN and YN. */
1245 gfc_simplify_bessel_n2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
,
1252 mpfr_t x2rev
, last1
, last2
;
1254 if (x
->expr_type
!= EXPR_CONSTANT
|| order1
->expr_type
!= EXPR_CONSTANT
1255 || order2
->expr_type
!= EXPR_CONSTANT
)
1258 n1
= mpz_get_si (order1
->value
.integer
);
1259 n2
= mpz_get_si (order2
->value
.integer
);
1260 result
= gfc_get_array_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1262 result
->shape
= gfc_get_shape (1);
1263 mpz_init_set_ui (result
->shape
[0], MAX (n2
-n1
+1, 0));
1268 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1269 YN(N, 0.0) = -Inf. */
1271 if (mpfr_cmp_ui (x
->value
.real
, 0.0) == 0)
1273 if (!jn
&& flag_range_check
)
1275 gfc_error ("Result of BESSEL_YN is -INF at %L", &result
->where
);
1276 gfc_free_expr (result
);
1277 return &gfc_bad_expr
;
1282 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1283 mpfr_set_ui (e
->value
.real
, 1, GFC_RND_MODE
);
1284 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1289 for (i
= n1
; i
<= n2
; i
++)
1291 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1293 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
1295 mpfr_set_inf (e
->value
.real
, -1);
1296 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1303 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1304 are stable for downward recursion and Neumann functions are stable
1305 for upward recursion. It is
1307 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1308 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1309 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1311 gfc_set_model_kind (x
->ts
.kind
);
1313 /* Get first recursion anchor. */
1317 mpfr_jn (last1
, n2
, x
->value
.real
, GFC_RND_MODE
);
1319 mpfr_yn (last1
, n1
, x
->value
.real
, GFC_RND_MODE
);
1321 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1322 mpfr_set (e
->value
.real
, last1
, GFC_RND_MODE
);
1323 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1327 gfc_free_expr (result
);
1328 return &gfc_bad_expr
;
1330 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1338 /* Get second recursion anchor. */
1342 mpfr_jn (last2
, n2
-1, x
->value
.real
, GFC_RND_MODE
);
1344 mpfr_yn (last2
, n1
+1, x
->value
.real
, GFC_RND_MODE
);
1346 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1347 mpfr_set (e
->value
.real
, last2
, GFC_RND_MODE
);
1348 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1353 gfc_free_expr (result
);
1354 return &gfc_bad_expr
;
1357 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
, -2);
1359 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1368 /* Start actual recursion. */
1371 mpfr_ui_div (x2rev
, 2, x
->value
.real
, GFC_RND_MODE
);
1373 for (i
= 2; i
<= n2
-n1
; i
++)
1375 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1377 /* Special case: For YN, if the previous N gave -INF, set
1378 also N+1 to -INF. */
1379 if (!jn
&& !flag_range_check
&& mpfr_inf_p (last2
))
1381 mpfr_set_inf (e
->value
.real
, -1);
1382 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1387 mpfr_mul_si (e
->value
.real
, x2rev
, jn
? (n2
-i
+1) : (n1
+i
-1),
1389 mpfr_mul (e
->value
.real
, e
->value
.real
, last2
, GFC_RND_MODE
);
1390 mpfr_sub (e
->value
.real
, e
->value
.real
, last1
, GFC_RND_MODE
);
1392 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1394 /* Range_check frees "e" in that case. */
1400 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
,
1403 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1405 mpfr_set (last1
, last2
, GFC_RND_MODE
);
1406 mpfr_set (last2
, e
->value
.real
, GFC_RND_MODE
);
1419 gfc_free_expr (result
);
1420 return &gfc_bad_expr
;
1425 gfc_simplify_bessel_jn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1427 return gfc_simplify_bessel_n2 (order1
, order2
, x
, true);
1432 gfc_simplify_bessel_y0 (gfc_expr
*x
)
1436 if (x
->expr_type
!= EXPR_CONSTANT
)
1439 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1440 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1442 return range_check (result
, "BESSEL_Y0");
1447 gfc_simplify_bessel_y1 (gfc_expr
*x
)
1451 if (x
->expr_type
!= EXPR_CONSTANT
)
1454 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1455 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1457 return range_check (result
, "BESSEL_Y1");
1462 gfc_simplify_bessel_yn (gfc_expr
*order
, gfc_expr
*x
)
1467 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1470 n
= mpz_get_si (order
->value
.integer
);
1471 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1472 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1474 return range_check (result
, "BESSEL_YN");
1479 gfc_simplify_bessel_yn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1481 return gfc_simplify_bessel_n2 (order1
, order2
, x
, false);
1486 gfc_simplify_bit_size (gfc_expr
*e
)
1488 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1489 return gfc_get_int_expr (e
->ts
.kind
, &e
->where
,
1490 gfc_integer_kinds
[i
].bit_size
);
1495 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
1499 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
1502 if (gfc_extract_int (bit
, &b
) || b
< 0)
1503 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
, false);
1505 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
,
1506 mpz_tstbit (e
->value
.integer
, b
));
1511 compare_bitwise (gfc_expr
*i
, gfc_expr
*j
)
1516 gcc_assert (i
->ts
.type
== BT_INTEGER
);
1517 gcc_assert (j
->ts
.type
== BT_INTEGER
);
1519 mpz_init_set (x
, i
->value
.integer
);
1520 k
= gfc_validate_kind (i
->ts
.type
, i
->ts
.kind
, false);
1521 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
1523 mpz_init_set (y
, j
->value
.integer
);
1524 k
= gfc_validate_kind (j
->ts
.type
, j
->ts
.kind
, false);
1525 convert_mpz_to_unsigned (y
, gfc_integer_kinds
[k
].bit_size
);
1527 res
= mpz_cmp (x
, y
);
1535 gfc_simplify_bge (gfc_expr
*i
, gfc_expr
*j
)
1537 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1540 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1541 compare_bitwise (i
, j
) >= 0);
1546 gfc_simplify_bgt (gfc_expr
*i
, gfc_expr
*j
)
1548 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1551 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1552 compare_bitwise (i
, j
) > 0);
1557 gfc_simplify_ble (gfc_expr
*i
, gfc_expr
*j
)
1559 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1562 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1563 compare_bitwise (i
, j
) <= 0);
1568 gfc_simplify_blt (gfc_expr
*i
, gfc_expr
*j
)
1570 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1573 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1574 compare_bitwise (i
, j
) < 0);
1579 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
1581 gfc_expr
*ceil
, *result
;
1584 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
1586 return &gfc_bad_expr
;
1588 if (e
->expr_type
!= EXPR_CONSTANT
)
1591 ceil
= gfc_copy_expr (e
);
1592 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
1594 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
1595 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
, &e
->where
);
1597 gfc_free_expr (ceil
);
1599 return range_check (result
, "CEILING");
1604 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
1606 return simplify_achar_char (e
, k
, "CHAR", false);
1610 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1613 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
1617 if (convert_boz (x
, kind
) == &gfc_bad_expr
)
1618 return &gfc_bad_expr
;
1620 if (convert_boz (y
, kind
) == &gfc_bad_expr
)
1621 return &gfc_bad_expr
;
1623 if (x
->expr_type
!= EXPR_CONSTANT
1624 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1627 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &x
->where
);
1632 mpc_set_z (result
->value
.complex, x
->value
.integer
, GFC_MPC_RND_MODE
);
1636 mpc_set_fr (result
->value
.complex, x
->value
.real
, GFC_RND_MODE
);
1640 mpc_set (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1644 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1648 return range_check (result
, name
);
1653 mpfr_set_z (mpc_imagref (result
->value
.complex),
1654 y
->value
.integer
, GFC_RND_MODE
);
1658 mpfr_set (mpc_imagref (result
->value
.complex),
1659 y
->value
.real
, GFC_RND_MODE
);
1663 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1666 return range_check (result
, name
);
1671 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
1675 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_complex_kind
);
1677 return &gfc_bad_expr
;
1679 return simplify_cmplx ("CMPLX", x
, y
, kind
);
1684 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
1688 if (x
->ts
.type
== BT_INTEGER
&& y
->ts
.type
== BT_INTEGER
)
1689 kind
= gfc_default_complex_kind
;
1690 else if (x
->ts
.type
== BT_REAL
|| y
->ts
.type
== BT_INTEGER
)
1692 else if (x
->ts
.type
== BT_INTEGER
|| y
->ts
.type
== BT_REAL
)
1694 else if (x
->ts
.type
== BT_REAL
&& y
->ts
.type
== BT_REAL
)
1695 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
1699 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
1704 gfc_simplify_conjg (gfc_expr
*e
)
1708 if (e
->expr_type
!= EXPR_CONSTANT
)
1711 result
= gfc_copy_expr (e
);
1712 mpc_conj (result
->value
.complex, result
->value
.complex, GFC_MPC_RND_MODE
);
1714 return range_check (result
, "CONJG");
1717 /* Return the simplification of the constant expression in icall, or NULL
1718 if the expression is not constant. */
1721 simplify_trig_call (gfc_expr
*icall
)
1723 gfc_isym_id func
= icall
->value
.function
.isym
->id
;
1724 gfc_expr
*x
= icall
->value
.function
.actual
->expr
;
1726 /* The actual simplifiers will return NULL for non-constant x. */
1730 return gfc_simplify_acos (x
);
1732 return gfc_simplify_asin (x
);
1734 return gfc_simplify_atan (x
);
1736 return gfc_simplify_cos (x
);
1737 case GFC_ISYM_COTAN
:
1738 return gfc_simplify_cotan (x
);
1740 return gfc_simplify_sin (x
);
1742 return gfc_simplify_tan (x
);
1744 gfc_internal_error ("in simplify_trig_call(): Bad intrinsic");
1748 /* Convert a floating-point number from radians to degrees. */
1751 degrees_f (mpfr_t x
, mp_rnd_t rnd_mode
)
1756 /* Set x = x % 2pi to avoid offsets with large angles. */
1757 mpfr_const_pi (tmp
, rnd_mode
);
1758 mpfr_mul_ui (tmp
, tmp
, 2, rnd_mode
);
1759 mpfr_fmod (tmp
, x
, tmp
, rnd_mode
);
1761 /* Set x = x * 180. */
1762 mpfr_mul_ui (x
, x
, 180, rnd_mode
);
1764 /* Set x = x / pi. */
1765 mpfr_const_pi (tmp
, rnd_mode
);
1766 mpfr_div (x
, x
, tmp
, rnd_mode
);
1771 /* Convert a floating-point number from degrees to radians. */
1774 radians_f (mpfr_t x
, mp_rnd_t rnd_mode
)
1779 /* Set x = x % 360 to avoid offsets with large angles. */
1780 mpfr_set_ui (tmp
, 360, rnd_mode
);
1781 mpfr_fmod (tmp
, x
, tmp
, rnd_mode
);
1783 /* Set x = x * pi. */
1784 mpfr_const_pi (tmp
, rnd_mode
);
1785 mpfr_mul (x
, x
, tmp
, rnd_mode
);
1787 /* Set x = x / 180. */
1788 mpfr_div_ui (x
, x
, 180, rnd_mode
);
1794 /* Convert argument to radians before calling a trig function. */
1797 gfc_simplify_trigd (gfc_expr
*icall
)
1801 arg
= icall
->value
.function
.actual
->expr
;
1803 if (arg
->ts
.type
!= BT_REAL
)
1804 gfc_internal_error ("in gfc_simplify_trigd(): Bad type");
1806 if (arg
->expr_type
== EXPR_CONSTANT
)
1807 /* Convert constant to radians before passing off to simplifier. */
1808 radians_f (arg
->value
.real
, GFC_RND_MODE
);
1810 /* Let the usual simplifier take over - we just simplified the arg. */
1811 return simplify_trig_call (icall
);
1814 /* Convert result of an inverse trig function to degrees. */
1817 gfc_simplify_atrigd (gfc_expr
*icall
)
1821 if (icall
->value
.function
.actual
->expr
->ts
.type
!= BT_REAL
)
1822 gfc_internal_error ("in gfc_simplify_atrigd(): Bad type");
1824 /* See if another simplifier has work to do first. */
1825 result
= simplify_trig_call (icall
);
1827 if (result
&& result
->expr_type
== EXPR_CONSTANT
)
1829 /* Convert constant to degrees after passing off to actual simplifier. */
1830 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1834 /* Let gfc_resolve_atrigd take care of the non-constant case. */
1838 /* Convert the result of atan2 to degrees. */
1841 gfc_simplify_atan2d (gfc_expr
*y
, gfc_expr
*x
)
1845 if (x
->ts
.type
!= BT_REAL
|| y
->ts
.type
!= BT_REAL
)
1846 gfc_internal_error ("in gfc_simplify_atan2d(): Bad type");
1848 if (x
->expr_type
== EXPR_CONSTANT
&& y
->expr_type
== EXPR_CONSTANT
)
1850 result
= gfc_simplify_atan2 (y
, x
);
1853 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1858 /* Let gfc_resolve_atan2d take care of the non-constant case. */
1863 gfc_simplify_cos (gfc_expr
*x
)
1867 if (x
->expr_type
!= EXPR_CONSTANT
)
1870 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1875 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1879 gfc_set_model_kind (x
->ts
.kind
);
1880 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1884 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1887 return range_check (result
, "COS");
1892 gfc_simplify_cosh (gfc_expr
*x
)
1896 if (x
->expr_type
!= EXPR_CONSTANT
)
1899 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1904 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1908 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1915 return range_check (result
, "COSH");
1920 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
1924 if (!is_constant_array_expr (mask
)
1925 || !gfc_is_constant_expr (dim
)
1926 || !gfc_is_constant_expr (kind
))
1929 result
= transformational_result (mask
, dim
,
1931 get_kind (BT_INTEGER
, kind
, "COUNT",
1932 gfc_default_integer_kind
),
1935 init_result_expr (result
, 0, NULL
);
1937 /* Passing MASK twice, once as data array, once as mask.
1938 Whenever gfc_count is called, '1' is added to the result. */
1939 return !dim
|| mask
->rank
== 1 ?
1940 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
1941 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
, NULL
);
1946 gfc_simplify_cshift (gfc_expr
*array
, gfc_expr
*shift
, gfc_expr
*dim
)
1948 gfc_expr
*a
, *result
;
1951 /* DIM is only useful for rank > 1, but deal with it here as one can
1952 set DIM = 1 for rank = 1. */
1955 if (!gfc_is_constant_expr (dim
))
1957 dm
= mpz_get_si (dim
->value
.integer
);
1962 /* Copy array into 'a', simplify it, and then test for a constant array. */
1963 a
= gfc_copy_expr (array
);
1964 gfc_simplify_expr (a
, 0);
1965 if (!is_constant_array_expr (a
))
1973 gfc_constructor
*ca
, *cr
;
1977 if (!gfc_is_constant_expr (shift
))
1983 shft
= mpz_get_si (shift
->value
.integer
);
1985 /* Case (i): If ARRAY has rank one, element i of the result is
1986 ARRAY (1 + MODULO (i + SHIFT - 1, SIZE (ARRAY))). */
1989 gfc_array_size (a
, &size
);
1990 sz
= mpz_get_si (size
);
1993 /* Adjust shft to deal with right or left shifts. */
1994 shft
= shft
< 0 ? 1 - shft
: shft
;
1996 /* Special case: Shift to the original order! */
1997 if (sz
== 0 || shft
% sz
== 0)
2000 result
= gfc_copy_expr (a
);
2001 cr
= gfc_constructor_first (result
->value
.constructor
);
2002 for (i
= 0; i
< sz
; i
++, cr
= gfc_constructor_next (cr
))
2004 j
= (i
+ shft
) % sz
;
2005 ca
= gfc_constructor_first (a
->value
.constructor
);
2007 ca
= gfc_constructor_next (ca
);
2008 cr
->expr
= gfc_copy_expr (ca
->expr
);
2016 /* FIXME: Deal with rank > 1 arrays. For now, don't leak memory. */
2018 /* GCC bootstrap is too stupid to realize that the above code for dm
2019 is correct. First, dim can be specified for a rank 1 array. It is
2020 not needed in this nor used here. Second, the code is simply waiting
2021 for someone to implement rank > 1 simplification. For now, add a
2022 pessimization to the code that has a zero valid reason to be here. */
2023 if (dm
> array
->rank
)
2034 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
2036 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
2041 gfc_simplify_dble (gfc_expr
*e
)
2043 gfc_expr
*result
= NULL
;
2045 if (e
->expr_type
!= EXPR_CONSTANT
)
2048 if (convert_boz (e
, gfc_default_double_kind
) == &gfc_bad_expr
)
2049 return &gfc_bad_expr
;
2051 result
= gfc_convert_constant (e
, BT_REAL
, gfc_default_double_kind
);
2052 if (result
== &gfc_bad_expr
)
2053 return &gfc_bad_expr
;
2055 return range_check (result
, "DBLE");
2060 gfc_simplify_digits (gfc_expr
*x
)
2064 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2069 digits
= gfc_integer_kinds
[i
].digits
;
2074 digits
= gfc_real_kinds
[i
].digits
;
2081 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, digits
);
2086 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
2091 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2094 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
2095 result
= gfc_get_constant_expr (x
->ts
.type
, kind
, &x
->where
);
2100 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
2101 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2103 mpz_set_ui (result
->value
.integer
, 0);
2108 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
2109 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
2112 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2117 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2120 return range_check (result
, "DIM");
2125 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
2130 if (!is_constant_array_expr (vector_a
)
2131 || !is_constant_array_expr (vector_b
))
2134 gcc_assert (vector_a
->rank
== 1);
2135 gcc_assert (vector_b
->rank
== 1);
2137 temp
.expr_type
= EXPR_OP
;
2138 gfc_clear_ts (&temp
.ts
);
2139 temp
.value
.op
.op
= INTRINSIC_NONE
;
2140 temp
.value
.op
.op1
= vector_a
;
2141 temp
.value
.op
.op2
= vector_b
;
2142 gfc_type_convert_binary (&temp
, 1);
2144 return compute_dot_product (vector_a
, 1, 0, vector_b
, 1, 0, true);
2149 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
2151 gfc_expr
*a1
, *a2
, *result
;
2153 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2156 a1
= gfc_real2real (x
, gfc_default_double_kind
);
2157 a2
= gfc_real2real (y
, gfc_default_double_kind
);
2159 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &x
->where
);
2160 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
2165 return range_check (result
, "DPROD");
2170 simplify_dshift (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
,
2174 int i
, k
, size
, shift
;
2176 if (arg1
->expr_type
!= EXPR_CONSTANT
|| arg2
->expr_type
!= EXPR_CONSTANT
2177 || shiftarg
->expr_type
!= EXPR_CONSTANT
)
2180 k
= gfc_validate_kind (BT_INTEGER
, arg1
->ts
.kind
, false);
2181 size
= gfc_integer_kinds
[k
].bit_size
;
2183 gfc_extract_int (shiftarg
, &shift
);
2185 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2187 shift
= size
- shift
;
2189 result
= gfc_get_constant_expr (BT_INTEGER
, arg1
->ts
.kind
, &arg1
->where
);
2190 mpz_set_ui (result
->value
.integer
, 0);
2192 for (i
= 0; i
< shift
; i
++)
2193 if (mpz_tstbit (arg2
->value
.integer
, size
- shift
+ i
))
2194 mpz_setbit (result
->value
.integer
, i
);
2196 for (i
= 0; i
< size
- shift
; i
++)
2197 if (mpz_tstbit (arg1
->value
.integer
, i
))
2198 mpz_setbit (result
->value
.integer
, shift
+ i
);
2200 /* Convert to a signed value. */
2201 gfc_convert_mpz_to_signed (result
->value
.integer
, size
);
2208 gfc_simplify_dshiftr (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2210 return simplify_dshift (arg1
, arg2
, shiftarg
, true);
2215 gfc_simplify_dshiftl (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2217 return simplify_dshift (arg1
, arg2
, shiftarg
, false);
2222 gfc_simplify_erf (gfc_expr
*x
)
2226 if (x
->expr_type
!= EXPR_CONSTANT
)
2229 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2230 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2232 return range_check (result
, "ERF");
2237 gfc_simplify_erfc (gfc_expr
*x
)
2241 if (x
->expr_type
!= EXPR_CONSTANT
)
2244 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2245 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2247 return range_check (result
, "ERFC");
2251 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2253 #define MAX_ITER 200
2254 #define ARG_LIMIT 12
2256 /* Calculate ERFC_SCALED directly by its definition:
2258 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2260 using a large precision for intermediate results. This is used for all
2261 but large values of the argument. */
2263 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2268 prec
= mpfr_get_default_prec ();
2269 mpfr_set_default_prec (10 * prec
);
2274 mpfr_set (a
, arg
, GFC_RND_MODE
);
2275 mpfr_sqr (b
, a
, GFC_RND_MODE
);
2276 mpfr_exp (b
, b
, GFC_RND_MODE
);
2277 mpfr_erfc (a
, a
, GFC_RND_MODE
);
2278 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
2280 mpfr_set (res
, a
, GFC_RND_MODE
);
2281 mpfr_set_default_prec (prec
);
2287 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2289 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2290 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2293 This is used for large values of the argument. Intermediate calculations
2294 are performed with twice the precision. We don't do a fixed number of
2295 iterations of the sum, but stop when it has converged to the required
2298 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2300 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
2305 prec
= mpfr_get_default_prec ();
2306 mpfr_set_default_prec (2 * prec
);
2316 mpfr_init (sumtrunc
);
2317 mpfr_set_prec (oldsum
, prec
);
2318 mpfr_set_prec (sumtrunc
, prec
);
2320 mpfr_set (x
, arg
, GFC_RND_MODE
);
2321 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
2322 mpz_set_ui (num
, 1);
2324 mpfr_set (u
, x
, GFC_RND_MODE
);
2325 mpfr_sqr (u
, u
, GFC_RND_MODE
);
2326 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
2327 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
2329 for (i
= 1; i
< MAX_ITER
; i
++)
2331 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
2333 mpz_mul_ui (num
, num
, 2 * i
- 1);
2336 mpfr_set (w
, u
, GFC_RND_MODE
);
2337 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
2339 mpfr_set_z (v
, num
, GFC_RND_MODE
);
2340 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
2342 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
2344 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
2345 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
2349 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2351 gcc_assert (i
< MAX_ITER
);
2353 /* Divide by x * sqrt(Pi). */
2354 mpfr_const_pi (u
, GFC_RND_MODE
);
2355 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
2356 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
2357 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
2359 mpfr_set (res
, sum
, GFC_RND_MODE
);
2360 mpfr_set_default_prec (prec
);
2362 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
2368 gfc_simplify_erfc_scaled (gfc_expr
*x
)
2372 if (x
->expr_type
!= EXPR_CONSTANT
)
2375 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2376 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
2377 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
2379 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
2381 return range_check (result
, "ERFC_SCALED");
2389 gfc_simplify_epsilon (gfc_expr
*e
)
2394 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2396 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
2397 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
2399 return range_check (result
, "EPSILON");
2404 gfc_simplify_exp (gfc_expr
*x
)
2408 if (x
->expr_type
!= EXPR_CONSTANT
)
2411 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2416 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2420 gfc_set_model_kind (x
->ts
.kind
);
2421 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
2425 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2428 return range_check (result
, "EXP");
2433 gfc_simplify_exponent (gfc_expr
*x
)
2438 if (x
->expr_type
!= EXPR_CONSTANT
)
2441 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2444 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2445 if (mpfr_inf_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
2447 int i
= gfc_validate_kind (BT_INTEGER
, gfc_default_integer_kind
, false);
2448 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2452 /* EXPONENT(+/- 0.0) = 0 */
2453 if (mpfr_zero_p (x
->value
.real
))
2455 mpz_set_ui (result
->value
.integer
, 0);
2459 gfc_set_model (x
->value
.real
);
2461 val
= (long int) mpfr_get_exp (x
->value
.real
);
2462 mpz_set_si (result
->value
.integer
, val
);
2464 return range_check (result
, "EXPONENT");
2469 gfc_simplify_float (gfc_expr
*a
)
2473 if (a
->expr_type
!= EXPR_CONSTANT
)
2478 if (convert_boz (a
, gfc_default_real_kind
) == &gfc_bad_expr
)
2479 return &gfc_bad_expr
;
2481 result
= gfc_copy_expr (a
);
2484 result
= gfc_int2real (a
, gfc_default_real_kind
);
2486 return range_check (result
, "FLOAT");
2491 is_last_ref_vtab (gfc_expr
*e
)
2494 gfc_component
*comp
= NULL
;
2496 if (e
->expr_type
!= EXPR_VARIABLE
)
2499 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
2500 if (ref
->type
== REF_COMPONENT
)
2501 comp
= ref
->u
.c
.component
;
2503 if (!e
->ref
|| !comp
)
2504 return e
->symtree
->n
.sym
->attr
.vtab
;
2506 if (comp
->name
[0] == '_' && strcmp (comp
->name
, "_vptr") == 0)
2514 gfc_simplify_extends_type_of (gfc_expr
*a
, gfc_expr
*mold
)
2516 /* Avoid simplification of resolved symbols. */
2517 if (is_last_ref_vtab (a
) || is_last_ref_vtab (mold
))
2520 if (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_DERIVED
)
2521 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2522 gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2525 if (UNLIMITED_POLY (a
) || UNLIMITED_POLY (mold
))
2528 /* Return .false. if the dynamic type can never be an extension. */
2529 if ((a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_CLASS
2530 && !gfc_type_is_extension_of
2531 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2532 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2533 && !gfc_type_is_extension_of
2534 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2535 mold
->ts
.u
.derived
->components
->ts
.u
.derived
))
2536 || (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_CLASS
2537 && !gfc_type_is_extension_of
2538 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2540 || (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2541 && !gfc_type_is_extension_of
2542 (mold
->ts
.u
.derived
,
2543 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2544 && !gfc_type_is_extension_of
2545 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2546 mold
->ts
.u
.derived
)))
2547 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2549 /* Return .true. if the dynamic type is guaranteed to be an extension. */
2550 if (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2551 && gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2552 a
->ts
.u
.derived
->components
->ts
.u
.derived
))
2553 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, true);
2560 gfc_simplify_same_type_as (gfc_expr
*a
, gfc_expr
*b
)
2562 /* Avoid simplification of resolved symbols. */
2563 if (is_last_ref_vtab (a
) || is_last_ref_vtab (b
))
2566 /* Return .false. if the dynamic type can never be the
2568 if (((a
->ts
.type
== BT_CLASS
&& gfc_expr_attr (a
).class_ok
)
2569 || (b
->ts
.type
== BT_CLASS
&& gfc_expr_attr (b
).class_ok
))
2570 && !gfc_type_compatible (&a
->ts
, &b
->ts
)
2571 && !gfc_type_compatible (&b
->ts
, &a
->ts
))
2572 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2574 if (a
->ts
.type
!= BT_DERIVED
|| b
->ts
.type
!= BT_DERIVED
)
2577 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2578 gfc_compare_derived_types (a
->ts
.u
.derived
,
2584 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
2590 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
2592 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2594 if (e
->expr_type
!= EXPR_CONSTANT
)
2597 mpfr_init2 (floor
, mpfr_get_prec (e
->value
.real
));
2598 mpfr_floor (floor
, e
->value
.real
);
2600 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
2601 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
2605 return range_check (result
, "FLOOR");
2610 gfc_simplify_fraction (gfc_expr
*x
)
2614 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2615 mpfr_t absv
, exp
, pow2
;
2620 if (x
->expr_type
!= EXPR_CONSTANT
)
2623 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
2625 /* FRACTION(inf) = NaN. */
2626 if (mpfr_inf_p (x
->value
.real
))
2628 mpfr_set_nan (result
->value
.real
);
2632 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2634 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
2635 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
2637 if (mpfr_sgn (x
->value
.real
) == 0)
2639 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2643 gfc_set_model_kind (x
->ts
.kind
);
2648 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
2649 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
2651 mpfr_trunc (exp
, exp
);
2652 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
2654 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
2656 mpfr_div (result
->value
.real
, x
->value
.real
, pow2
, GFC_RND_MODE
);
2658 mpfr_clears (exp
, absv
, pow2
, NULL
);
2662 /* mpfr_frexp() correctly handles zeros and NaNs. */
2663 mpfr_frexp (&e
, result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2667 return range_check (result
, "FRACTION");
2672 gfc_simplify_gamma (gfc_expr
*x
)
2676 if (x
->expr_type
!= EXPR_CONSTANT
)
2679 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2680 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2682 return range_check (result
, "GAMMA");
2687 gfc_simplify_huge (gfc_expr
*e
)
2692 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2693 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2698 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2702 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
2714 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
2718 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2721 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2722 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
2723 return range_check (result
, "HYPOT");
2727 /* We use the processor's collating sequence, because all
2728 systems that gfortran currently works on are ASCII. */
2731 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
2737 if (e
->expr_type
!= EXPR_CONSTANT
)
2740 if (e
->value
.character
.length
!= 1)
2742 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
2743 return &gfc_bad_expr
;
2746 index
= e
->value
.character
.string
[0];
2748 if (warn_surprising
&& index
> 127)
2749 gfc_warning (OPT_Wsurprising
,
2750 "Argument of IACHAR function at %L outside of range 0..127",
2753 k
= get_kind (BT_INTEGER
, kind
, "IACHAR", gfc_default_integer_kind
);
2755 return &gfc_bad_expr
;
2757 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2759 return range_check (result
, "IACHAR");
2764 do_bit_and (gfc_expr
*result
, gfc_expr
*e
)
2766 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2767 gcc_assert (result
->ts
.type
== BT_INTEGER
2768 && result
->expr_type
== EXPR_CONSTANT
);
2770 mpz_and (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2776 gfc_simplify_iall (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2778 return simplify_transformation (array
, dim
, mask
, -1, do_bit_and
);
2783 do_bit_ior (gfc_expr
*result
, gfc_expr
*e
)
2785 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2786 gcc_assert (result
->ts
.type
== BT_INTEGER
2787 && result
->expr_type
== EXPR_CONSTANT
);
2789 mpz_ior (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2795 gfc_simplify_iany (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2797 return simplify_transformation (array
, dim
, mask
, 0, do_bit_ior
);
2802 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
2806 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2809 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2810 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2812 return range_check (result
, "IAND");
2817 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
2822 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2825 gfc_extract_int (y
, &pos
);
2827 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2829 result
= gfc_copy_expr (x
);
2831 convert_mpz_to_unsigned (result
->value
.integer
,
2832 gfc_integer_kinds
[k
].bit_size
);
2834 mpz_clrbit (result
->value
.integer
, pos
);
2836 gfc_convert_mpz_to_signed (result
->value
.integer
,
2837 gfc_integer_kinds
[k
].bit_size
);
2844 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
2851 if (x
->expr_type
!= EXPR_CONSTANT
2852 || y
->expr_type
!= EXPR_CONSTANT
2853 || z
->expr_type
!= EXPR_CONSTANT
)
2856 gfc_extract_int (y
, &pos
);
2857 gfc_extract_int (z
, &len
);
2859 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
2861 bitsize
= gfc_integer_kinds
[k
].bit_size
;
2863 if (pos
+ len
> bitsize
)
2865 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2866 "bit size at %L", &y
->where
);
2867 return &gfc_bad_expr
;
2870 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2871 convert_mpz_to_unsigned (result
->value
.integer
,
2872 gfc_integer_kinds
[k
].bit_size
);
2874 bits
= XCNEWVEC (int, bitsize
);
2876 for (i
= 0; i
< bitsize
; i
++)
2879 for (i
= 0; i
< len
; i
++)
2880 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
2882 for (i
= 0; i
< bitsize
; i
++)
2885 mpz_clrbit (result
->value
.integer
, i
);
2886 else if (bits
[i
] == 1)
2887 mpz_setbit (result
->value
.integer
, i
);
2889 gfc_internal_error ("IBITS: Bad bit");
2894 gfc_convert_mpz_to_signed (result
->value
.integer
,
2895 gfc_integer_kinds
[k
].bit_size
);
2902 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
2907 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2910 gfc_extract_int (y
, &pos
);
2912 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2914 result
= gfc_copy_expr (x
);
2916 convert_mpz_to_unsigned (result
->value
.integer
,
2917 gfc_integer_kinds
[k
].bit_size
);
2919 mpz_setbit (result
->value
.integer
, pos
);
2921 gfc_convert_mpz_to_signed (result
->value
.integer
,
2922 gfc_integer_kinds
[k
].bit_size
);
2929 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
2935 if (e
->expr_type
!= EXPR_CONSTANT
)
2938 if (e
->value
.character
.length
!= 1)
2940 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
2941 return &gfc_bad_expr
;
2944 index
= e
->value
.character
.string
[0];
2946 k
= get_kind (BT_INTEGER
, kind
, "ICHAR", gfc_default_integer_kind
);
2948 return &gfc_bad_expr
;
2950 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2952 return range_check (result
, "ICHAR");
2957 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
2961 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2964 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2965 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2967 return range_check (result
, "IEOR");
2972 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
2975 int back
, len
, lensub
;
2976 int i
, j
, k
, count
, index
= 0, start
;
2978 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
2979 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
2982 if (b
!= NULL
&& b
->value
.logical
!= 0)
2987 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
2989 return &gfc_bad_expr
;
2991 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
2993 len
= x
->value
.character
.length
;
2994 lensub
= y
->value
.character
.length
;
2998 mpz_set_si (result
->value
.integer
, 0);
3006 mpz_set_si (result
->value
.integer
, 1);
3009 else if (lensub
== 1)
3011 for (i
= 0; i
< len
; i
++)
3013 for (j
= 0; j
< lensub
; j
++)
3015 if (y
->value
.character
.string
[j
]
3016 == x
->value
.character
.string
[i
])
3026 for (i
= 0; i
< len
; i
++)
3028 for (j
= 0; j
< lensub
; j
++)
3030 if (y
->value
.character
.string
[j
]
3031 == x
->value
.character
.string
[i
])
3036 for (k
= 0; k
< lensub
; k
++)
3038 if (y
->value
.character
.string
[k
]
3039 == x
->value
.character
.string
[k
+ start
])
3043 if (count
== lensub
)
3058 mpz_set_si (result
->value
.integer
, len
+ 1);
3061 else if (lensub
== 1)
3063 for (i
= 0; i
< len
; i
++)
3065 for (j
= 0; j
< lensub
; j
++)
3067 if (y
->value
.character
.string
[j
]
3068 == x
->value
.character
.string
[len
- i
])
3070 index
= len
- i
+ 1;
3078 for (i
= 0; i
< len
; i
++)
3080 for (j
= 0; j
< lensub
; j
++)
3082 if (y
->value
.character
.string
[j
]
3083 == x
->value
.character
.string
[len
- i
])
3086 if (start
<= len
- lensub
)
3089 for (k
= 0; k
< lensub
; k
++)
3090 if (y
->value
.character
.string
[k
]
3091 == x
->value
.character
.string
[k
+ start
])
3094 if (count
== lensub
)
3111 mpz_set_si (result
->value
.integer
, index
);
3112 return range_check (result
, "INDEX");
3117 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
3119 gfc_expr
*result
= NULL
;
3121 if (e
->expr_type
!= EXPR_CONSTANT
)
3124 result
= gfc_convert_constant (e
, BT_INTEGER
, kind
);
3125 if (result
== &gfc_bad_expr
)
3126 return &gfc_bad_expr
;
3128 return range_check (result
, name
);
3133 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
3137 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
3139 return &gfc_bad_expr
;
3141 return simplify_intconv (e
, kind
, "INT");
3145 gfc_simplify_int2 (gfc_expr
*e
)
3147 return simplify_intconv (e
, 2, "INT2");
3152 gfc_simplify_int8 (gfc_expr
*e
)
3154 return simplify_intconv (e
, 8, "INT8");
3159 gfc_simplify_long (gfc_expr
*e
)
3161 return simplify_intconv (e
, 4, "LONG");
3166 gfc_simplify_ifix (gfc_expr
*e
)
3168 gfc_expr
*rtrunc
, *result
;
3170 if (e
->expr_type
!= EXPR_CONSTANT
)
3173 rtrunc
= gfc_copy_expr (e
);
3174 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3176 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3178 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3180 gfc_free_expr (rtrunc
);
3182 return range_check (result
, "IFIX");
3187 gfc_simplify_idint (gfc_expr
*e
)
3189 gfc_expr
*rtrunc
, *result
;
3191 if (e
->expr_type
!= EXPR_CONSTANT
)
3194 rtrunc
= gfc_copy_expr (e
);
3195 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3197 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3199 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3201 gfc_free_expr (rtrunc
);
3203 return range_check (result
, "IDINT");
3208 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
3212 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3215 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3216 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3218 return range_check (result
, "IOR");
3223 do_bit_xor (gfc_expr
*result
, gfc_expr
*e
)
3225 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3226 gcc_assert (result
->ts
.type
== BT_INTEGER
3227 && result
->expr_type
== EXPR_CONSTANT
);
3229 mpz_xor (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3235 gfc_simplify_iparity (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3237 return simplify_transformation (array
, dim
, mask
, 0, do_bit_xor
);
3242 gfc_simplify_is_iostat_end (gfc_expr
*x
)
3244 if (x
->expr_type
!= EXPR_CONSTANT
)
3247 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3248 mpz_cmp_si (x
->value
.integer
,
3249 LIBERROR_END
) == 0);
3254 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
3256 if (x
->expr_type
!= EXPR_CONSTANT
)
3259 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3260 mpz_cmp_si (x
->value
.integer
,
3261 LIBERROR_EOR
) == 0);
3266 gfc_simplify_isnan (gfc_expr
*x
)
3268 if (x
->expr_type
!= EXPR_CONSTANT
)
3271 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3272 mpfr_nan_p (x
->value
.real
));
3276 /* Performs a shift on its first argument. Depending on the last
3277 argument, the shift can be arithmetic, i.e. with filling from the
3278 left like in the SHIFTA intrinsic. */
3280 simplify_shift (gfc_expr
*e
, gfc_expr
*s
, const char *name
,
3281 bool arithmetic
, int direction
)
3284 int ashift
, *bits
, i
, k
, bitsize
, shift
;
3286 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3289 gfc_extract_int (s
, &shift
);
3291 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
3292 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3294 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3298 mpz_set (result
->value
.integer
, e
->value
.integer
);
3302 if (direction
> 0 && shift
< 0)
3304 /* Left shift, as in SHIFTL. */
3305 gfc_error ("Second argument of %s is negative at %L", name
, &e
->where
);
3306 return &gfc_bad_expr
;
3308 else if (direction
< 0)
3310 /* Right shift, as in SHIFTR or SHIFTA. */
3313 gfc_error ("Second argument of %s is negative at %L",
3315 return &gfc_bad_expr
;
3321 ashift
= (shift
>= 0 ? shift
: -shift
);
3323 if (ashift
> bitsize
)
3325 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3326 "at %L", name
, &e
->where
);
3327 return &gfc_bad_expr
;
3330 bits
= XCNEWVEC (int, bitsize
);
3332 for (i
= 0; i
< bitsize
; i
++)
3333 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3338 for (i
= 0; i
< shift
; i
++)
3339 mpz_clrbit (result
->value
.integer
, i
);
3341 for (i
= 0; i
< bitsize
- shift
; i
++)
3344 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3346 mpz_setbit (result
->value
.integer
, i
+ shift
);
3352 if (arithmetic
&& bits
[bitsize
- 1])
3353 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3354 mpz_setbit (result
->value
.integer
, i
);
3356 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3357 mpz_clrbit (result
->value
.integer
, i
);
3359 for (i
= bitsize
- 1; i
>= ashift
; i
--)
3362 mpz_clrbit (result
->value
.integer
, i
- ashift
);
3364 mpz_setbit (result
->value
.integer
, i
- ashift
);
3368 gfc_convert_mpz_to_signed (result
->value
.integer
, bitsize
);
3376 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
3378 return simplify_shift (e
, s
, "ISHFT", false, 0);
3383 gfc_simplify_lshift (gfc_expr
*e
, gfc_expr
*s
)
3385 return simplify_shift (e
, s
, "LSHIFT", false, 1);
3390 gfc_simplify_rshift (gfc_expr
*e
, gfc_expr
*s
)
3392 return simplify_shift (e
, s
, "RSHIFT", true, -1);
3397 gfc_simplify_shifta (gfc_expr
*e
, gfc_expr
*s
)
3399 return simplify_shift (e
, s
, "SHIFTA", true, -1);
3404 gfc_simplify_shiftl (gfc_expr
*e
, gfc_expr
*s
)
3406 return simplify_shift (e
, s
, "SHIFTL", false, 1);
3411 gfc_simplify_shiftr (gfc_expr
*e
, gfc_expr
*s
)
3413 return simplify_shift (e
, s
, "SHIFTR", false, -1);
3418 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
3421 int shift
, ashift
, isize
, ssize
, delta
, k
;
3424 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3427 gfc_extract_int (s
, &shift
);
3429 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3430 isize
= gfc_integer_kinds
[k
].bit_size
;
3434 if (sz
->expr_type
!= EXPR_CONSTANT
)
3437 gfc_extract_int (sz
, &ssize
);
3450 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3451 "BIT_SIZE of first argument at %C");
3453 gfc_error ("Absolute value of SHIFT shall be less than or equal "
3455 return &gfc_bad_expr
;
3458 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3460 mpz_set (result
->value
.integer
, e
->value
.integer
);
3465 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
3467 bits
= XCNEWVEC (int, ssize
);
3469 for (i
= 0; i
< ssize
; i
++)
3470 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3472 delta
= ssize
- ashift
;
3476 for (i
= 0; i
< delta
; i
++)
3479 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3481 mpz_setbit (result
->value
.integer
, i
+ shift
);
3484 for (i
= delta
; i
< ssize
; i
++)
3487 mpz_clrbit (result
->value
.integer
, i
- delta
);
3489 mpz_setbit (result
->value
.integer
, i
- delta
);
3494 for (i
= 0; i
< ashift
; i
++)
3497 mpz_clrbit (result
->value
.integer
, i
+ delta
);
3499 mpz_setbit (result
->value
.integer
, i
+ delta
);
3502 for (i
= ashift
; i
< ssize
; i
++)
3505 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3507 mpz_setbit (result
->value
.integer
, i
+ shift
);
3511 gfc_convert_mpz_to_signed (result
->value
.integer
, isize
);
3519 gfc_simplify_kind (gfc_expr
*e
)
3521 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, e
->ts
.kind
);
3526 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
3527 gfc_array_spec
*as
, gfc_ref
*ref
, bool coarray
)
3529 gfc_expr
*l
, *u
, *result
;
3532 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3533 gfc_default_integer_kind
);
3535 return &gfc_bad_expr
;
3537 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3539 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3540 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3541 if (!coarray
&& array
->expr_type
!= EXPR_VARIABLE
)
3545 gfc_expr
* dim
= result
;
3546 mpz_set_si (dim
->value
.integer
, d
);
3548 result
= simplify_size (array
, dim
, k
);
3549 gfc_free_expr (dim
);
3554 mpz_set_si (result
->value
.integer
, 1);
3559 /* Otherwise, we have a variable expression. */
3560 gcc_assert (array
->expr_type
== EXPR_VARIABLE
);
3563 if (!gfc_resolve_array_spec (as
, 0))
3566 /* The last dimension of an assumed-size array is special. */
3567 if ((!coarray
&& d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
3568 || (coarray
&& d
== as
->rank
+ as
->corank
3569 && (!upper
|| flag_coarray
== GFC_FCOARRAY_SINGLE
)))
3571 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
3573 gfc_free_expr (result
);
3574 return gfc_copy_expr (as
->lower
[d
-1]);
3580 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3582 /* Then, we need to know the extent of the given dimension. */
3583 if (coarray
|| (ref
->u
.ar
.type
== AR_FULL
&& !ref
->next
))
3585 gfc_expr
*declared_bound
;
3587 bool constant_lbound
, constant_ubound
;
3592 gcc_assert (l
!= NULL
);
3594 constant_lbound
= l
->expr_type
== EXPR_CONSTANT
;
3595 constant_ubound
= u
&& u
->expr_type
== EXPR_CONSTANT
;
3597 empty_bound
= upper
? 0 : 1;
3598 declared_bound
= upper
? u
: l
;
3600 if ((!upper
&& !constant_lbound
)
3601 || (upper
&& !constant_ubound
))
3606 /* For {L,U}BOUND, the value depends on whether the array
3607 is empty. We can nevertheless simplify if the declared bound
3608 has the same value as that of an empty array, in which case
3609 the result isn't dependent on the array emptyness. */
3610 if (mpz_cmp_si (declared_bound
->value
.integer
, empty_bound
) == 0)
3611 mpz_set_si (result
->value
.integer
, empty_bound
);
3612 else if (!constant_lbound
|| !constant_ubound
)
3613 /* Array emptyness can't be determined, we can't simplify. */
3615 else if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
3616 mpz_set_si (result
->value
.integer
, empty_bound
);
3618 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
3621 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
3627 if (!gfc_ref_dimen_size (&ref
->u
.ar
, d
- 1, &result
->value
.integer
, NULL
))
3631 mpz_set_si (result
->value
.integer
, (long int) 1);
3635 return range_check (result
, upper
? "UBOUND" : "LBOUND");
3638 gfc_free_expr (result
);
3644 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3650 if (array
->ts
.type
== BT_CLASS
)
3653 if (array
->expr_type
!= EXPR_VARIABLE
)
3660 /* Follow any component references. */
3661 as
= array
->symtree
->n
.sym
->as
;
3662 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3667 switch (ref
->u
.ar
.type
)
3674 /* We're done because 'as' has already been set in the
3675 previous iteration. */
3689 as
= ref
->u
.c
.component
->as
;
3701 if (as
&& (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_RANK
3702 || (as
->type
== AS_ASSUMED_SHAPE
&& upper
)))
3706 || (as
->type
!= AS_DEFERRED
3707 && array
->expr_type
== EXPR_VARIABLE
3708 && !gfc_expr_attr (array
).allocatable
3709 && !gfc_expr_attr (array
).pointer
));
3713 /* Multi-dimensional bounds. */
3714 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3718 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3719 if (upper
&& as
&& as
->type
== AS_ASSUMED_SIZE
)
3721 /* An error message will be emitted in
3722 check_assumed_size_reference (resolve.c). */
3723 return &gfc_bad_expr
;
3726 /* Simplify the bounds for each dimension. */
3727 for (d
= 0; d
< array
->rank
; d
++)
3729 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
, ref
,
3731 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3735 for (j
= 0; j
< d
; j
++)
3736 gfc_free_expr (bounds
[j
]);
3741 /* Allocate the result expression. */
3742 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3743 gfc_default_integer_kind
);
3745 return &gfc_bad_expr
;
3747 e
= gfc_get_array_expr (BT_INTEGER
, k
, &array
->where
);
3749 /* The result is a rank 1 array; its size is the rank of the first
3750 argument to {L,U}BOUND. */
3752 e
->shape
= gfc_get_shape (1);
3753 mpz_init_set_ui (e
->shape
[0], array
->rank
);
3755 /* Create the constructor for this array. */
3756 for (d
= 0; d
< array
->rank
; d
++)
3757 gfc_constructor_append_expr (&e
->value
.constructor
,
3758 bounds
[d
], &e
->where
);
3764 /* A DIM argument is specified. */
3765 if (dim
->expr_type
!= EXPR_CONSTANT
)
3768 d
= mpz_get_si (dim
->value
.integer
);
3770 if ((d
< 1 || d
> array
->rank
)
3771 || (d
== array
->rank
&& as
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
3773 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3774 return &gfc_bad_expr
;
3777 if (as
&& as
->type
== AS_ASSUMED_RANK
)
3780 return simplify_bound_dim (array
, kind
, d
, upper
, as
, ref
, false);
3786 simplify_cobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3792 if (array
->expr_type
!= EXPR_VARIABLE
)
3795 /* Follow any component references. */
3796 as
= (array
->ts
.type
== BT_CLASS
&& array
->ts
.u
.derived
->components
)
3797 ? array
->ts
.u
.derived
->components
->as
3798 : array
->symtree
->n
.sym
->as
;
3799 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3804 switch (ref
->u
.ar
.type
)
3807 if (ref
->u
.ar
.as
->corank
> 0)
3809 gcc_assert (as
== ref
->u
.ar
.as
);
3816 /* We're done because 'as' has already been set in the
3817 previous iteration. */
3831 as
= ref
->u
.c
.component
->as
;
3844 if (as
->cotype
== AS_DEFERRED
|| as
->cotype
== AS_ASSUMED_SHAPE
)
3849 /* Multi-dimensional cobounds. */
3850 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3854 /* Simplify the cobounds for each dimension. */
3855 for (d
= 0; d
< as
->corank
; d
++)
3857 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1 + as
->rank
,
3858 upper
, as
, ref
, true);
3859 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3863 for (j
= 0; j
< d
; j
++)
3864 gfc_free_expr (bounds
[j
]);
3869 /* Allocate the result expression. */
3870 e
= gfc_get_expr ();
3871 e
->where
= array
->where
;
3872 e
->expr_type
= EXPR_ARRAY
;
3873 e
->ts
.type
= BT_INTEGER
;
3874 k
= get_kind (BT_INTEGER
, kind
, upper
? "UCOBOUND" : "LCOBOUND",
3875 gfc_default_integer_kind
);
3879 return &gfc_bad_expr
;
3883 /* The result is a rank 1 array; its size is the rank of the first
3884 argument to {L,U}COBOUND. */
3886 e
->shape
= gfc_get_shape (1);
3887 mpz_init_set_ui (e
->shape
[0], as
->corank
);
3889 /* Create the constructor for this array. */
3890 for (d
= 0; d
< as
->corank
; d
++)
3891 gfc_constructor_append_expr (&e
->value
.constructor
,
3892 bounds
[d
], &e
->where
);
3897 /* A DIM argument is specified. */
3898 if (dim
->expr_type
!= EXPR_CONSTANT
)
3901 d
= mpz_get_si (dim
->value
.integer
);
3903 if (d
< 1 || d
> as
->corank
)
3905 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3906 return &gfc_bad_expr
;
3909 return simplify_bound_dim (array
, kind
, d
+as
->rank
, upper
, as
, ref
, true);
3915 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3917 return simplify_bound (array
, dim
, kind
, 0);
3922 gfc_simplify_lcobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3924 return simplify_cobound (array
, dim
, kind
, 0);
3928 gfc_simplify_leadz (gfc_expr
*e
)
3930 unsigned long lz
, bs
;
3933 if (e
->expr_type
!= EXPR_CONSTANT
)
3936 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3937 bs
= gfc_integer_kinds
[i
].bit_size
;
3938 if (mpz_cmp_si (e
->value
.integer
, 0) == 0)
3940 else if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
3943 lz
= bs
- mpz_sizeinbase (e
->value
.integer
, 2);
3945 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, lz
);
3950 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
3953 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
3956 return &gfc_bad_expr
;
3958 if (e
->expr_type
== EXPR_CONSTANT
)
3960 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
3961 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
3962 return range_check (result
, "LEN");
3964 else if (e
->ts
.u
.cl
!= NULL
&& e
->ts
.u
.cl
->length
!= NULL
3965 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
3966 && e
->ts
.u
.cl
->length
->ts
.type
== BT_INTEGER
)
3968 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
3969 mpz_set (result
->value
.integer
, e
->ts
.u
.cl
->length
->value
.integer
);
3970 return range_check (result
, "LEN");
3972 else if (e
->expr_type
== EXPR_VARIABLE
&& e
->ts
.type
== BT_CHARACTER
3973 && e
->symtree
->n
.sym
3974 && e
->symtree
->n
.sym
->ts
.type
!= BT_DERIVED
3975 && e
->symtree
->n
.sym
->assoc
&& e
->symtree
->n
.sym
->assoc
->target
3976 && e
->symtree
->n
.sym
->assoc
->target
->ts
.type
== BT_DERIVED
3977 && e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
3978 && UNLIMITED_POLY (e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
))
3980 /* The expression in assoc->target points to a ref to the _data component
3981 of the unlimited polymorphic entity. To get the _len component the last
3982 _data ref needs to be stripped and a ref to the _len component added. */
3983 return gfc_get_len_component (e
->symtree
->n
.sym
->assoc
->target
);
3990 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
3994 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
3997 return &gfc_bad_expr
;
3999 if (e
->expr_type
!= EXPR_CONSTANT
)
4002 len
= e
->value
.character
.length
;
4003 for (count
= 0, i
= 1; i
<= len
; i
++)
4004 if (e
->value
.character
.string
[len
- i
] == ' ')
4009 result
= gfc_get_int_expr (k
, &e
->where
, len
- count
);
4010 return range_check (result
, "LEN_TRIM");
4014 gfc_simplify_lgamma (gfc_expr
*x
)
4019 if (x
->expr_type
!= EXPR_CONSTANT
)
4022 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4023 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
4025 return range_check (result
, "LGAMMA");
4030 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
4032 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4035 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4036 gfc_compare_string (a
, b
) >= 0);
4041 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
4043 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4046 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4047 gfc_compare_string (a
, b
) > 0);
4052 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
4054 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4057 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4058 gfc_compare_string (a
, b
) <= 0);
4063 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
4065 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4068 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4069 gfc_compare_string (a
, b
) < 0);
4074 gfc_simplify_log (gfc_expr
*x
)
4078 if (x
->expr_type
!= EXPR_CONSTANT
)
4081 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4086 if (mpfr_sgn (x
->value
.real
) <= 0)
4088 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4089 "to zero", &x
->where
);
4090 gfc_free_expr (result
);
4091 return &gfc_bad_expr
;
4094 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4098 if (mpfr_zero_p (mpc_realref (x
->value
.complex))
4099 && mpfr_zero_p (mpc_imagref (x
->value
.complex)))
4101 gfc_error ("Complex argument of LOG at %L cannot be zero",
4103 gfc_free_expr (result
);
4104 return &gfc_bad_expr
;
4107 gfc_set_model_kind (x
->ts
.kind
);
4108 mpc_log (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
4112 gfc_internal_error ("gfc_simplify_log: bad type");
4115 return range_check (result
, "LOG");
4120 gfc_simplify_log10 (gfc_expr
*x
)
4124 if (x
->expr_type
!= EXPR_CONSTANT
)
4127 if (mpfr_sgn (x
->value
.real
) <= 0)
4129 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4130 "to zero", &x
->where
);
4131 return &gfc_bad_expr
;
4134 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4135 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4137 return range_check (result
, "LOG10");
4142 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
4146 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
4148 return &gfc_bad_expr
;
4150 if (e
->expr_type
!= EXPR_CONSTANT
)
4153 return gfc_get_logical_expr (kind
, &e
->where
, e
->value
.logical
);
4158 gfc_simplify_matmul (gfc_expr
*matrix_a
, gfc_expr
*matrix_b
)
4161 int row
, result_rows
, col
, result_columns
;
4162 int stride_a
, offset_a
, stride_b
, offset_b
;
4164 if (!is_constant_array_expr (matrix_a
)
4165 || !is_constant_array_expr (matrix_b
))
4168 gcc_assert (gfc_compare_types (&matrix_a
->ts
, &matrix_b
->ts
));
4169 result
= gfc_get_array_expr (matrix_a
->ts
.type
,
4173 if (matrix_a
->rank
== 1 && matrix_b
->rank
== 2)
4176 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4178 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4181 result
->shape
= gfc_get_shape (result
->rank
);
4182 mpz_init_set_si (result
->shape
[0], result_columns
);
4184 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 1)
4186 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4188 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4192 result
->shape
= gfc_get_shape (result
->rank
);
4193 mpz_init_set_si (result
->shape
[0], result_rows
);
4195 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 2)
4197 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4198 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4199 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4200 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4203 result
->shape
= gfc_get_shape (result
->rank
);
4204 mpz_init_set_si (result
->shape
[0], result_rows
);
4205 mpz_init_set_si (result
->shape
[1], result_columns
);
4210 offset_a
= offset_b
= 0;
4211 for (col
= 0; col
< result_columns
; ++col
)
4215 for (row
= 0; row
< result_rows
; ++row
)
4217 gfc_expr
*e
= compute_dot_product (matrix_a
, stride_a
, offset_a
,
4218 matrix_b
, 1, offset_b
, false);
4219 gfc_constructor_append_expr (&result
->value
.constructor
,
4225 offset_b
+= stride_b
;
4233 gfc_simplify_maskr (gfc_expr
*i
, gfc_expr
*kind_arg
)
4238 if (i
->expr_type
!= EXPR_CONSTANT
)
4241 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKR", gfc_default_integer_kind
);
4243 return &gfc_bad_expr
;
4244 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4246 bool fail
= gfc_extract_int (i
, &arg
);
4249 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4251 /* MASKR(n) = 2^n - 1 */
4252 mpz_set_ui (result
->value
.integer
, 1);
4253 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
, arg
);
4254 mpz_sub_ui (result
->value
.integer
, result
->value
.integer
, 1);
4256 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4263 gfc_simplify_maskl (gfc_expr
*i
, gfc_expr
*kind_arg
)
4269 if (i
->expr_type
!= EXPR_CONSTANT
)
4272 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKL", gfc_default_integer_kind
);
4274 return &gfc_bad_expr
;
4275 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4277 bool fail
= gfc_extract_int (i
, &arg
);
4280 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4282 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4283 mpz_init_set_ui (z
, 1);
4284 mpz_mul_2exp (z
, z
, gfc_integer_kinds
[k
].bit_size
);
4285 mpz_set_ui (result
->value
.integer
, 1);
4286 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
,
4287 gfc_integer_kinds
[k
].bit_size
- arg
);
4288 mpz_sub (result
->value
.integer
, z
, result
->value
.integer
);
4291 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4298 gfc_simplify_merge (gfc_expr
*tsource
, gfc_expr
*fsource
, gfc_expr
*mask
)
4301 gfc_constructor
*tsource_ctor
, *fsource_ctor
, *mask_ctor
;
4303 if (mask
->expr_type
== EXPR_CONSTANT
)
4304 return gfc_get_parentheses (gfc_copy_expr (mask
->value
.logical
4305 ? tsource
: fsource
));
4307 if (!mask
->rank
|| !is_constant_array_expr (mask
)
4308 || !is_constant_array_expr (tsource
) || !is_constant_array_expr (fsource
))
4311 result
= gfc_get_array_expr (tsource
->ts
.type
, tsource
->ts
.kind
,
4313 if (tsource
->ts
.type
== BT_DERIVED
)
4314 result
->ts
.u
.derived
= tsource
->ts
.u
.derived
;
4315 else if (tsource
->ts
.type
== BT_CHARACTER
)
4316 result
->ts
.u
.cl
= tsource
->ts
.u
.cl
;
4318 tsource_ctor
= gfc_constructor_first (tsource
->value
.constructor
);
4319 fsource_ctor
= gfc_constructor_first (fsource
->value
.constructor
);
4320 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4324 if (mask_ctor
->expr
->value
.logical
)
4325 gfc_constructor_append_expr (&result
->value
.constructor
,
4326 gfc_copy_expr (tsource_ctor
->expr
),
4329 gfc_constructor_append_expr (&result
->value
.constructor
,
4330 gfc_copy_expr (fsource_ctor
->expr
),
4332 tsource_ctor
= gfc_constructor_next (tsource_ctor
);
4333 fsource_ctor
= gfc_constructor_next (fsource_ctor
);
4334 mask_ctor
= gfc_constructor_next (mask_ctor
);
4337 result
->shape
= gfc_get_shape (1);
4338 gfc_array_size (result
, &result
->shape
[0]);
4345 gfc_simplify_merge_bits (gfc_expr
*i
, gfc_expr
*j
, gfc_expr
*mask_expr
)
4347 mpz_t arg1
, arg2
, mask
;
4350 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
4351 || mask_expr
->expr_type
!= EXPR_CONSTANT
)
4354 result
= gfc_get_constant_expr (BT_INTEGER
, i
->ts
.kind
, &i
->where
);
4356 /* Convert all argument to unsigned. */
4357 mpz_init_set (arg1
, i
->value
.integer
);
4358 mpz_init_set (arg2
, j
->value
.integer
);
4359 mpz_init_set (mask
, mask_expr
->value
.integer
);
4361 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4362 mpz_and (arg1
, arg1
, mask
);
4363 mpz_com (mask
, mask
);
4364 mpz_and (arg2
, arg2
, mask
);
4365 mpz_ior (result
->value
.integer
, arg1
, arg2
);
4375 /* Selects between current value and extremum for simplify_min_max
4376 and simplify_minval_maxval. */
4378 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
)
4380 switch (arg
->ts
.type
)
4383 if (mpz_cmp (arg
->value
.integer
,
4384 extremum
->value
.integer
) * sign
> 0)
4385 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
4389 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4391 mpfr_max (extremum
->value
.real
, extremum
->value
.real
,
4392 arg
->value
.real
, GFC_RND_MODE
);
4394 mpfr_min (extremum
->value
.real
, extremum
->value
.real
,
4395 arg
->value
.real
, GFC_RND_MODE
);
4399 #define LENGTH(x) ((x)->value.character.length)
4400 #define STRING(x) ((x)->value.character.string)
4401 if (LENGTH (extremum
) < LENGTH(arg
))
4403 gfc_char_t
*tmp
= STRING(extremum
);
4405 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
4406 memcpy (STRING(extremum
), tmp
,
4407 LENGTH(extremum
) * sizeof (gfc_char_t
));
4408 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
4409 LENGTH(arg
) - LENGTH(extremum
));
4410 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
4411 LENGTH(extremum
) = LENGTH(arg
);
4415 if (gfc_compare_string (arg
, extremum
) * sign
> 0)
4417 free (STRING(extremum
));
4418 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
4419 memcpy (STRING(extremum
), STRING(arg
),
4420 LENGTH(arg
) * sizeof (gfc_char_t
));
4421 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
4422 LENGTH(extremum
) - LENGTH(arg
));
4423 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
4430 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4435 /* This function is special since MAX() can take any number of
4436 arguments. The simplified expression is a rewritten version of the
4437 argument list containing at most one constant element. Other
4438 constant elements are deleted. Because the argument list has
4439 already been checked, this function always succeeds. sign is 1 for
4440 MAX(), -1 for MIN(). */
4443 simplify_min_max (gfc_expr
*expr
, int sign
)
4445 gfc_actual_arglist
*arg
, *last
, *extremum
;
4446 gfc_intrinsic_sym
* specific
;
4450 specific
= expr
->value
.function
.isym
;
4452 arg
= expr
->value
.function
.actual
;
4454 for (; arg
; last
= arg
, arg
= arg
->next
)
4456 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
4459 if (extremum
== NULL
)
4465 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
4467 /* Delete the extra constant argument. */
4468 last
->next
= arg
->next
;
4471 gfc_free_actual_arglist (arg
);
4475 /* If there is one value left, replace the function call with the
4477 if (expr
->value
.function
.actual
->next
!= NULL
)
4480 /* Convert to the correct type and kind. */
4481 if (expr
->ts
.type
!= BT_UNKNOWN
)
4482 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4483 expr
->ts
.type
, expr
->ts
.kind
);
4485 if (specific
->ts
.type
!= BT_UNKNOWN
)
4486 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4487 specific
->ts
.type
, specific
->ts
.kind
);
4489 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
4494 gfc_simplify_min (gfc_expr
*e
)
4496 return simplify_min_max (e
, -1);
4501 gfc_simplify_max (gfc_expr
*e
)
4503 return simplify_min_max (e
, 1);
4507 /* This is a simplified version of simplify_min_max to provide
4508 simplification of minval and maxval for a vector. */
4511 simplify_minval_maxval (gfc_expr
*expr
, int sign
)
4513 gfc_constructor
*c
, *extremum
;
4514 gfc_intrinsic_sym
* specific
;
4517 specific
= expr
->value
.function
.isym
;
4519 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4520 c
; c
= gfc_constructor_next (c
))
4522 if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
4525 if (extremum
== NULL
)
4531 min_max_choose (c
->expr
, extremum
->expr
, sign
);
4534 if (extremum
== NULL
)
4537 /* Convert to the correct type and kind. */
4538 if (expr
->ts
.type
!= BT_UNKNOWN
)
4539 return gfc_convert_constant (extremum
->expr
,
4540 expr
->ts
.type
, expr
->ts
.kind
);
4542 if (specific
->ts
.type
!= BT_UNKNOWN
)
4543 return gfc_convert_constant (extremum
->expr
,
4544 specific
->ts
.type
, specific
->ts
.kind
);
4546 return gfc_copy_expr (extremum
->expr
);
4551 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4553 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4556 return simplify_minval_maxval (array
, -1);
4561 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4563 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4566 return simplify_minval_maxval (array
, 1);
4571 gfc_simplify_maxexponent (gfc_expr
*x
)
4573 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4574 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4575 gfc_real_kinds
[i
].max_exponent
);
4580 gfc_simplify_minexponent (gfc_expr
*x
)
4582 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4583 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4584 gfc_real_kinds
[i
].min_exponent
);
4589 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
4594 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4597 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4598 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4603 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4605 /* Result is processor-dependent. */
4606 gfc_error ("Second argument MOD at %L is zero", &a
->where
);
4607 gfc_free_expr (result
);
4608 return &gfc_bad_expr
;
4610 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4614 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4616 /* Result is processor-dependent. */
4617 gfc_error ("Second argument of MOD at %L is zero", &p
->where
);
4618 gfc_free_expr (result
);
4619 return &gfc_bad_expr
;
4622 gfc_set_model_kind (kind
);
4623 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4628 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4631 return range_check (result
, "MOD");
4636 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
4641 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4644 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4645 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4650 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4652 /* Result is processor-dependent. This processor just opts
4653 to not handle it at all. */
4654 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
4655 gfc_free_expr (result
);
4656 return &gfc_bad_expr
;
4658 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4663 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4665 /* Result is processor-dependent. */
4666 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
4667 gfc_free_expr (result
);
4668 return &gfc_bad_expr
;
4671 gfc_set_model_kind (kind
);
4672 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4674 if (mpfr_cmp_ui (result
->value
.real
, 0) != 0)
4676 if (mpfr_signbit (a
->value
.real
) != mpfr_signbit (p
->value
.real
))
4677 mpfr_add (result
->value
.real
, result
->value
.real
, p
->value
.real
,
4681 mpfr_copysign (result
->value
.real
, result
->value
.real
,
4682 p
->value
.real
, GFC_RND_MODE
);
4686 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4689 return range_check (result
, "MODULO");
4694 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
4697 mp_exp_t emin
, emax
;
4700 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
4703 result
= gfc_copy_expr (x
);
4705 /* Save current values of emin and emax. */
4706 emin
= mpfr_get_emin ();
4707 emax
= mpfr_get_emax ();
4709 /* Set emin and emax for the current model number. */
4710 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
4711 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
4712 mpfr_get_prec(result
->value
.real
) + 1);
4713 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
4714 mpfr_check_range (result
->value
.real
, 0, GMP_RNDU
);
4716 if (mpfr_sgn (s
->value
.real
) > 0)
4718 mpfr_nextabove (result
->value
.real
);
4719 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
4723 mpfr_nextbelow (result
->value
.real
);
4724 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
4727 mpfr_set_emin (emin
);
4728 mpfr_set_emax (emax
);
4730 /* Only NaN can occur. Do not use range check as it gives an
4731 error for denormal numbers. */
4732 if (mpfr_nan_p (result
->value
.real
) && flag_range_check
)
4734 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
4735 gfc_free_expr (result
);
4736 return &gfc_bad_expr
;
4744 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
4746 gfc_expr
*itrunc
, *result
;
4749 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
4751 return &gfc_bad_expr
;
4753 if (e
->expr_type
!= EXPR_CONSTANT
)
4756 itrunc
= gfc_copy_expr (e
);
4757 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
4759 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
4760 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
4762 gfc_free_expr (itrunc
);
4764 return range_check (result
, name
);
4769 gfc_simplify_new_line (gfc_expr
*e
)
4773 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 1);
4774 result
->value
.character
.string
[0] = '\n';
4781 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
4783 return simplify_nint ("NINT", e
, k
);
4788 gfc_simplify_idnint (gfc_expr
*e
)
4790 return simplify_nint ("IDNINT", e
, NULL
);
4795 add_squared (gfc_expr
*result
, gfc_expr
*e
)
4799 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4800 gcc_assert (result
->ts
.type
== BT_REAL
4801 && result
->expr_type
== EXPR_CONSTANT
);
4803 gfc_set_model_kind (result
->ts
.kind
);
4805 mpfr_pow_ui (tmp
, e
->value
.real
, 2, GFC_RND_MODE
);
4806 mpfr_add (result
->value
.real
, result
->value
.real
, tmp
,
4815 do_sqrt (gfc_expr
*result
, gfc_expr
*e
)
4817 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4818 gcc_assert (result
->ts
.type
== BT_REAL
4819 && result
->expr_type
== EXPR_CONSTANT
);
4821 mpfr_set (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
4822 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4828 gfc_simplify_norm2 (gfc_expr
*e
, gfc_expr
*dim
)
4832 if (!is_constant_array_expr (e
)
4833 || (dim
!= NULL
&& !gfc_is_constant_expr (dim
)))
4836 result
= transformational_result (e
, dim
, e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4837 init_result_expr (result
, 0, NULL
);
4839 if (!dim
|| e
->rank
== 1)
4841 result
= simplify_transformation_to_scalar (result
, e
, NULL
,
4843 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4846 result
= simplify_transformation_to_array (result
, e
, dim
, NULL
,
4847 add_squared
, &do_sqrt
);
4854 gfc_simplify_not (gfc_expr
*e
)
4858 if (e
->expr_type
!= EXPR_CONSTANT
)
4861 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4862 mpz_com (result
->value
.integer
, e
->value
.integer
);
4864 return range_check (result
, "NOT");
4869 gfc_simplify_null (gfc_expr
*mold
)
4875 result
= gfc_copy_expr (mold
);
4876 result
->expr_type
= EXPR_NULL
;
4879 result
= gfc_get_null_expr (NULL
);
4886 gfc_simplify_num_images (gfc_expr
*distance ATTRIBUTE_UNUSED
, gfc_expr
*failed
)
4890 if (flag_coarray
== GFC_FCOARRAY_NONE
)
4892 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
4893 return &gfc_bad_expr
;
4896 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
4899 if (failed
&& failed
->expr_type
!= EXPR_CONSTANT
)
4902 /* FIXME: gfc_current_locus is wrong. */
4903 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
4904 &gfc_current_locus
);
4906 if (failed
&& failed
->value
.logical
!= 0)
4907 mpz_set_si (result
->value
.integer
, 0);
4909 mpz_set_si (result
->value
.integer
, 1);
4916 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
4921 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
4924 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
4929 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
4930 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
4931 return range_check (result
, "OR");
4934 return gfc_get_logical_expr (kind
, &x
->where
,
4935 x
->value
.logical
|| y
->value
.logical
);
4943 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
4946 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
4948 if (!is_constant_array_expr (array
)
4949 || !is_constant_array_expr (vector
)
4950 || (!gfc_is_constant_expr (mask
)
4951 && !is_constant_array_expr (mask
)))
4954 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
4955 if (array
->ts
.type
== BT_DERIVED
)
4956 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
4958 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
4959 vector_ctor
= vector
4960 ? gfc_constructor_first (vector
->value
.constructor
)
4963 if (mask
->expr_type
== EXPR_CONSTANT
4964 && mask
->value
.logical
)
4966 /* Copy all elements of ARRAY to RESULT. */
4969 gfc_constructor_append_expr (&result
->value
.constructor
,
4970 gfc_copy_expr (array_ctor
->expr
),
4973 array_ctor
= gfc_constructor_next (array_ctor
);
4974 vector_ctor
= gfc_constructor_next (vector_ctor
);
4977 else if (mask
->expr_type
== EXPR_ARRAY
)
4979 /* Copy only those elements of ARRAY to RESULT whose
4980 MASK equals .TRUE.. */
4981 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4984 if (mask_ctor
->expr
->value
.logical
)
4986 gfc_constructor_append_expr (&result
->value
.constructor
,
4987 gfc_copy_expr (array_ctor
->expr
),
4989 vector_ctor
= gfc_constructor_next (vector_ctor
);
4992 array_ctor
= gfc_constructor_next (array_ctor
);
4993 mask_ctor
= gfc_constructor_next (mask_ctor
);
4997 /* Append any left-over elements from VECTOR to RESULT. */
5000 gfc_constructor_append_expr (&result
->value
.constructor
,
5001 gfc_copy_expr (vector_ctor
->expr
),
5003 vector_ctor
= gfc_constructor_next (vector_ctor
);
5006 result
->shape
= gfc_get_shape (1);
5007 gfc_array_size (result
, &result
->shape
[0]);
5009 if (array
->ts
.type
== BT_CHARACTER
)
5010 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
5017 do_xor (gfc_expr
*result
, gfc_expr
*e
)
5019 gcc_assert (e
->ts
.type
== BT_LOGICAL
&& e
->expr_type
== EXPR_CONSTANT
);
5020 gcc_assert (result
->ts
.type
== BT_LOGICAL
5021 && result
->expr_type
== EXPR_CONSTANT
);
5023 result
->value
.logical
= result
->value
.logical
!= e
->value
.logical
;
5030 gfc_simplify_parity (gfc_expr
*e
, gfc_expr
*dim
)
5032 return simplify_transformation (e
, dim
, NULL
, 0, do_xor
);
5037 gfc_simplify_popcnt (gfc_expr
*e
)
5042 if (e
->expr_type
!= EXPR_CONSTANT
)
5045 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5047 /* Convert argument to unsigned, then count the '1' bits. */
5048 mpz_init_set (x
, e
->value
.integer
);
5049 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
5050 res
= mpz_popcount (x
);
5053 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, res
);
5058 gfc_simplify_poppar (gfc_expr
*e
)
5063 if (e
->expr_type
!= EXPR_CONSTANT
)
5066 popcnt
= gfc_simplify_popcnt (e
);
5067 gcc_assert (popcnt
);
5069 bool fail
= gfc_extract_int (popcnt
, &i
);
5072 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
% 2);
5077 gfc_simplify_precision (gfc_expr
*e
)
5079 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5080 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
,
5081 gfc_real_kinds
[i
].precision
);
5086 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
5088 return simplify_transformation (array
, dim
, mask
, 1, gfc_multiply
);
5093 gfc_simplify_radix (gfc_expr
*e
)
5096 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5101 i
= gfc_integer_kinds
[i
].radix
;
5105 i
= gfc_real_kinds
[i
].radix
;
5112 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
5117 gfc_simplify_range (gfc_expr
*e
)
5120 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5125 i
= gfc_integer_kinds
[i
].range
;
5130 i
= gfc_real_kinds
[i
].range
;
5137 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
5142 gfc_simplify_rank (gfc_expr
*e
)
5148 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, e
->rank
);
5153 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
5155 gfc_expr
*result
= NULL
;
5158 if (e
->ts
.type
== BT_COMPLEX
)
5159 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
5161 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
5164 return &gfc_bad_expr
;
5166 if (e
->expr_type
!= EXPR_CONSTANT
)
5169 if (convert_boz (e
, kind
) == &gfc_bad_expr
)
5170 return &gfc_bad_expr
;
5172 result
= gfc_convert_constant (e
, BT_REAL
, kind
);
5173 if (result
== &gfc_bad_expr
)
5174 return &gfc_bad_expr
;
5176 return range_check (result
, "REAL");
5181 gfc_simplify_realpart (gfc_expr
*e
)
5185 if (e
->expr_type
!= EXPR_CONSTANT
)
5188 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
5189 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
5191 return range_check (result
, "REALPART");
5195 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
5198 int i
, j
, len
, ncop
, nlen
;
5200 bool have_length
= false;
5202 /* If NCOPIES isn't a constant, there's nothing we can do. */
5203 if (n
->expr_type
!= EXPR_CONSTANT
)
5206 /* If NCOPIES is negative, it's an error. */
5207 if (mpz_sgn (n
->value
.integer
) < 0)
5209 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
5211 return &gfc_bad_expr
;
5214 /* If we don't know the character length, we can do no more. */
5215 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
5216 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
5218 len
= mpz_get_si (e
->ts
.u
.cl
->length
->value
.integer
);
5221 else if (e
->expr_type
== EXPR_CONSTANT
5222 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
5224 len
= e
->value
.character
.length
;
5229 /* If the source length is 0, any value of NCOPIES is valid
5230 and everything behaves as if NCOPIES == 0. */
5233 mpz_set_ui (ncopies
, 0);
5235 mpz_set (ncopies
, n
->value
.integer
);
5237 /* Check that NCOPIES isn't too large. */
5243 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
5245 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
5249 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
5250 e
->ts
.u
.cl
->length
->value
.integer
);
5254 mpz_init_set_si (mlen
, len
);
5255 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
5259 /* The check itself. */
5260 if (mpz_cmp (ncopies
, max
) > 0)
5263 mpz_clear (ncopies
);
5264 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
5266 return &gfc_bad_expr
;
5271 mpz_clear (ncopies
);
5273 /* For further simplification, we need the character string to be
5275 if (e
->expr_type
!= EXPR_CONSTANT
)
5279 (e
->ts
.u
.cl
->length
&&
5280 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
) != 0))
5282 bool fail
= gfc_extract_int (n
, &ncop
);
5289 return gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 0);
5291 len
= e
->value
.character
.length
;
5294 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, nlen
);
5295 for (i
= 0; i
< ncop
; i
++)
5296 for (j
= 0; j
< len
; j
++)
5297 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
5299 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
5304 /* This one is a bear, but mainly has to do with shuffling elements. */
5307 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
5308 gfc_expr
*pad
, gfc_expr
*order_exp
)
5310 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
5311 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
5315 gfc_expr
*e
, *result
;
5317 /* Check that argument expression types are OK. */
5318 if (!is_constant_array_expr (source
)
5319 || !is_constant_array_expr (shape_exp
)
5320 || !is_constant_array_expr (pad
)
5321 || !is_constant_array_expr (order_exp
))
5324 if (source
->shape
== NULL
)
5327 /* Proceed with simplification, unpacking the array. */
5334 e
= gfc_constructor_lookup_expr (shape_exp
->value
.constructor
, rank
);
5338 gfc_extract_int (e
, &shape
[rank
]);
5340 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
5341 gcc_assert (shape
[rank
] >= 0);
5346 gcc_assert (rank
> 0);
5348 /* Now unpack the order array if present. */
5349 if (order_exp
== NULL
)
5351 for (i
= 0; i
< rank
; i
++)
5356 for (i
= 0; i
< rank
; i
++)
5359 for (i
= 0; i
< rank
; i
++)
5361 e
= gfc_constructor_lookup_expr (order_exp
->value
.constructor
, i
);
5364 gfc_extract_int (e
, &order
[i
]);
5366 gcc_assert (order
[i
] >= 1 && order
[i
] <= rank
);
5368 gcc_assert (x
[order
[i
]] == 0);
5373 /* Count the elements in the source and padding arrays. */
5378 gfc_array_size (pad
, &size
);
5379 npad
= mpz_get_ui (size
);
5383 gfc_array_size (source
, &size
);
5384 nsource
= mpz_get_ui (size
);
5387 /* If it weren't for that pesky permutation we could just loop
5388 through the source and round out any shortage with pad elements.
5389 But no, someone just had to have the compiler do something the
5390 user should be doing. */
5392 for (i
= 0; i
< rank
; i
++)
5395 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5397 if (source
->ts
.type
== BT_DERIVED
)
5398 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5399 result
->rank
= rank
;
5400 result
->shape
= gfc_get_shape (rank
);
5401 for (i
= 0; i
< rank
; i
++)
5402 mpz_init_set_ui (result
->shape
[i
], shape
[i
]);
5404 while (nsource
> 0 || npad
> 0)
5406 /* Figure out which element to extract. */
5407 mpz_set_ui (index
, 0);
5409 for (i
= rank
- 1; i
>= 0; i
--)
5411 mpz_add_ui (index
, index
, x
[order
[i
]]);
5413 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
5416 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
5417 gfc_internal_error ("Reshaped array too large at %C");
5419 j
= mpz_get_ui (index
);
5422 e
= gfc_constructor_lookup_expr (source
->value
.constructor
, j
);
5432 e
= gfc_constructor_lookup_expr (pad
->value
.constructor
, j
);
5436 gfc_constructor_append_expr (&result
->value
.constructor
,
5437 gfc_copy_expr (e
), &e
->where
);
5439 /* Calculate the next element. */
5443 if (++x
[i
] < shape
[i
])
5459 gfc_simplify_rrspacing (gfc_expr
*x
)
5465 if (x
->expr_type
!= EXPR_CONSTANT
)
5468 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
5470 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5472 /* RRSPACING(+/- 0.0) = 0.0 */
5473 if (mpfr_zero_p (x
->value
.real
))
5475 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5479 /* RRSPACING(inf) = NaN */
5480 if (mpfr_inf_p (x
->value
.real
))
5482 mpfr_set_nan (result
->value
.real
);
5486 /* RRSPACING(NaN) = same NaN */
5487 if (mpfr_nan_p (x
->value
.real
))
5489 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5493 /* | x * 2**(-e) | * 2**p. */
5494 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5495 e
= - (long int) mpfr_get_exp (x
->value
.real
);
5496 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
5498 p
= (long int) gfc_real_kinds
[i
].digits
;
5499 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
5501 return range_check (result
, "RRSPACING");
5506 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
5508 int k
, neg_flag
, power
, exp_range
;
5509 mpfr_t scale
, radix
;
5512 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5515 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5517 if (mpfr_zero_p (x
->value
.real
))
5519 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5523 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5525 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
5527 /* This check filters out values of i that would overflow an int. */
5528 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
5529 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
5531 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
5532 gfc_free_expr (result
);
5533 return &gfc_bad_expr
;
5536 /* Compute scale = radix ** power. */
5537 power
= mpz_get_si (i
->value
.integer
);
5547 gfc_set_model_kind (x
->ts
.kind
);
5550 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
5551 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
5554 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5556 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5558 mpfr_clears (scale
, radix
, NULL
);
5560 return range_check (result
, "SCALE");
5564 /* Variants of strspn and strcspn that operate on wide characters. */
5567 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5570 const gfc_char_t
*c
;
5574 for (c
= s2
; *c
; c
++)
5588 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5591 const gfc_char_t
*c
;
5595 for (c
= s2
; *c
; c
++)
5610 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
5615 size_t indx
, len
, lenc
;
5616 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
5619 return &gfc_bad_expr
;
5621 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
5622 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
5625 if (b
!= NULL
&& b
->value
.logical
!= 0)
5630 len
= e
->value
.character
.length
;
5631 lenc
= c
->value
.character
.length
;
5633 if (len
== 0 || lenc
== 0)
5641 indx
= wide_strcspn (e
->value
.character
.string
,
5642 c
->value
.character
.string
) + 1;
5649 for (indx
= len
; indx
> 0; indx
--)
5651 for (i
= 0; i
< lenc
; i
++)
5653 if (c
->value
.character
.string
[i
]
5654 == e
->value
.character
.string
[indx
- 1])
5663 result
= gfc_get_int_expr (k
, &e
->where
, indx
);
5664 return range_check (result
, "SCAN");
5669 gfc_simplify_selected_char_kind (gfc_expr
*e
)
5673 if (e
->expr_type
!= EXPR_CONSTANT
)
5676 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
5677 || gfc_compare_with_Cstring (e
, "default", false) == 0)
5679 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
5684 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5689 gfc_simplify_selected_int_kind (gfc_expr
*e
)
5693 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
))
5698 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
5699 if (gfc_integer_kinds
[i
].range
>= range
5700 && gfc_integer_kinds
[i
].kind
< kind
)
5701 kind
= gfc_integer_kinds
[i
].kind
;
5703 if (kind
== INT_MAX
)
5706 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5711 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
, gfc_expr
*rdx
)
5713 int range
, precision
, radix
, i
, kind
, found_precision
, found_range
,
5715 locus
*loc
= &gfc_current_locus
;
5721 if (p
->expr_type
!= EXPR_CONSTANT
5722 || gfc_extract_int (p
, &precision
))
5731 if (q
->expr_type
!= EXPR_CONSTANT
5732 || gfc_extract_int (q
, &range
))
5743 if (rdx
->expr_type
!= EXPR_CONSTANT
5744 || gfc_extract_int (rdx
, &radix
))
5752 found_precision
= 0;
5756 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
5758 if (gfc_real_kinds
[i
].precision
>= precision
)
5759 found_precision
= 1;
5761 if (gfc_real_kinds
[i
].range
>= range
)
5764 if (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
5767 if (gfc_real_kinds
[i
].precision
>= precision
5768 && gfc_real_kinds
[i
].range
>= range
5769 && (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
5770 && gfc_real_kinds
[i
].kind
< kind
)
5771 kind
= gfc_real_kinds
[i
].kind
;
5774 if (kind
== INT_MAX
)
5776 if (found_radix
&& found_range
&& !found_precision
)
5778 else if (found_radix
&& found_precision
&& !found_range
)
5780 else if (found_radix
&& !found_precision
&& !found_range
)
5782 else if (found_radix
)
5788 return gfc_get_int_expr (gfc_default_integer_kind
, loc
, kind
);
5793 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
5796 mpfr_t exp
, absv
, log2
, pow2
, frac
;
5799 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5802 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5804 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
5805 SET_EXPONENT (NaN) = same NaN */
5806 if (mpfr_zero_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
5808 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5812 /* SET_EXPONENT (inf) = NaN */
5813 if (mpfr_inf_p (x
->value
.real
))
5815 mpfr_set_nan (result
->value
.real
);
5819 gfc_set_model_kind (x
->ts
.kind
);
5826 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
5827 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
5829 mpfr_trunc (log2
, log2
);
5830 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
5832 /* Old exponent value, and fraction. */
5833 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
5835 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
5838 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
5839 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
5841 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
5843 return range_check (result
, "SET_EXPONENT");
5848 gfc_simplify_shape (gfc_expr
*source
, gfc_expr
*kind
)
5850 mpz_t shape
[GFC_MAX_DIMENSIONS
];
5851 gfc_expr
*result
, *e
, *f
;
5855 int k
= get_kind (BT_INTEGER
, kind
, "SHAPE", gfc_default_integer_kind
);
5857 if (source
->rank
== -1)
5860 result
= gfc_get_array_expr (BT_INTEGER
, k
, &source
->where
);
5862 if (source
->rank
== 0)
5865 if (source
->expr_type
== EXPR_VARIABLE
)
5867 ar
= gfc_find_array_ref (source
);
5868 t
= gfc_array_ref_shape (ar
, shape
);
5870 else if (source
->shape
)
5873 for (n
= 0; n
< source
->rank
; n
++)
5875 mpz_init (shape
[n
]);
5876 mpz_set (shape
[n
], source
->shape
[n
]);
5882 for (n
= 0; n
< source
->rank
; n
++)
5884 e
= gfc_get_constant_expr (BT_INTEGER
, k
, &source
->where
);
5887 mpz_set (e
->value
.integer
, shape
[n
]);
5890 mpz_set_ui (e
->value
.integer
, n
+ 1);
5892 f
= simplify_size (source
, e
, k
);
5896 gfc_free_expr (result
);
5903 if (e
== &gfc_bad_expr
|| range_check (e
, "SHAPE") == &gfc_bad_expr
)
5905 gfc_free_expr (result
);
5907 gfc_clear_shape (shape
, source
->rank
);
5908 return &gfc_bad_expr
;
5911 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
5915 gfc_clear_shape (shape
, source
->rank
);
5922 simplify_size (gfc_expr
*array
, gfc_expr
*dim
, int k
)
5925 gfc_expr
*return_value
;
5928 /* For unary operations, the size of the result is given by the size
5929 of the operand. For binary ones, it's the size of the first operand
5930 unless it is scalar, then it is the size of the second. */
5931 if (array
->expr_type
== EXPR_OP
&& !array
->value
.op
.uop
)
5933 gfc_expr
* replacement
;
5934 gfc_expr
* simplified
;
5936 switch (array
->value
.op
.op
)
5938 /* Unary operations. */
5940 case INTRINSIC_UPLUS
:
5941 case INTRINSIC_UMINUS
:
5942 case INTRINSIC_PARENTHESES
:
5943 replacement
= array
->value
.op
.op1
;
5946 /* Binary operations. If any one of the operands is scalar, take
5947 the other one's size. If both of them are arrays, it does not
5948 matter -- try to find one with known shape, if possible. */
5950 if (array
->value
.op
.op1
->rank
== 0)
5951 replacement
= array
->value
.op
.op2
;
5952 else if (array
->value
.op
.op2
->rank
== 0)
5953 replacement
= array
->value
.op
.op1
;
5956 simplified
= simplify_size (array
->value
.op
.op1
, dim
, k
);
5960 replacement
= array
->value
.op
.op2
;
5965 /* Try to reduce it directly if possible. */
5966 simplified
= simplify_size (replacement
, dim
, k
);
5968 /* Otherwise, we build a new SIZE call. This is hopefully at least
5969 simpler than the original one. */
5972 gfc_expr
*kind
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, k
);
5973 simplified
= gfc_build_intrinsic_call (gfc_current_ns
,
5974 GFC_ISYM_SIZE
, "size",
5976 gfc_copy_expr (replacement
),
5977 gfc_copy_expr (dim
),
5985 if (!gfc_array_size (array
, &size
))
5990 if (dim
->expr_type
!= EXPR_CONSTANT
)
5993 d
= mpz_get_ui (dim
->value
.integer
) - 1;
5994 if (!gfc_array_dimen_size (array
, d
, &size
))
5998 return_value
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
5999 mpz_set (return_value
->value
.integer
, size
);
6002 return return_value
;
6007 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6010 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
6013 return &gfc_bad_expr
;
6015 result
= simplify_size (array
, dim
, k
);
6016 if (result
== NULL
|| result
== &gfc_bad_expr
)
6019 return range_check (result
, "SIZE");
6023 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
6024 multiplied by the array size. */
6027 gfc_simplify_sizeof (gfc_expr
*x
)
6029 gfc_expr
*result
= NULL
;
6032 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6035 if (x
->ts
.type
== BT_CHARACTER
6036 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6037 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6040 if (x
->rank
&& x
->expr_type
!= EXPR_ARRAY
6041 && !gfc_array_size (x
, &array_size
))
6044 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_index_integer_kind
,
6046 mpz_set_si (result
->value
.integer
, gfc_target_expr_size (x
));
6052 /* STORAGE_SIZE returns the size in bits of a single array element. */
6055 gfc_simplify_storage_size (gfc_expr
*x
,
6058 gfc_expr
*result
= NULL
;
6061 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6064 if (x
->ts
.type
== BT_CHARACTER
&& x
->expr_type
!= EXPR_CONSTANT
6065 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6066 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6069 k
= get_kind (BT_INTEGER
, kind
, "STORAGE_SIZE", gfc_default_integer_kind
);
6071 return &gfc_bad_expr
;
6073 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
6075 mpz_set_si (result
->value
.integer
, gfc_element_size (x
));
6076 mpz_mul_ui (result
->value
.integer
, result
->value
.integer
, BITS_PER_UNIT
);
6078 return range_check (result
, "STORAGE_SIZE");
6083 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
6087 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6090 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6095 mpz_abs (result
->value
.integer
, x
->value
.integer
);
6096 if (mpz_sgn (y
->value
.integer
) < 0)
6097 mpz_neg (result
->value
.integer
, result
->value
.integer
);
6102 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
6105 mpfr_setsign (result
->value
.real
, x
->value
.real
,
6106 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
6110 gfc_internal_error ("Bad type in gfc_simplify_sign");
6118 gfc_simplify_sin (gfc_expr
*x
)
6122 if (x
->expr_type
!= EXPR_CONSTANT
)
6125 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6130 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6134 gfc_set_model (x
->value
.real
);
6135 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6139 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
6142 return range_check (result
, "SIN");
6147 gfc_simplify_sinh (gfc_expr
*x
)
6151 if (x
->expr_type
!= EXPR_CONSTANT
)
6154 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6159 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6163 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6170 return range_check (result
, "SINH");
6174 /* The argument is always a double precision real that is converted to
6175 single precision. TODO: Rounding! */
6178 gfc_simplify_sngl (gfc_expr
*a
)
6182 if (a
->expr_type
!= EXPR_CONSTANT
)
6185 result
= gfc_real2real (a
, gfc_default_real_kind
);
6186 return range_check (result
, "SNGL");
6191 gfc_simplify_spacing (gfc_expr
*x
)
6197 if (x
->expr_type
!= EXPR_CONSTANT
)
6200 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
6201 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6203 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
6204 if (mpfr_zero_p (x
->value
.real
))
6206 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
6210 /* SPACING(inf) = NaN */
6211 if (mpfr_inf_p (x
->value
.real
))
6213 mpfr_set_nan (result
->value
.real
);
6217 /* SPACING(NaN) = same NaN */
6218 if (mpfr_nan_p (x
->value
.real
))
6220 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6224 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
6225 are the radix, exponent of x, and precision. This excludes the
6226 possibility of subnormal numbers. Fortran 2003 states the result is
6227 b**max(e - p, emin - 1). */
6229 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
6230 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
6231 en
= en
> ep
? en
: ep
;
6233 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
6234 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
6236 return range_check (result
, "SPACING");
6241 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
6243 gfc_expr
*result
= NULL
;
6244 int nelem
, i
, j
, dim
, ncopies
;
6247 if ((!gfc_is_constant_expr (source
)
6248 && !is_constant_array_expr (source
))
6249 || !gfc_is_constant_expr (dim_expr
)
6250 || !gfc_is_constant_expr (ncopies_expr
))
6253 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
6254 gfc_extract_int (dim_expr
, &dim
);
6255 dim
-= 1; /* zero-base DIM */
6257 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
6258 gfc_extract_int (ncopies_expr
, &ncopies
);
6259 ncopies
= MAX (ncopies
, 0);
6261 /* Do not allow the array size to exceed the limit for an array
6263 if (source
->expr_type
== EXPR_ARRAY
)
6265 if (!gfc_array_size (source
, &size
))
6266 gfc_internal_error ("Failure getting length of a constant array.");
6269 mpz_init_set_ui (size
, 1);
6271 nelem
= mpz_get_si (size
) * ncopies
;
6272 if (nelem
> flag_max_array_constructor
)
6274 if (gfc_current_ns
->sym_root
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
6276 gfc_error ("The number of elements (%d) in the array constructor "
6277 "at %L requires an increase of the allowed %d upper "
6278 "limit. See %<-fmax-array-constructor%> option.",
6279 nelem
, &source
->where
, flag_max_array_constructor
);
6280 return &gfc_bad_expr
;
6286 if (source
->expr_type
== EXPR_CONSTANT
)
6288 gcc_assert (dim
== 0);
6290 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6292 if (source
->ts
.type
== BT_DERIVED
)
6293 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6295 result
->shape
= gfc_get_shape (result
->rank
);
6296 mpz_init_set_si (result
->shape
[0], ncopies
);
6298 for (i
= 0; i
< ncopies
; ++i
)
6299 gfc_constructor_append_expr (&result
->value
.constructor
,
6300 gfc_copy_expr (source
), NULL
);
6302 else if (source
->expr_type
== EXPR_ARRAY
)
6304 int offset
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
6305 gfc_constructor
*source_ctor
;
6307 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
6308 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
6310 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6312 if (source
->ts
.type
== BT_DERIVED
)
6313 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6314 result
->rank
= source
->rank
+ 1;
6315 result
->shape
= gfc_get_shape (result
->rank
);
6317 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
6320 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
6322 mpz_init_set_si (result
->shape
[i
], ncopies
);
6324 extent
[i
] = mpz_get_si (result
->shape
[i
]);
6325 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
6329 for (source_ctor
= gfc_constructor_first (source
->value
.constructor
);
6330 source_ctor
; source_ctor
= gfc_constructor_next (source_ctor
))
6332 for (i
= 0; i
< ncopies
; ++i
)
6333 gfc_constructor_insert_expr (&result
->value
.constructor
,
6334 gfc_copy_expr (source_ctor
->expr
),
6335 NULL
, offset
+ i
* rstride
[dim
]);
6337 offset
+= (dim
== 0 ? ncopies
: 1);
6342 gfc_error ("Simplification of SPREAD at %C not yet implemented");
6343 return &gfc_bad_expr
;
6346 if (source
->ts
.type
== BT_CHARACTER
)
6347 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
6354 gfc_simplify_sqrt (gfc_expr
*e
)
6356 gfc_expr
*result
= NULL
;
6358 if (e
->expr_type
!= EXPR_CONSTANT
)
6364 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
6366 gfc_error ("Argument of SQRT at %L has a negative value",
6368 return &gfc_bad_expr
;
6370 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6371 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
6375 gfc_set_model (e
->value
.real
);
6377 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6378 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
6382 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
6385 return range_check (result
, "SQRT");
6390 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
6392 return simplify_transformation (array
, dim
, mask
, 0, gfc_add
);
6397 gfc_simplify_cotan (gfc_expr
*x
)
6402 if (x
->expr_type
!= EXPR_CONSTANT
)
6405 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6410 mpfr_cot (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6414 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
6415 val
= &result
->value
.complex;
6416 mpc_init2 (swp
, mpfr_get_default_prec ());
6417 mpc_cos (swp
, x
->value
.complex, GFC_MPC_RND_MODE
);
6418 mpc_sin (*val
, x
->value
.complex, GFC_MPC_RND_MODE
);
6419 mpc_div (*val
, swp
, *val
, GFC_MPC_RND_MODE
);
6427 return range_check (result
, "COTAN");
6432 gfc_simplify_tan (gfc_expr
*x
)
6436 if (x
->expr_type
!= EXPR_CONSTANT
)
6439 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6444 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6448 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6455 return range_check (result
, "TAN");
6460 gfc_simplify_tanh (gfc_expr
*x
)
6464 if (x
->expr_type
!= EXPR_CONSTANT
)
6467 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6472 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6476 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6483 return range_check (result
, "TANH");
6488 gfc_simplify_tiny (gfc_expr
*e
)
6493 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
6495 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
6496 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
6503 gfc_simplify_trailz (gfc_expr
*e
)
6505 unsigned long tz
, bs
;
6508 if (e
->expr_type
!= EXPR_CONSTANT
)
6511 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
6512 bs
= gfc_integer_kinds
[i
].bit_size
;
6513 tz
= mpz_scan1 (e
->value
.integer
, 0);
6515 return gfc_get_int_expr (gfc_default_integer_kind
,
6516 &e
->where
, MIN (tz
, bs
));
6521 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
6524 gfc_expr
*mold_element
;
6529 unsigned char *buffer
;
6530 size_t result_length
;
6533 if (!gfc_is_constant_expr (source
)
6534 || (gfc_init_expr_flag
&& !gfc_is_constant_expr (mold
))
6535 || !gfc_is_constant_expr (size
))
6538 if (!gfc_calculate_transfer_sizes (source
, mold
, size
, &source_size
,
6539 &result_size
, &result_length
))
6542 /* Calculate the size of the source. */
6543 if (source
->expr_type
== EXPR_ARRAY
6544 && !gfc_array_size (source
, &tmp
))
6545 gfc_internal_error ("Failure getting length of a constant array.");
6547 /* Create an empty new expression with the appropriate characteristics. */
6548 result
= gfc_get_constant_expr (mold
->ts
.type
, mold
->ts
.kind
,
6550 result
->ts
= mold
->ts
;
6552 mold_element
= mold
->expr_type
== EXPR_ARRAY
6553 ? gfc_constructor_first (mold
->value
.constructor
)->expr
6556 /* Set result character length, if needed. Note that this needs to be
6557 set even for array expressions, in order to pass this information into
6558 gfc_target_interpret_expr. */
6559 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
6560 result
->value
.character
.length
= mold_element
->value
.character
.length
;
6562 /* Set the number of elements in the result, and determine its size. */
6564 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
6566 result
->expr_type
= EXPR_ARRAY
;
6568 result
->shape
= gfc_get_shape (1);
6569 mpz_init_set_ui (result
->shape
[0], result_length
);
6574 /* Allocate the buffer to store the binary version of the source. */
6575 buffer_size
= MAX (source_size
, result_size
);
6576 buffer
= (unsigned char*)alloca (buffer_size
);
6577 memset (buffer
, 0, buffer_size
);
6579 /* Now write source to the buffer. */
6580 gfc_target_encode_expr (source
, buffer
, buffer_size
);
6582 /* And read the buffer back into the new expression. */
6583 gfc_target_interpret_expr (buffer
, buffer_size
, result
, false);
6590 gfc_simplify_transpose (gfc_expr
*matrix
)
6592 int row
, matrix_rows
, col
, matrix_cols
;
6595 if (!is_constant_array_expr (matrix
))
6598 gcc_assert (matrix
->rank
== 2);
6600 result
= gfc_get_array_expr (matrix
->ts
.type
, matrix
->ts
.kind
,
6603 result
->shape
= gfc_get_shape (result
->rank
);
6604 mpz_set (result
->shape
[0], matrix
->shape
[1]);
6605 mpz_set (result
->shape
[1], matrix
->shape
[0]);
6607 if (matrix
->ts
.type
== BT_CHARACTER
)
6608 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
6609 else if (matrix
->ts
.type
== BT_DERIVED
)
6610 result
->ts
.u
.derived
= matrix
->ts
.u
.derived
;
6612 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
6613 matrix_cols
= mpz_get_si (matrix
->shape
[1]);
6614 for (row
= 0; row
< matrix_rows
; ++row
)
6615 for (col
= 0; col
< matrix_cols
; ++col
)
6617 gfc_expr
*e
= gfc_constructor_lookup_expr (matrix
->value
.constructor
,
6618 col
* matrix_rows
+ row
);
6619 gfc_constructor_insert_expr (&result
->value
.constructor
,
6620 gfc_copy_expr (e
), &matrix
->where
,
6621 row
* matrix_cols
+ col
);
6629 gfc_simplify_trim (gfc_expr
*e
)
6632 int count
, i
, len
, lentrim
;
6634 if (e
->expr_type
!= EXPR_CONSTANT
)
6637 len
= e
->value
.character
.length
;
6638 for (count
= 0, i
= 1; i
<= len
; ++i
)
6640 if (e
->value
.character
.string
[len
- i
] == ' ')
6646 lentrim
= len
- count
;
6648 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, lentrim
);
6649 for (i
= 0; i
< lentrim
; i
++)
6650 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
6657 gfc_simplify_image_index (gfc_expr
*coarray
, gfc_expr
*sub
)
6662 gfc_constructor
*sub_cons
;
6666 if (!is_constant_array_expr (sub
))
6669 /* Follow any component references. */
6670 as
= coarray
->symtree
->n
.sym
->as
;
6671 for (ref
= coarray
->ref
; ref
; ref
= ref
->next
)
6672 if (ref
->type
== REF_COMPONENT
)
6675 if (as
->type
== AS_DEFERRED
)
6678 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6679 the cosubscript addresses the first image. */
6681 sub_cons
= gfc_constructor_first (sub
->value
.constructor
);
6684 for (d
= 1; d
<= as
->corank
; d
++)
6689 gcc_assert (sub_cons
!= NULL
);
6691 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 0, as
,
6693 if (ca_bound
== NULL
)
6696 if (ca_bound
== &gfc_bad_expr
)
6699 cmp
= mpz_cmp (ca_bound
->value
.integer
, sub_cons
->expr
->value
.integer
);
6703 gfc_free_expr (ca_bound
);
6704 sub_cons
= gfc_constructor_next (sub_cons
);
6708 first_image
= false;
6712 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6713 "SUB has %ld and COARRAY lower bound is %ld)",
6715 mpz_get_si (sub_cons
->expr
->value
.integer
),
6716 mpz_get_si (ca_bound
->value
.integer
));
6717 gfc_free_expr (ca_bound
);
6718 return &gfc_bad_expr
;
6721 gfc_free_expr (ca_bound
);
6723 /* Check whether upperbound is valid for the multi-images case. */
6726 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 1, as
,
6728 if (ca_bound
== &gfc_bad_expr
)
6731 if (ca_bound
&& ca_bound
->expr_type
== EXPR_CONSTANT
6732 && mpz_cmp (ca_bound
->value
.integer
,
6733 sub_cons
->expr
->value
.integer
) < 0)
6735 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6736 "SUB has %ld and COARRAY upper bound is %ld)",
6738 mpz_get_si (sub_cons
->expr
->value
.integer
),
6739 mpz_get_si (ca_bound
->value
.integer
));
6740 gfc_free_expr (ca_bound
);
6741 return &gfc_bad_expr
;
6745 gfc_free_expr (ca_bound
);
6748 sub_cons
= gfc_constructor_next (sub_cons
);
6751 gcc_assert (sub_cons
== NULL
);
6753 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
&& !first_image
)
6756 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6757 &gfc_current_locus
);
6759 mpz_set_si (result
->value
.integer
, 1);
6761 mpz_set_si (result
->value
.integer
, 0);
6768 gfc_simplify_this_image (gfc_expr
*coarray
, gfc_expr
*dim
,
6769 gfc_expr
*distance ATTRIBUTE_UNUSED
)
6771 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
6774 /* If no coarray argument has been passed or when the first argument
6775 is actually a distance argment. */
6776 if (coarray
== NULL
|| !gfc_is_coarray (coarray
))
6779 /* FIXME: gfc_current_locus is wrong. */
6780 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6781 &gfc_current_locus
);
6782 mpz_set_si (result
->value
.integer
, 1);
6786 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6787 return simplify_cobound (coarray
, dim
, NULL
, 0);
6792 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6794 return simplify_bound (array
, dim
, kind
, 1);
6798 gfc_simplify_ucobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6800 return simplify_cobound (array
, dim
, kind
, 1);
6805 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
6807 gfc_expr
*result
, *e
;
6808 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
6810 if (!is_constant_array_expr (vector
)
6811 || !is_constant_array_expr (mask
)
6812 || (!gfc_is_constant_expr (field
)
6813 && !is_constant_array_expr (field
)))
6816 result
= gfc_get_array_expr (vector
->ts
.type
, vector
->ts
.kind
,
6818 if (vector
->ts
.type
== BT_DERIVED
)
6819 result
->ts
.u
.derived
= vector
->ts
.u
.derived
;
6820 result
->rank
= mask
->rank
;
6821 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
6823 if (vector
->ts
.type
== BT_CHARACTER
)
6824 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
6826 vector_ctor
= gfc_constructor_first (vector
->value
.constructor
);
6827 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
6829 = field
->expr_type
== EXPR_ARRAY
6830 ? gfc_constructor_first (field
->value
.constructor
)
6835 if (mask_ctor
->expr
->value
.logical
)
6837 gcc_assert (vector_ctor
);
6838 e
= gfc_copy_expr (vector_ctor
->expr
);
6839 vector_ctor
= gfc_constructor_next (vector_ctor
);
6841 else if (field
->expr_type
== EXPR_ARRAY
)
6842 e
= gfc_copy_expr (field_ctor
->expr
);
6844 e
= gfc_copy_expr (field
);
6846 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
6848 mask_ctor
= gfc_constructor_next (mask_ctor
);
6849 field_ctor
= gfc_constructor_next (field_ctor
);
6857 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
6861 size_t index
, len
, lenset
;
6863 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
6866 return &gfc_bad_expr
;
6868 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
6869 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
6872 if (b
!= NULL
&& b
->value
.logical
!= 0)
6877 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &s
->where
);
6879 len
= s
->value
.character
.length
;
6880 lenset
= set
->value
.character
.length
;
6884 mpz_set_ui (result
->value
.integer
, 0);
6892 mpz_set_ui (result
->value
.integer
, 1);
6896 index
= wide_strspn (s
->value
.character
.string
,
6897 set
->value
.character
.string
) + 1;
6906 mpz_set_ui (result
->value
.integer
, len
);
6909 for (index
= len
; index
> 0; index
--)
6911 for (i
= 0; i
< lenset
; i
++)
6913 if (s
->value
.character
.string
[index
- 1]
6914 == set
->value
.character
.string
[i
])
6922 mpz_set_ui (result
->value
.integer
, index
);
6928 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
6933 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6936 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
6941 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
6942 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
6943 return range_check (result
, "XOR");
6946 return gfc_get_logical_expr (kind
, &x
->where
,
6947 (x
->value
.logical
&& !y
->value
.logical
)
6948 || (!x
->value
.logical
&& y
->value
.logical
));
6956 /****************** Constant simplification *****************/
6958 /* Master function to convert one constant to another. While this is
6959 used as a simplification function, it requires the destination type
6960 and kind information which is supplied by a special case in
6964 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
6966 gfc_expr
*g
, *result
, *(*f
) (gfc_expr
*, int);
6981 f
= gfc_int2complex
;
7001 f
= gfc_real2complex
;
7012 f
= gfc_complex2int
;
7015 f
= gfc_complex2real
;
7018 f
= gfc_complex2complex
;
7044 f
= gfc_hollerith2int
;
7048 f
= gfc_hollerith2real
;
7052 f
= gfc_hollerith2complex
;
7056 f
= gfc_hollerith2character
;
7060 f
= gfc_hollerith2logical
;
7070 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
7075 switch (e
->expr_type
)
7078 result
= f (e
, kind
);
7080 return &gfc_bad_expr
;
7084 if (!gfc_is_constant_expr (e
))
7087 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
7088 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
7089 result
->rank
= e
->rank
;
7091 for (c
= gfc_constructor_first (e
->value
.constructor
);
7092 c
; c
= gfc_constructor_next (c
))
7095 if (c
->iterator
== NULL
)
7096 tmp
= f (c
->expr
, kind
);
7099 g
= gfc_convert_constant (c
->expr
, type
, kind
);
7100 if (g
== &gfc_bad_expr
)
7102 gfc_free_expr (result
);
7110 gfc_free_expr (result
);
7114 gfc_constructor_append_expr (&result
->value
.constructor
,
7128 /* Function for converting character constants. */
7130 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
7135 if (!gfc_is_constant_expr (e
))
7138 if (e
->expr_type
== EXPR_CONSTANT
)
7140 /* Simple case of a scalar. */
7141 result
= gfc_get_constant_expr (BT_CHARACTER
, kind
, &e
->where
);
7143 return &gfc_bad_expr
;
7145 result
->value
.character
.length
= e
->value
.character
.length
;
7146 result
->value
.character
.string
7147 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
7148 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
7149 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
7151 /* Check we only have values representable in the destination kind. */
7152 for (i
= 0; i
< result
->value
.character
.length
; i
++)
7153 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
7156 gfc_error ("Character %qs in string at %L cannot be converted "
7157 "into character kind %d",
7158 gfc_print_wide_char (result
->value
.character
.string
[i
]),
7160 gfc_free_expr (result
);
7161 return &gfc_bad_expr
;
7166 else if (e
->expr_type
== EXPR_ARRAY
)
7168 /* For an array constructor, we convert each constructor element. */
7171 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
7172 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
7173 result
->rank
= e
->rank
;
7174 result
->ts
.u
.cl
= e
->ts
.u
.cl
;
7176 for (c
= gfc_constructor_first (e
->value
.constructor
);
7177 c
; c
= gfc_constructor_next (c
))
7179 gfc_expr
*tmp
= gfc_convert_char_constant (c
->expr
, type
, kind
);
7180 if (tmp
== &gfc_bad_expr
)
7182 gfc_free_expr (result
);
7183 return &gfc_bad_expr
;
7188 gfc_free_expr (result
);
7192 gfc_constructor_append_expr (&result
->value
.constructor
,
7204 gfc_simplify_compiler_options (void)
7209 str
= gfc_get_option_string ();
7210 result
= gfc_get_character_expr (gfc_default_character_kind
,
7211 &gfc_current_locus
, str
, strlen (str
));
7218 gfc_simplify_compiler_version (void)
7223 len
= strlen ("GCC version ") + strlen (version_string
);
7224 buffer
= XALLOCAVEC (char, len
+ 1);
7225 snprintf (buffer
, len
+ 1, "GCC version %s", version_string
);
7226 return gfc_get_character_expr (gfc_default_character_kind
,
7227 &gfc_current_locus
, buffer
, len
);
7230 /* Simplification routines for intrinsics of IEEE modules. */
7233 simplify_ieee_selected_real_kind (gfc_expr
*expr
)
7235 gfc_actual_arglist
*arg
;
7236 gfc_expr
*p
= NULL
, *q
= NULL
, *rdx
= NULL
;
7238 arg
= expr
->value
.function
.actual
;
7242 q
= arg
->next
->expr
;
7243 if (arg
->next
->next
)
7244 rdx
= arg
->next
->next
->expr
;
7247 /* Currently, if IEEE is supported and this module is built, it means
7248 all our floating-point types conform to IEEE. Hence, we simply handle
7249 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
7250 return gfc_simplify_selected_real_kind (p
, q
, rdx
);
7254 simplify_ieee_support (gfc_expr
*expr
)
7256 /* We consider that if the IEEE modules are loaded, we have full support
7257 for flags, halting and rounding, which are the three functions
7258 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
7259 expressions. One day, we will need libgfortran to detect support and
7260 communicate it back to us, allowing for partial support. */
7262 return gfc_get_logical_expr (gfc_default_logical_kind
, &expr
->where
,
7267 matches_ieee_function_name (gfc_symbol
*sym
, const char *name
)
7269 int n
= strlen(name
);
7271 if (!strncmp(sym
->name
, name
, n
))
7274 /* If a generic was used and renamed, we need more work to find out.
7275 Compare the specific name. */
7276 if (sym
->generic
&& !strncmp(sym
->generic
->sym
->name
, name
, n
))
7283 gfc_simplify_ieee_functions (gfc_expr
*expr
)
7285 gfc_symbol
* sym
= expr
->symtree
->n
.sym
;
7287 if (matches_ieee_function_name(sym
, "ieee_selected_real_kind"))
7288 return simplify_ieee_selected_real_kind (expr
);
7289 else if (matches_ieee_function_name(sym
, "ieee_support_flag")
7290 || matches_ieee_function_name(sym
, "ieee_support_halting")
7291 || matches_ieee_function_name(sym
, "ieee_support_rounding"))
7292 return simplify_ieee_support (expr
);