1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2016 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
) != NULL
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
)
622 /* Place updated expression in result constructor. */
623 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
624 for (i
= 0; i
< resultsize
; ++i
)
627 result_ctor
->expr
= post_op (result_ctor
->expr
, resultvec
[i
]);
629 result_ctor
->expr
= resultvec
[i
];
630 result_ctor
= gfc_constructor_next (result_ctor
);
640 simplify_transformation (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
641 int init_val
, transformational_op op
)
645 if (!is_constant_array_expr (array
)
646 || !gfc_is_constant_expr (dim
))
650 && !is_constant_array_expr (mask
)
651 && mask
->expr_type
!= EXPR_CONSTANT
)
654 result
= transformational_result (array
, dim
, array
->ts
.type
,
655 array
->ts
.kind
, &array
->where
);
656 init_result_expr (result
, init_val
, NULL
);
658 return !dim
|| array
->rank
== 1 ?
659 simplify_transformation_to_scalar (result
, array
, mask
, op
) :
660 simplify_transformation_to_array (result
, array
, dim
, mask
, op
, NULL
);
664 /********************** Simplification functions *****************************/
667 gfc_simplify_abs (gfc_expr
*e
)
671 if (e
->expr_type
!= EXPR_CONSTANT
)
677 result
= gfc_get_constant_expr (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
678 mpz_abs (result
->value
.integer
, e
->value
.integer
);
679 return range_check (result
, "IABS");
682 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
683 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
684 return range_check (result
, "ABS");
687 gfc_set_model_kind (e
->ts
.kind
);
688 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
689 mpc_abs (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
690 return range_check (result
, "CABS");
693 gfc_internal_error ("gfc_simplify_abs(): Bad type");
699 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
703 bool too_large
= false;
705 if (e
->expr_type
!= EXPR_CONSTANT
)
708 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
710 return &gfc_bad_expr
;
712 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
714 gfc_error ("Argument of %s function at %L is negative", name
,
716 return &gfc_bad_expr
;
719 if (ascii
&& warn_surprising
&& mpz_cmp_si (e
->value
.integer
, 127) > 0)
720 gfc_warning (OPT_Wsurprising
,
721 "Argument of %s function at %L outside of range [0,127]",
724 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
729 mpz_init_set_ui (t
, 2);
730 mpz_pow_ui (t
, t
, 32);
731 mpz_sub_ui (t
, t
, 1);
732 if (mpz_cmp (e
->value
.integer
, t
) > 0)
739 gfc_error ("Argument of %s function at %L is too large for the "
740 "collating sequence of kind %d", name
, &e
->where
, kind
);
741 return &gfc_bad_expr
;
744 result
= gfc_get_character_expr (kind
, &e
->where
, NULL
, 1);
745 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
752 /* We use the processor's collating sequence, because all
753 systems that gfortran currently works on are ASCII. */
756 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
758 return simplify_achar_char (e
, k
, "ACHAR", true);
763 gfc_simplify_acos (gfc_expr
*x
)
767 if (x
->expr_type
!= EXPR_CONSTANT
)
773 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
774 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
776 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
778 return &gfc_bad_expr
;
780 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
781 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
785 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
786 mpc_acos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
790 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
793 return range_check (result
, "ACOS");
797 gfc_simplify_acosh (gfc_expr
*x
)
801 if (x
->expr_type
!= EXPR_CONSTANT
)
807 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
809 gfc_error ("Argument of ACOSH at %L must not be less than 1",
811 return &gfc_bad_expr
;
814 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
815 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
819 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
820 mpc_acosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
824 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
827 return range_check (result
, "ACOSH");
831 gfc_simplify_adjustl (gfc_expr
*e
)
837 if (e
->expr_type
!= EXPR_CONSTANT
)
840 len
= e
->value
.character
.length
;
842 for (count
= 0, i
= 0; i
< len
; ++i
)
844 ch
= e
->value
.character
.string
[i
];
850 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
851 for (i
= 0; i
< len
- count
; ++i
)
852 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
859 gfc_simplify_adjustr (gfc_expr
*e
)
865 if (e
->expr_type
!= EXPR_CONSTANT
)
868 len
= e
->value
.character
.length
;
870 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
872 ch
= e
->value
.character
.string
[i
];
878 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
879 for (i
= 0; i
< count
; ++i
)
880 result
->value
.character
.string
[i
] = ' ';
882 for (i
= count
; i
< len
; ++i
)
883 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
890 gfc_simplify_aimag (gfc_expr
*e
)
894 if (e
->expr_type
!= EXPR_CONSTANT
)
897 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
898 mpfr_set (result
->value
.real
, mpc_imagref (e
->value
.complex), GFC_RND_MODE
);
900 return range_check (result
, "AIMAG");
905 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
907 gfc_expr
*rtrunc
, *result
;
910 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
912 return &gfc_bad_expr
;
914 if (e
->expr_type
!= EXPR_CONSTANT
)
917 rtrunc
= gfc_copy_expr (e
);
918 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
920 result
= gfc_real2real (rtrunc
, kind
);
922 gfc_free_expr (rtrunc
);
924 return range_check (result
, "AINT");
929 gfc_simplify_all (gfc_expr
*mask
, gfc_expr
*dim
)
931 return simplify_transformation (mask
, dim
, NULL
, true, gfc_and
);
936 gfc_simplify_dint (gfc_expr
*e
)
938 gfc_expr
*rtrunc
, *result
;
940 if (e
->expr_type
!= EXPR_CONSTANT
)
943 rtrunc
= gfc_copy_expr (e
);
944 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
946 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
948 gfc_free_expr (rtrunc
);
950 return range_check (result
, "DINT");
955 gfc_simplify_dreal (gfc_expr
*e
)
957 gfc_expr
*result
= NULL
;
959 if (e
->expr_type
!= EXPR_CONSTANT
)
962 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
963 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
965 return range_check (result
, "DREAL");
970 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
975 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
977 return &gfc_bad_expr
;
979 if (e
->expr_type
!= EXPR_CONSTANT
)
982 result
= gfc_get_constant_expr (e
->ts
.type
, kind
, &e
->where
);
983 mpfr_round (result
->value
.real
, e
->value
.real
);
985 return range_check (result
, "ANINT");
990 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
995 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
998 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1003 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
1004 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1005 return range_check (result
, "AND");
1008 return gfc_get_logical_expr (kind
, &x
->where
,
1009 x
->value
.logical
&& y
->value
.logical
);
1018 gfc_simplify_any (gfc_expr
*mask
, gfc_expr
*dim
)
1020 return simplify_transformation (mask
, dim
, NULL
, false, gfc_or
);
1025 gfc_simplify_dnint (gfc_expr
*e
)
1029 if (e
->expr_type
!= EXPR_CONSTANT
)
1032 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &e
->where
);
1033 mpfr_round (result
->value
.real
, e
->value
.real
);
1035 return range_check (result
, "DNINT");
1040 gfc_simplify_asin (gfc_expr
*x
)
1044 if (x
->expr_type
!= EXPR_CONSTANT
)
1050 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1051 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1053 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1055 return &gfc_bad_expr
;
1057 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1058 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1062 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1063 mpc_asin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1067 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1070 return range_check (result
, "ASIN");
1075 gfc_simplify_asinh (gfc_expr
*x
)
1079 if (x
->expr_type
!= EXPR_CONSTANT
)
1082 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1087 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1091 mpc_asinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1095 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1098 return range_check (result
, "ASINH");
1103 gfc_simplify_atan (gfc_expr
*x
)
1107 if (x
->expr_type
!= EXPR_CONSTANT
)
1110 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1115 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1119 mpc_atan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1123 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1126 return range_check (result
, "ATAN");
1131 gfc_simplify_atanh (gfc_expr
*x
)
1135 if (x
->expr_type
!= EXPR_CONSTANT
)
1141 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
1142 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
1144 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1146 return &gfc_bad_expr
;
1148 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1149 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1153 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1154 mpc_atanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1158 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1161 return range_check (result
, "ATANH");
1166 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
1170 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1173 if (mpfr_zero_p (y
->value
.real
) && mpfr_zero_p (x
->value
.real
))
1175 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1176 "second argument must not be zero", &x
->where
);
1177 return &gfc_bad_expr
;
1180 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1181 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1183 return range_check (result
, "ATAN2");
1188 gfc_simplify_bessel_j0 (gfc_expr
*x
)
1192 if (x
->expr_type
!= EXPR_CONSTANT
)
1195 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1196 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1198 return range_check (result
, "BESSEL_J0");
1203 gfc_simplify_bessel_j1 (gfc_expr
*x
)
1207 if (x
->expr_type
!= EXPR_CONSTANT
)
1210 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1211 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1213 return range_check (result
, "BESSEL_J1");
1218 gfc_simplify_bessel_jn (gfc_expr
*order
, gfc_expr
*x
)
1223 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1226 n
= mpz_get_si (order
->value
.integer
);
1227 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1228 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1230 return range_check (result
, "BESSEL_JN");
1234 /* Simplify transformational form of JN and YN. */
1237 gfc_simplify_bessel_n2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
,
1244 mpfr_t x2rev
, last1
, last2
;
1246 if (x
->expr_type
!= EXPR_CONSTANT
|| order1
->expr_type
!= EXPR_CONSTANT
1247 || order2
->expr_type
!= EXPR_CONSTANT
)
1250 n1
= mpz_get_si (order1
->value
.integer
);
1251 n2
= mpz_get_si (order2
->value
.integer
);
1252 result
= gfc_get_array_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1254 result
->shape
= gfc_get_shape (1);
1255 mpz_init_set_ui (result
->shape
[0], MAX (n2
-n1
+1, 0));
1260 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1261 YN(N, 0.0) = -Inf. */
1263 if (mpfr_cmp_ui (x
->value
.real
, 0.0) == 0)
1265 if (!jn
&& flag_range_check
)
1267 gfc_error ("Result of BESSEL_YN is -INF at %L", &result
->where
);
1268 gfc_free_expr (result
);
1269 return &gfc_bad_expr
;
1274 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1275 mpfr_set_ui (e
->value
.real
, 1, GFC_RND_MODE
);
1276 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1281 for (i
= n1
; i
<= n2
; i
++)
1283 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1285 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
1287 mpfr_set_inf (e
->value
.real
, -1);
1288 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1295 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1296 are stable for downward recursion and Neumann functions are stable
1297 for upward recursion. It is
1299 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1300 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1301 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1303 gfc_set_model_kind (x
->ts
.kind
);
1305 /* Get first recursion anchor. */
1309 mpfr_jn (last1
, n2
, x
->value
.real
, GFC_RND_MODE
);
1311 mpfr_yn (last1
, n1
, x
->value
.real
, GFC_RND_MODE
);
1313 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1314 mpfr_set (e
->value
.real
, last1
, GFC_RND_MODE
);
1315 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1319 gfc_free_expr (result
);
1320 return &gfc_bad_expr
;
1322 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1330 /* Get second recursion anchor. */
1334 mpfr_jn (last2
, n2
-1, x
->value
.real
, GFC_RND_MODE
);
1336 mpfr_yn (last2
, n1
+1, x
->value
.real
, GFC_RND_MODE
);
1338 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1339 mpfr_set (e
->value
.real
, last2
, GFC_RND_MODE
);
1340 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1345 gfc_free_expr (result
);
1346 return &gfc_bad_expr
;
1349 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
, -2);
1351 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1360 /* Start actual recursion. */
1363 mpfr_ui_div (x2rev
, 2, x
->value
.real
, GFC_RND_MODE
);
1365 for (i
= 2; i
<= n2
-n1
; i
++)
1367 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1369 /* Special case: For YN, if the previous N gave -INF, set
1370 also N+1 to -INF. */
1371 if (!jn
&& !flag_range_check
&& mpfr_inf_p (last2
))
1373 mpfr_set_inf (e
->value
.real
, -1);
1374 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1379 mpfr_mul_si (e
->value
.real
, x2rev
, jn
? (n2
-i
+1) : (n1
+i
-1),
1381 mpfr_mul (e
->value
.real
, e
->value
.real
, last2
, GFC_RND_MODE
);
1382 mpfr_sub (e
->value
.real
, e
->value
.real
, last1
, GFC_RND_MODE
);
1384 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1386 /* Range_check frees "e" in that case. */
1392 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
,
1395 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1397 mpfr_set (last1
, last2
, GFC_RND_MODE
);
1398 mpfr_set (last2
, e
->value
.real
, GFC_RND_MODE
);
1411 gfc_free_expr (result
);
1412 return &gfc_bad_expr
;
1417 gfc_simplify_bessel_jn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1419 return gfc_simplify_bessel_n2 (order1
, order2
, x
, true);
1424 gfc_simplify_bessel_y0 (gfc_expr
*x
)
1428 if (x
->expr_type
!= EXPR_CONSTANT
)
1431 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1432 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1434 return range_check (result
, "BESSEL_Y0");
1439 gfc_simplify_bessel_y1 (gfc_expr
*x
)
1443 if (x
->expr_type
!= EXPR_CONSTANT
)
1446 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1447 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1449 return range_check (result
, "BESSEL_Y1");
1454 gfc_simplify_bessel_yn (gfc_expr
*order
, gfc_expr
*x
)
1459 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1462 n
= mpz_get_si (order
->value
.integer
);
1463 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1464 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1466 return range_check (result
, "BESSEL_YN");
1471 gfc_simplify_bessel_yn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1473 return gfc_simplify_bessel_n2 (order1
, order2
, x
, false);
1478 gfc_simplify_bit_size (gfc_expr
*e
)
1480 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1481 return gfc_get_int_expr (e
->ts
.kind
, &e
->where
,
1482 gfc_integer_kinds
[i
].bit_size
);
1487 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
1491 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
1494 if (gfc_extract_int (bit
, &b
) != NULL
|| b
< 0)
1495 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
, false);
1497 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
,
1498 mpz_tstbit (e
->value
.integer
, b
));
1503 compare_bitwise (gfc_expr
*i
, gfc_expr
*j
)
1508 gcc_assert (i
->ts
.type
== BT_INTEGER
);
1509 gcc_assert (j
->ts
.type
== BT_INTEGER
);
1511 mpz_init_set (x
, i
->value
.integer
);
1512 k
= gfc_validate_kind (i
->ts
.type
, i
->ts
.kind
, false);
1513 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
1515 mpz_init_set (y
, j
->value
.integer
);
1516 k
= gfc_validate_kind (j
->ts
.type
, j
->ts
.kind
, false);
1517 convert_mpz_to_unsigned (y
, gfc_integer_kinds
[k
].bit_size
);
1519 res
= mpz_cmp (x
, y
);
1527 gfc_simplify_bge (gfc_expr
*i
, gfc_expr
*j
)
1529 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1532 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1533 compare_bitwise (i
, j
) >= 0);
1538 gfc_simplify_bgt (gfc_expr
*i
, gfc_expr
*j
)
1540 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1543 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1544 compare_bitwise (i
, j
) > 0);
1549 gfc_simplify_ble (gfc_expr
*i
, gfc_expr
*j
)
1551 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1554 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1555 compare_bitwise (i
, j
) <= 0);
1560 gfc_simplify_blt (gfc_expr
*i
, gfc_expr
*j
)
1562 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1565 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1566 compare_bitwise (i
, j
) < 0);
1571 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
1573 gfc_expr
*ceil
, *result
;
1576 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
1578 return &gfc_bad_expr
;
1580 if (e
->expr_type
!= EXPR_CONSTANT
)
1583 ceil
= gfc_copy_expr (e
);
1584 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
1586 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
1587 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
, &e
->where
);
1589 gfc_free_expr (ceil
);
1591 return range_check (result
, "CEILING");
1596 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
1598 return simplify_achar_char (e
, k
, "CHAR", false);
1602 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1605 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
1609 if (convert_boz (x
, kind
) == &gfc_bad_expr
)
1610 return &gfc_bad_expr
;
1612 if (convert_boz (y
, kind
) == &gfc_bad_expr
)
1613 return &gfc_bad_expr
;
1615 if (x
->expr_type
!= EXPR_CONSTANT
1616 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1619 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &x
->where
);
1624 mpc_set_z (result
->value
.complex, x
->value
.integer
, GFC_MPC_RND_MODE
);
1628 mpc_set_fr (result
->value
.complex, x
->value
.real
, GFC_RND_MODE
);
1632 mpc_set (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1636 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1640 return range_check (result
, name
);
1645 mpfr_set_z (mpc_imagref (result
->value
.complex),
1646 y
->value
.integer
, GFC_RND_MODE
);
1650 mpfr_set (mpc_imagref (result
->value
.complex),
1651 y
->value
.real
, GFC_RND_MODE
);
1655 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1658 return range_check (result
, name
);
1663 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
1667 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_complex_kind
);
1669 return &gfc_bad_expr
;
1671 return simplify_cmplx ("CMPLX", x
, y
, kind
);
1676 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
1680 if (x
->ts
.type
== BT_INTEGER
&& y
->ts
.type
== BT_INTEGER
)
1681 kind
= gfc_default_complex_kind
;
1682 else if (x
->ts
.type
== BT_REAL
|| y
->ts
.type
== BT_INTEGER
)
1684 else if (x
->ts
.type
== BT_INTEGER
|| y
->ts
.type
== BT_REAL
)
1686 else if (x
->ts
.type
== BT_REAL
&& y
->ts
.type
== BT_REAL
)
1687 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
1691 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
1696 gfc_simplify_conjg (gfc_expr
*e
)
1700 if (e
->expr_type
!= EXPR_CONSTANT
)
1703 result
= gfc_copy_expr (e
);
1704 mpc_conj (result
->value
.complex, result
->value
.complex, GFC_MPC_RND_MODE
);
1706 return range_check (result
, "CONJG");
1709 /* Return the simplification of the constant expression in icall, or NULL
1710 if the expression is not constant. */
1713 simplify_trig_call (gfc_expr
*icall
)
1715 gfc_isym_id func
= icall
->value
.function
.isym
->id
;
1716 gfc_expr
*x
= icall
->value
.function
.actual
->expr
;
1718 /* The actual simplifiers will return NULL for non-constant x. */
1722 return gfc_simplify_acos (x
);
1724 return gfc_simplify_asin (x
);
1726 return gfc_simplify_atan (x
);
1728 return gfc_simplify_cos (x
);
1729 case GFC_ISYM_COTAN
:
1730 return gfc_simplify_cotan (x
);
1732 return gfc_simplify_sin (x
);
1734 return gfc_simplify_tan (x
);
1739 gfc_internal_error ("in simplify_trig_call(): Bad intrinsic");
1743 /* Convert a floating-point number from radians to degrees. */
1746 degrees_f (mpfr_t x
, mp_rnd_t rnd_mode
)
1751 /* Set x = x % 2pi to avoid offsets with large angles. */
1752 mpfr_const_pi (tmp
, rnd_mode
);
1753 mpfr_mul_ui (tmp
, tmp
, 2, rnd_mode
);
1754 mpfr_fmod (tmp
, x
, tmp
, rnd_mode
);
1756 /* Set x = x * 180. */
1757 mpfr_mul_ui (x
, x
, 180, rnd_mode
);
1759 /* Set x = x / pi. */
1760 mpfr_const_pi (tmp
, rnd_mode
);
1761 mpfr_div (x
, x
, tmp
, rnd_mode
);
1766 /* Convert a floating-point number from degrees to radians. */
1769 radians_f (mpfr_t x
, mp_rnd_t rnd_mode
)
1774 /* Set x = x % 360 to avoid offsets with large angles. */
1775 mpfr_set_ui (tmp
, 360, rnd_mode
);
1776 mpfr_fmod (tmp
, x
, tmp
, rnd_mode
);
1778 /* Set x = x * pi. */
1779 mpfr_const_pi (tmp
, rnd_mode
);
1780 mpfr_mul (x
, x
, tmp
, rnd_mode
);
1782 /* Set x = x / 180. */
1783 mpfr_div_ui (x
, x
, 180, rnd_mode
);
1789 /* Convert argument to radians before calling a trig function. */
1792 gfc_simplify_trigd (gfc_expr
*icall
)
1796 arg
= icall
->value
.function
.actual
->expr
;
1798 if (arg
->ts
.type
!= BT_REAL
)
1799 gfc_internal_error ("in gfc_simplify_trigd(): Bad type");
1801 if (arg
->expr_type
== EXPR_CONSTANT
)
1802 /* Convert constant to radians before passing off to simplifier. */
1803 radians_f (arg
->value
.real
, GFC_RND_MODE
);
1805 /* Let the usual simplifier take over - we just simplified the arg. */
1806 return simplify_trig_call (icall
);
1809 /* Convert result of an inverse trig function to degrees. */
1812 gfc_simplify_atrigd (gfc_expr
*icall
)
1816 if (icall
->value
.function
.actual
->expr
->ts
.type
!= BT_REAL
)
1817 gfc_internal_error ("in gfc_simplify_atrigd(): Bad type");
1819 /* See if another simplifier has work to do first. */
1820 result
= simplify_trig_call (icall
);
1822 if (result
&& result
->expr_type
== EXPR_CONSTANT
)
1824 /* Convert constant to degrees after passing off to actual simplifier. */
1825 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1829 /* Let gfc_resolve_atrigd take care of the non-constant case. */
1833 /* Convert the result of atan2 to degrees. */
1836 gfc_simplify_atan2d (gfc_expr
*y
, gfc_expr
*x
)
1840 if (x
->ts
.type
!= BT_REAL
|| y
->ts
.type
!= BT_REAL
)
1841 gfc_internal_error ("in gfc_simplify_atan2d(): Bad type");
1843 if (x
->expr_type
== EXPR_CONSTANT
&& y
->expr_type
== EXPR_CONSTANT
)
1845 result
= gfc_simplify_atan2 (y
, x
);
1848 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1853 /* Let gfc_resolve_atan2d take care of the non-constant case. */
1858 gfc_simplify_cos (gfc_expr
*x
)
1862 if (x
->expr_type
!= EXPR_CONSTANT
)
1865 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1870 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1874 gfc_set_model_kind (x
->ts
.kind
);
1875 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1879 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1882 return range_check (result
, "COS");
1887 gfc_simplify_cosh (gfc_expr
*x
)
1891 if (x
->expr_type
!= EXPR_CONSTANT
)
1894 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1899 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1903 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1910 return range_check (result
, "COSH");
1915 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
1919 if (!is_constant_array_expr (mask
)
1920 || !gfc_is_constant_expr (dim
)
1921 || !gfc_is_constant_expr (kind
))
1924 result
= transformational_result (mask
, dim
,
1926 get_kind (BT_INTEGER
, kind
, "COUNT",
1927 gfc_default_integer_kind
),
1930 init_result_expr (result
, 0, NULL
);
1932 /* Passing MASK twice, once as data array, once as mask.
1933 Whenever gfc_count is called, '1' is added to the result. */
1934 return !dim
|| mask
->rank
== 1 ?
1935 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
1936 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
, NULL
);
1941 gfc_simplify_cshift (gfc_expr
*array
, gfc_expr
*shift
, gfc_expr
*dim
)
1943 gfc_expr
*a
, *result
;
1946 /* DIM is only useful for rank > 1, but deal with it here as one can
1947 set DIM = 1 for rank = 1. */
1950 if (!gfc_is_constant_expr (dim
))
1952 dm
= mpz_get_si (dim
->value
.integer
);
1957 /* Copy array into 'a', simplify it, and then test for a constant array. */
1958 a
= gfc_copy_expr (array
);
1959 gfc_simplify_expr (a
, 0);
1960 if (!is_constant_array_expr (a
))
1968 gfc_constructor
*ca
, *cr
;
1972 if (!gfc_is_constant_expr (shift
))
1978 shft
= mpz_get_si (shift
->value
.integer
);
1980 /* Case (i): If ARRAY has rank one, element i of the result is
1981 ARRAY (1 + MODULO (i + SHIFT - 1, SIZE (ARRAY))). */
1984 gfc_array_size (a
, &size
);
1985 sz
= mpz_get_si (size
);
1988 /* Adjust shft to deal with right or left shifts. */
1989 shft
= shft
< 0 ? 1 - shft
: shft
;
1991 /* Special case: Shift to the original order! */
1995 result
= gfc_copy_expr (a
);
1996 cr
= gfc_constructor_first (result
->value
.constructor
);
1997 for (i
= 0; i
< sz
; i
++, cr
= gfc_constructor_next (cr
))
1999 j
= (i
+ shft
) % sz
;
2000 ca
= gfc_constructor_first (a
->value
.constructor
);
2002 ca
= gfc_constructor_next (ca
);
2003 cr
->expr
= gfc_copy_expr (ca
->expr
);
2011 /* FIXME: Deal with rank > 1 arrays. For now, don't leak memory. */
2013 /* GCC bootstrap is too stupid to realize that the above code for dm
2014 is correct. First, dim can be specified for a rank 1 array. It is
2015 not needed in this nor used here. Second, the code is simply waiting
2016 for someone to implement rank > 1 simplification. For now, add a
2017 pessimization to the code that has a zero valid reason to be here. */
2018 if (dm
> array
->rank
)
2029 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
2031 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
2036 gfc_simplify_dble (gfc_expr
*e
)
2038 gfc_expr
*result
= NULL
;
2040 if (e
->expr_type
!= EXPR_CONSTANT
)
2043 if (convert_boz (e
, gfc_default_double_kind
) == &gfc_bad_expr
)
2044 return &gfc_bad_expr
;
2046 result
= gfc_convert_constant (e
, BT_REAL
, gfc_default_double_kind
);
2047 if (result
== &gfc_bad_expr
)
2048 return &gfc_bad_expr
;
2050 return range_check (result
, "DBLE");
2055 gfc_simplify_digits (gfc_expr
*x
)
2059 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2064 digits
= gfc_integer_kinds
[i
].digits
;
2069 digits
= gfc_real_kinds
[i
].digits
;
2076 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, digits
);
2081 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
2086 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2089 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
2090 result
= gfc_get_constant_expr (x
->ts
.type
, kind
, &x
->where
);
2095 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
2096 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2098 mpz_set_ui (result
->value
.integer
, 0);
2103 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
2104 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
2107 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2112 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2115 return range_check (result
, "DIM");
2120 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
2125 if (!is_constant_array_expr (vector_a
)
2126 || !is_constant_array_expr (vector_b
))
2129 gcc_assert (vector_a
->rank
== 1);
2130 gcc_assert (vector_b
->rank
== 1);
2132 temp
.expr_type
= EXPR_OP
;
2133 gfc_clear_ts (&temp
.ts
);
2134 temp
.value
.op
.op
= INTRINSIC_NONE
;
2135 temp
.value
.op
.op1
= vector_a
;
2136 temp
.value
.op
.op2
= vector_b
;
2137 gfc_type_convert_binary (&temp
, 1);
2139 return compute_dot_product (vector_a
, 1, 0, vector_b
, 1, 0, true);
2144 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
2146 gfc_expr
*a1
, *a2
, *result
;
2148 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2151 a1
= gfc_real2real (x
, gfc_default_double_kind
);
2152 a2
= gfc_real2real (y
, gfc_default_double_kind
);
2154 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &x
->where
);
2155 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
2160 return range_check (result
, "DPROD");
2165 simplify_dshift (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
,
2169 int i
, k
, size
, shift
;
2171 if (arg1
->expr_type
!= EXPR_CONSTANT
|| arg2
->expr_type
!= EXPR_CONSTANT
2172 || shiftarg
->expr_type
!= EXPR_CONSTANT
)
2175 k
= gfc_validate_kind (BT_INTEGER
, arg1
->ts
.kind
, false);
2176 size
= gfc_integer_kinds
[k
].bit_size
;
2178 gfc_extract_int (shiftarg
, &shift
);
2180 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2182 shift
= size
- shift
;
2184 result
= gfc_get_constant_expr (BT_INTEGER
, arg1
->ts
.kind
, &arg1
->where
);
2185 mpz_set_ui (result
->value
.integer
, 0);
2187 for (i
= 0; i
< shift
; i
++)
2188 if (mpz_tstbit (arg2
->value
.integer
, size
- shift
+ i
))
2189 mpz_setbit (result
->value
.integer
, i
);
2191 for (i
= 0; i
< size
- shift
; i
++)
2192 if (mpz_tstbit (arg1
->value
.integer
, i
))
2193 mpz_setbit (result
->value
.integer
, shift
+ i
);
2195 /* Convert to a signed value. */
2196 gfc_convert_mpz_to_signed (result
->value
.integer
, size
);
2203 gfc_simplify_dshiftr (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2205 return simplify_dshift (arg1
, arg2
, shiftarg
, true);
2210 gfc_simplify_dshiftl (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2212 return simplify_dshift (arg1
, arg2
, shiftarg
, false);
2217 gfc_simplify_erf (gfc_expr
*x
)
2221 if (x
->expr_type
!= EXPR_CONSTANT
)
2224 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2225 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2227 return range_check (result
, "ERF");
2232 gfc_simplify_erfc (gfc_expr
*x
)
2236 if (x
->expr_type
!= EXPR_CONSTANT
)
2239 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2240 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2242 return range_check (result
, "ERFC");
2246 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2248 #define MAX_ITER 200
2249 #define ARG_LIMIT 12
2251 /* Calculate ERFC_SCALED directly by its definition:
2253 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2255 using a large precision for intermediate results. This is used for all
2256 but large values of the argument. */
2258 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2263 prec
= mpfr_get_default_prec ();
2264 mpfr_set_default_prec (10 * prec
);
2269 mpfr_set (a
, arg
, GFC_RND_MODE
);
2270 mpfr_sqr (b
, a
, GFC_RND_MODE
);
2271 mpfr_exp (b
, b
, GFC_RND_MODE
);
2272 mpfr_erfc (a
, a
, GFC_RND_MODE
);
2273 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
2275 mpfr_set (res
, a
, GFC_RND_MODE
);
2276 mpfr_set_default_prec (prec
);
2282 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2284 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2285 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2288 This is used for large values of the argument. Intermediate calculations
2289 are performed with twice the precision. We don't do a fixed number of
2290 iterations of the sum, but stop when it has converged to the required
2293 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2295 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
2300 prec
= mpfr_get_default_prec ();
2301 mpfr_set_default_prec (2 * prec
);
2311 mpfr_init (sumtrunc
);
2312 mpfr_set_prec (oldsum
, prec
);
2313 mpfr_set_prec (sumtrunc
, prec
);
2315 mpfr_set (x
, arg
, GFC_RND_MODE
);
2316 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
2317 mpz_set_ui (num
, 1);
2319 mpfr_set (u
, x
, GFC_RND_MODE
);
2320 mpfr_sqr (u
, u
, GFC_RND_MODE
);
2321 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
2322 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
2324 for (i
= 1; i
< MAX_ITER
; i
++)
2326 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
2328 mpz_mul_ui (num
, num
, 2 * i
- 1);
2331 mpfr_set (w
, u
, GFC_RND_MODE
);
2332 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
2334 mpfr_set_z (v
, num
, GFC_RND_MODE
);
2335 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
2337 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
2339 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
2340 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
2344 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2346 gcc_assert (i
< MAX_ITER
);
2348 /* Divide by x * sqrt(Pi). */
2349 mpfr_const_pi (u
, GFC_RND_MODE
);
2350 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
2351 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
2352 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
2354 mpfr_set (res
, sum
, GFC_RND_MODE
);
2355 mpfr_set_default_prec (prec
);
2357 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
2363 gfc_simplify_erfc_scaled (gfc_expr
*x
)
2367 if (x
->expr_type
!= EXPR_CONSTANT
)
2370 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2371 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
2372 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
2374 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
2376 return range_check (result
, "ERFC_SCALED");
2384 gfc_simplify_epsilon (gfc_expr
*e
)
2389 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2391 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
2392 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
2394 return range_check (result
, "EPSILON");
2399 gfc_simplify_exp (gfc_expr
*x
)
2403 if (x
->expr_type
!= EXPR_CONSTANT
)
2406 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2411 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2415 gfc_set_model_kind (x
->ts
.kind
);
2416 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
2420 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2423 return range_check (result
, "EXP");
2428 gfc_simplify_exponent (gfc_expr
*x
)
2433 if (x
->expr_type
!= EXPR_CONSTANT
)
2436 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2439 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2440 if (mpfr_inf_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
2442 int i
= gfc_validate_kind (BT_INTEGER
, gfc_default_integer_kind
, false);
2443 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2447 /* EXPONENT(+/- 0.0) = 0 */
2448 if (mpfr_zero_p (x
->value
.real
))
2450 mpz_set_ui (result
->value
.integer
, 0);
2454 gfc_set_model (x
->value
.real
);
2456 val
= (long int) mpfr_get_exp (x
->value
.real
);
2457 mpz_set_si (result
->value
.integer
, val
);
2459 return range_check (result
, "EXPONENT");
2464 gfc_simplify_float (gfc_expr
*a
)
2468 if (a
->expr_type
!= EXPR_CONSTANT
)
2473 if (convert_boz (a
, gfc_default_real_kind
) == &gfc_bad_expr
)
2474 return &gfc_bad_expr
;
2476 result
= gfc_copy_expr (a
);
2479 result
= gfc_int2real (a
, gfc_default_real_kind
);
2481 return range_check (result
, "FLOAT");
2486 is_last_ref_vtab (gfc_expr
*e
)
2489 gfc_component
*comp
= NULL
;
2491 if (e
->expr_type
!= EXPR_VARIABLE
)
2494 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
2495 if (ref
->type
== REF_COMPONENT
)
2496 comp
= ref
->u
.c
.component
;
2498 if (!e
->ref
|| !comp
)
2499 return e
->symtree
->n
.sym
->attr
.vtab
;
2501 if (comp
->name
[0] == '_' && strcmp (comp
->name
, "_vptr") == 0)
2509 gfc_simplify_extends_type_of (gfc_expr
*a
, gfc_expr
*mold
)
2511 /* Avoid simplification of resolved symbols. */
2512 if (is_last_ref_vtab (a
) || is_last_ref_vtab (mold
))
2515 if (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_DERIVED
)
2516 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2517 gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2520 if (UNLIMITED_POLY (a
) || UNLIMITED_POLY (mold
))
2523 /* Return .false. if the dynamic type can never be the same. */
2524 if ((a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_CLASS
2525 && !gfc_type_is_extension_of
2526 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2527 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2528 && !gfc_type_is_extension_of
2529 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2530 mold
->ts
.u
.derived
->components
->ts
.u
.derived
))
2531 || (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_CLASS
2532 && !gfc_type_is_extension_of
2534 mold
->ts
.u
.derived
->components
->ts
.u
.derived
)
2535 && !gfc_type_is_extension_of
2536 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2538 || (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2539 && !gfc_type_is_extension_of
2540 (mold
->ts
.u
.derived
,
2541 a
->ts
.u
.derived
->components
->ts
.u
.derived
)))
2542 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2544 if (mold
->ts
.type
== BT_DERIVED
2545 && gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2546 a
->ts
.u
.derived
->components
->ts
.u
.derived
))
2547 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, true);
2554 gfc_simplify_same_type_as (gfc_expr
*a
, gfc_expr
*b
)
2556 /* Avoid simplification of resolved symbols. */
2557 if (is_last_ref_vtab (a
) || is_last_ref_vtab (b
))
2560 /* Return .false. if the dynamic type can never be the
2562 if (((a
->ts
.type
== BT_CLASS
&& gfc_expr_attr (a
).class_ok
)
2563 || (b
->ts
.type
== BT_CLASS
&& gfc_expr_attr (b
).class_ok
))
2564 && !gfc_type_compatible (&a
->ts
, &b
->ts
)
2565 && !gfc_type_compatible (&b
->ts
, &a
->ts
))
2566 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2568 if (a
->ts
.type
!= BT_DERIVED
|| b
->ts
.type
!= BT_DERIVED
)
2571 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2572 gfc_compare_derived_types (a
->ts
.u
.derived
,
2578 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
2584 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
2586 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2588 if (e
->expr_type
!= EXPR_CONSTANT
)
2591 mpfr_init2 (floor
, mpfr_get_prec (e
->value
.real
));
2592 mpfr_floor (floor
, e
->value
.real
);
2594 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
2595 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
2599 return range_check (result
, "FLOOR");
2604 gfc_simplify_fraction (gfc_expr
*x
)
2608 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2609 mpfr_t absv
, exp
, pow2
;
2614 if (x
->expr_type
!= EXPR_CONSTANT
)
2617 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
2619 /* FRACTION(inf) = NaN. */
2620 if (mpfr_inf_p (x
->value
.real
))
2622 mpfr_set_nan (result
->value
.real
);
2626 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2628 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
2629 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
2631 if (mpfr_sgn (x
->value
.real
) == 0)
2633 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2637 gfc_set_model_kind (x
->ts
.kind
);
2642 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
2643 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
2645 mpfr_trunc (exp
, exp
);
2646 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
2648 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
2650 mpfr_div (result
->value
.real
, x
->value
.real
, pow2
, GFC_RND_MODE
);
2652 mpfr_clears (exp
, absv
, pow2
, NULL
);
2656 /* mpfr_frexp() correctly handles zeros and NaNs. */
2657 mpfr_frexp (&e
, result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2661 return range_check (result
, "FRACTION");
2666 gfc_simplify_gamma (gfc_expr
*x
)
2670 if (x
->expr_type
!= EXPR_CONSTANT
)
2673 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2674 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2676 return range_check (result
, "GAMMA");
2681 gfc_simplify_huge (gfc_expr
*e
)
2686 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2687 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2692 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2696 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
2708 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
2712 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2715 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2716 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
2717 return range_check (result
, "HYPOT");
2721 /* We use the processor's collating sequence, because all
2722 systems that gfortran currently works on are ASCII. */
2725 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
2731 if (e
->expr_type
!= EXPR_CONSTANT
)
2734 if (e
->value
.character
.length
!= 1)
2736 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
2737 return &gfc_bad_expr
;
2740 index
= e
->value
.character
.string
[0];
2742 if (warn_surprising
&& index
> 127)
2743 gfc_warning (OPT_Wsurprising
,
2744 "Argument of IACHAR function at %L outside of range 0..127",
2747 k
= get_kind (BT_INTEGER
, kind
, "IACHAR", gfc_default_integer_kind
);
2749 return &gfc_bad_expr
;
2751 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2753 return range_check (result
, "IACHAR");
2758 do_bit_and (gfc_expr
*result
, gfc_expr
*e
)
2760 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2761 gcc_assert (result
->ts
.type
== BT_INTEGER
2762 && result
->expr_type
== EXPR_CONSTANT
);
2764 mpz_and (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2770 gfc_simplify_iall (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2772 return simplify_transformation (array
, dim
, mask
, -1, do_bit_and
);
2777 do_bit_ior (gfc_expr
*result
, gfc_expr
*e
)
2779 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2780 gcc_assert (result
->ts
.type
== BT_INTEGER
2781 && result
->expr_type
== EXPR_CONSTANT
);
2783 mpz_ior (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2789 gfc_simplify_iany (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2791 return simplify_transformation (array
, dim
, mask
, 0, do_bit_ior
);
2796 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
2800 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2803 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2804 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2806 return range_check (result
, "IAND");
2811 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
2816 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2819 gfc_extract_int (y
, &pos
);
2821 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2823 result
= gfc_copy_expr (x
);
2825 convert_mpz_to_unsigned (result
->value
.integer
,
2826 gfc_integer_kinds
[k
].bit_size
);
2828 mpz_clrbit (result
->value
.integer
, pos
);
2830 gfc_convert_mpz_to_signed (result
->value
.integer
,
2831 gfc_integer_kinds
[k
].bit_size
);
2838 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
2845 if (x
->expr_type
!= EXPR_CONSTANT
2846 || y
->expr_type
!= EXPR_CONSTANT
2847 || z
->expr_type
!= EXPR_CONSTANT
)
2850 gfc_extract_int (y
, &pos
);
2851 gfc_extract_int (z
, &len
);
2853 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
2855 bitsize
= gfc_integer_kinds
[k
].bit_size
;
2857 if (pos
+ len
> bitsize
)
2859 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2860 "bit size at %L", &y
->where
);
2861 return &gfc_bad_expr
;
2864 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2865 convert_mpz_to_unsigned (result
->value
.integer
,
2866 gfc_integer_kinds
[k
].bit_size
);
2868 bits
= XCNEWVEC (int, bitsize
);
2870 for (i
= 0; i
< bitsize
; i
++)
2873 for (i
= 0; i
< len
; i
++)
2874 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
2876 for (i
= 0; i
< bitsize
; i
++)
2879 mpz_clrbit (result
->value
.integer
, i
);
2880 else if (bits
[i
] == 1)
2881 mpz_setbit (result
->value
.integer
, i
);
2883 gfc_internal_error ("IBITS: Bad bit");
2888 gfc_convert_mpz_to_signed (result
->value
.integer
,
2889 gfc_integer_kinds
[k
].bit_size
);
2896 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
2901 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2904 gfc_extract_int (y
, &pos
);
2906 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2908 result
= gfc_copy_expr (x
);
2910 convert_mpz_to_unsigned (result
->value
.integer
,
2911 gfc_integer_kinds
[k
].bit_size
);
2913 mpz_setbit (result
->value
.integer
, pos
);
2915 gfc_convert_mpz_to_signed (result
->value
.integer
,
2916 gfc_integer_kinds
[k
].bit_size
);
2923 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
2929 if (e
->expr_type
!= EXPR_CONSTANT
)
2932 if (e
->value
.character
.length
!= 1)
2934 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
2935 return &gfc_bad_expr
;
2938 index
= e
->value
.character
.string
[0];
2940 k
= get_kind (BT_INTEGER
, kind
, "ICHAR", gfc_default_integer_kind
);
2942 return &gfc_bad_expr
;
2944 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2946 return range_check (result
, "ICHAR");
2951 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
2955 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2958 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2959 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2961 return range_check (result
, "IEOR");
2966 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
2969 int back
, len
, lensub
;
2970 int i
, j
, k
, count
, index
= 0, start
;
2972 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
2973 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
2976 if (b
!= NULL
&& b
->value
.logical
!= 0)
2981 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
2983 return &gfc_bad_expr
;
2985 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
2987 len
= x
->value
.character
.length
;
2988 lensub
= y
->value
.character
.length
;
2992 mpz_set_si (result
->value
.integer
, 0);
3000 mpz_set_si (result
->value
.integer
, 1);
3003 else if (lensub
== 1)
3005 for (i
= 0; i
< len
; i
++)
3007 for (j
= 0; j
< lensub
; j
++)
3009 if (y
->value
.character
.string
[j
]
3010 == x
->value
.character
.string
[i
])
3020 for (i
= 0; i
< len
; i
++)
3022 for (j
= 0; j
< lensub
; j
++)
3024 if (y
->value
.character
.string
[j
]
3025 == x
->value
.character
.string
[i
])
3030 for (k
= 0; k
< lensub
; k
++)
3032 if (y
->value
.character
.string
[k
]
3033 == x
->value
.character
.string
[k
+ start
])
3037 if (count
== lensub
)
3052 mpz_set_si (result
->value
.integer
, len
+ 1);
3055 else if (lensub
== 1)
3057 for (i
= 0; i
< len
; i
++)
3059 for (j
= 0; j
< lensub
; j
++)
3061 if (y
->value
.character
.string
[j
]
3062 == x
->value
.character
.string
[len
- i
])
3064 index
= len
- i
+ 1;
3072 for (i
= 0; i
< len
; i
++)
3074 for (j
= 0; j
< lensub
; j
++)
3076 if (y
->value
.character
.string
[j
]
3077 == x
->value
.character
.string
[len
- i
])
3080 if (start
<= len
- lensub
)
3083 for (k
= 0; k
< lensub
; k
++)
3084 if (y
->value
.character
.string
[k
]
3085 == x
->value
.character
.string
[k
+ start
])
3088 if (count
== lensub
)
3105 mpz_set_si (result
->value
.integer
, index
);
3106 return range_check (result
, "INDEX");
3111 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
3113 gfc_expr
*result
= NULL
;
3115 if (e
->expr_type
!= EXPR_CONSTANT
)
3118 result
= gfc_convert_constant (e
, BT_INTEGER
, kind
);
3119 if (result
== &gfc_bad_expr
)
3120 return &gfc_bad_expr
;
3122 return range_check (result
, name
);
3127 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
3131 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
3133 return &gfc_bad_expr
;
3135 return simplify_intconv (e
, kind
, "INT");
3139 gfc_simplify_int2 (gfc_expr
*e
)
3141 return simplify_intconv (e
, 2, "INT2");
3146 gfc_simplify_int8 (gfc_expr
*e
)
3148 return simplify_intconv (e
, 8, "INT8");
3153 gfc_simplify_long (gfc_expr
*e
)
3155 return simplify_intconv (e
, 4, "LONG");
3160 gfc_simplify_ifix (gfc_expr
*e
)
3162 gfc_expr
*rtrunc
, *result
;
3164 if (e
->expr_type
!= EXPR_CONSTANT
)
3167 rtrunc
= gfc_copy_expr (e
);
3168 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3170 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3172 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3174 gfc_free_expr (rtrunc
);
3176 return range_check (result
, "IFIX");
3181 gfc_simplify_idint (gfc_expr
*e
)
3183 gfc_expr
*rtrunc
, *result
;
3185 if (e
->expr_type
!= EXPR_CONSTANT
)
3188 rtrunc
= gfc_copy_expr (e
);
3189 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3191 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3193 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3195 gfc_free_expr (rtrunc
);
3197 return range_check (result
, "IDINT");
3202 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
3206 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3209 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3210 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3212 return range_check (result
, "IOR");
3217 do_bit_xor (gfc_expr
*result
, gfc_expr
*e
)
3219 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3220 gcc_assert (result
->ts
.type
== BT_INTEGER
3221 && result
->expr_type
== EXPR_CONSTANT
);
3223 mpz_xor (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3229 gfc_simplify_iparity (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3231 return simplify_transformation (array
, dim
, mask
, 0, do_bit_xor
);
3236 gfc_simplify_is_iostat_end (gfc_expr
*x
)
3238 if (x
->expr_type
!= EXPR_CONSTANT
)
3241 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3242 mpz_cmp_si (x
->value
.integer
,
3243 LIBERROR_END
) == 0);
3248 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
3250 if (x
->expr_type
!= EXPR_CONSTANT
)
3253 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3254 mpz_cmp_si (x
->value
.integer
,
3255 LIBERROR_EOR
) == 0);
3260 gfc_simplify_isnan (gfc_expr
*x
)
3262 if (x
->expr_type
!= EXPR_CONSTANT
)
3265 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3266 mpfr_nan_p (x
->value
.real
));
3270 /* Performs a shift on its first argument. Depending on the last
3271 argument, the shift can be arithmetic, i.e. with filling from the
3272 left like in the SHIFTA intrinsic. */
3274 simplify_shift (gfc_expr
*e
, gfc_expr
*s
, const char *name
,
3275 bool arithmetic
, int direction
)
3278 int ashift
, *bits
, i
, k
, bitsize
, shift
;
3280 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3283 gfc_extract_int (s
, &shift
);
3285 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
3286 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3288 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3292 mpz_set (result
->value
.integer
, e
->value
.integer
);
3296 if (direction
> 0 && shift
< 0)
3298 /* Left shift, as in SHIFTL. */
3299 gfc_error ("Second argument of %s is negative at %L", name
, &e
->where
);
3300 return &gfc_bad_expr
;
3302 else if (direction
< 0)
3304 /* Right shift, as in SHIFTR or SHIFTA. */
3307 gfc_error ("Second argument of %s is negative at %L",
3309 return &gfc_bad_expr
;
3315 ashift
= (shift
>= 0 ? shift
: -shift
);
3317 if (ashift
> bitsize
)
3319 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3320 "at %L", name
, &e
->where
);
3321 return &gfc_bad_expr
;
3324 bits
= XCNEWVEC (int, bitsize
);
3326 for (i
= 0; i
< bitsize
; i
++)
3327 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3332 for (i
= 0; i
< shift
; i
++)
3333 mpz_clrbit (result
->value
.integer
, i
);
3335 for (i
= 0; i
< bitsize
- shift
; i
++)
3338 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3340 mpz_setbit (result
->value
.integer
, i
+ shift
);
3346 if (arithmetic
&& bits
[bitsize
- 1])
3347 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3348 mpz_setbit (result
->value
.integer
, i
);
3350 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3351 mpz_clrbit (result
->value
.integer
, i
);
3353 for (i
= bitsize
- 1; i
>= ashift
; i
--)
3356 mpz_clrbit (result
->value
.integer
, i
- ashift
);
3358 mpz_setbit (result
->value
.integer
, i
- ashift
);
3362 gfc_convert_mpz_to_signed (result
->value
.integer
, bitsize
);
3370 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
3372 return simplify_shift (e
, s
, "ISHFT", false, 0);
3377 gfc_simplify_lshift (gfc_expr
*e
, gfc_expr
*s
)
3379 return simplify_shift (e
, s
, "LSHIFT", false, 1);
3384 gfc_simplify_rshift (gfc_expr
*e
, gfc_expr
*s
)
3386 return simplify_shift (e
, s
, "RSHIFT", true, -1);
3391 gfc_simplify_shifta (gfc_expr
*e
, gfc_expr
*s
)
3393 return simplify_shift (e
, s
, "SHIFTA", true, -1);
3398 gfc_simplify_shiftl (gfc_expr
*e
, gfc_expr
*s
)
3400 return simplify_shift (e
, s
, "SHIFTL", false, 1);
3405 gfc_simplify_shiftr (gfc_expr
*e
, gfc_expr
*s
)
3407 return simplify_shift (e
, s
, "SHIFTR", false, -1);
3412 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
3415 int shift
, ashift
, isize
, ssize
, delta
, k
;
3418 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3421 gfc_extract_int (s
, &shift
);
3423 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3424 isize
= gfc_integer_kinds
[k
].bit_size
;
3428 if (sz
->expr_type
!= EXPR_CONSTANT
)
3431 gfc_extract_int (sz
, &ssize
);
3444 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3445 "BIT_SIZE of first argument at %C");
3447 gfc_error ("Absolute value of SHIFT shall be less than or equal "
3449 return &gfc_bad_expr
;
3452 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3454 mpz_set (result
->value
.integer
, e
->value
.integer
);
3459 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
3461 bits
= XCNEWVEC (int, ssize
);
3463 for (i
= 0; i
< ssize
; i
++)
3464 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3466 delta
= ssize
- ashift
;
3470 for (i
= 0; i
< delta
; i
++)
3473 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3475 mpz_setbit (result
->value
.integer
, i
+ shift
);
3478 for (i
= delta
; i
< ssize
; i
++)
3481 mpz_clrbit (result
->value
.integer
, i
- delta
);
3483 mpz_setbit (result
->value
.integer
, i
- delta
);
3488 for (i
= 0; i
< ashift
; i
++)
3491 mpz_clrbit (result
->value
.integer
, i
+ delta
);
3493 mpz_setbit (result
->value
.integer
, i
+ delta
);
3496 for (i
= ashift
; i
< ssize
; i
++)
3499 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3501 mpz_setbit (result
->value
.integer
, i
+ shift
);
3505 gfc_convert_mpz_to_signed (result
->value
.integer
, isize
);
3513 gfc_simplify_kind (gfc_expr
*e
)
3515 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, e
->ts
.kind
);
3520 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
3521 gfc_array_spec
*as
, gfc_ref
*ref
, bool coarray
)
3523 gfc_expr
*l
, *u
, *result
;
3526 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3527 gfc_default_integer_kind
);
3529 return &gfc_bad_expr
;
3531 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3533 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3534 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3535 if (!coarray
&& array
->expr_type
!= EXPR_VARIABLE
)
3539 gfc_expr
* dim
= result
;
3540 mpz_set_si (dim
->value
.integer
, d
);
3542 result
= simplify_size (array
, dim
, k
);
3543 gfc_free_expr (dim
);
3548 mpz_set_si (result
->value
.integer
, 1);
3553 /* Otherwise, we have a variable expression. */
3554 gcc_assert (array
->expr_type
== EXPR_VARIABLE
);
3557 if (!gfc_resolve_array_spec (as
, 0))
3560 /* The last dimension of an assumed-size array is special. */
3561 if ((!coarray
&& d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
3562 || (coarray
&& d
== as
->rank
+ as
->corank
3563 && (!upper
|| flag_coarray
== GFC_FCOARRAY_SINGLE
)))
3565 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
3567 gfc_free_expr (result
);
3568 return gfc_copy_expr (as
->lower
[d
-1]);
3574 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3576 /* Then, we need to know the extent of the given dimension. */
3577 if (coarray
|| (ref
->u
.ar
.type
== AR_FULL
&& !ref
->next
))
3579 gfc_expr
*declared_bound
;
3581 bool constant_lbound
, constant_ubound
;
3586 gcc_assert (l
!= NULL
);
3588 constant_lbound
= l
->expr_type
== EXPR_CONSTANT
;
3589 constant_ubound
= u
&& u
->expr_type
== EXPR_CONSTANT
;
3591 empty_bound
= upper
? 0 : 1;
3592 declared_bound
= upper
? u
: l
;
3594 if ((!upper
&& !constant_lbound
)
3595 || (upper
&& !constant_ubound
))
3600 /* For {L,U}BOUND, the value depends on whether the array
3601 is empty. We can nevertheless simplify if the declared bound
3602 has the same value as that of an empty array, in which case
3603 the result isn't dependent on the array emptyness. */
3604 if (mpz_cmp_si (declared_bound
->value
.integer
, empty_bound
) == 0)
3605 mpz_set_si (result
->value
.integer
, empty_bound
);
3606 else if (!constant_lbound
|| !constant_ubound
)
3607 /* Array emptyness can't be determined, we can't simplify. */
3609 else if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
3610 mpz_set_si (result
->value
.integer
, empty_bound
);
3612 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
3615 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
3621 if (!gfc_ref_dimen_size (&ref
->u
.ar
, d
- 1, &result
->value
.integer
, NULL
))
3625 mpz_set_si (result
->value
.integer
, (long int) 1);
3629 return range_check (result
, upper
? "UBOUND" : "LBOUND");
3632 gfc_free_expr (result
);
3638 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3644 if (array
->ts
.type
== BT_CLASS
)
3647 if (array
->expr_type
!= EXPR_VARIABLE
)
3654 /* Follow any component references. */
3655 as
= array
->symtree
->n
.sym
->as
;
3656 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3661 switch (ref
->u
.ar
.type
)
3668 /* We're done because 'as' has already been set in the
3669 previous iteration. */
3683 as
= ref
->u
.c
.component
->as
;
3695 if (as
&& (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_RANK
3696 || (as
->type
== AS_ASSUMED_SHAPE
&& upper
)))
3700 || (as
->type
!= AS_DEFERRED
3701 && array
->expr_type
== EXPR_VARIABLE
3702 && !gfc_expr_attr (array
).allocatable
3703 && !gfc_expr_attr (array
).pointer
));
3707 /* Multi-dimensional bounds. */
3708 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3712 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3713 if (upper
&& as
&& as
->type
== AS_ASSUMED_SIZE
)
3715 /* An error message will be emitted in
3716 check_assumed_size_reference (resolve.c). */
3717 return &gfc_bad_expr
;
3720 /* Simplify the bounds for each dimension. */
3721 for (d
= 0; d
< array
->rank
; d
++)
3723 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
, ref
,
3725 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3729 for (j
= 0; j
< d
; j
++)
3730 gfc_free_expr (bounds
[j
]);
3735 /* Allocate the result expression. */
3736 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3737 gfc_default_integer_kind
);
3739 return &gfc_bad_expr
;
3741 e
= gfc_get_array_expr (BT_INTEGER
, k
, &array
->where
);
3743 /* The result is a rank 1 array; its size is the rank of the first
3744 argument to {L,U}BOUND. */
3746 e
->shape
= gfc_get_shape (1);
3747 mpz_init_set_ui (e
->shape
[0], array
->rank
);
3749 /* Create the constructor for this array. */
3750 for (d
= 0; d
< array
->rank
; d
++)
3751 gfc_constructor_append_expr (&e
->value
.constructor
,
3752 bounds
[d
], &e
->where
);
3758 /* A DIM argument is specified. */
3759 if (dim
->expr_type
!= EXPR_CONSTANT
)
3762 d
= mpz_get_si (dim
->value
.integer
);
3764 if ((d
< 1 || d
> array
->rank
)
3765 || (d
== array
->rank
&& as
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
3767 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3768 return &gfc_bad_expr
;
3771 if (as
&& as
->type
== AS_ASSUMED_RANK
)
3774 return simplify_bound_dim (array
, kind
, d
, upper
, as
, ref
, false);
3780 simplify_cobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3786 if (array
->expr_type
!= EXPR_VARIABLE
)
3789 /* Follow any component references. */
3790 as
= (array
->ts
.type
== BT_CLASS
&& array
->ts
.u
.derived
->components
)
3791 ? array
->ts
.u
.derived
->components
->as
3792 : array
->symtree
->n
.sym
->as
;
3793 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3798 switch (ref
->u
.ar
.type
)
3801 if (ref
->u
.ar
.as
->corank
> 0)
3803 gcc_assert (as
== ref
->u
.ar
.as
);
3810 /* We're done because 'as' has already been set in the
3811 previous iteration. */
3825 as
= ref
->u
.c
.component
->as
;
3838 if (as
->cotype
== AS_DEFERRED
|| as
->cotype
== AS_ASSUMED_SHAPE
)
3843 /* Multi-dimensional cobounds. */
3844 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3848 /* Simplify the cobounds for each dimension. */
3849 for (d
= 0; d
< as
->corank
; d
++)
3851 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1 + as
->rank
,
3852 upper
, as
, ref
, true);
3853 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3857 for (j
= 0; j
< d
; j
++)
3858 gfc_free_expr (bounds
[j
]);
3863 /* Allocate the result expression. */
3864 e
= gfc_get_expr ();
3865 e
->where
= array
->where
;
3866 e
->expr_type
= EXPR_ARRAY
;
3867 e
->ts
.type
= BT_INTEGER
;
3868 k
= get_kind (BT_INTEGER
, kind
, upper
? "UCOBOUND" : "LCOBOUND",
3869 gfc_default_integer_kind
);
3873 return &gfc_bad_expr
;
3877 /* The result is a rank 1 array; its size is the rank of the first
3878 argument to {L,U}COBOUND. */
3880 e
->shape
= gfc_get_shape (1);
3881 mpz_init_set_ui (e
->shape
[0], as
->corank
);
3883 /* Create the constructor for this array. */
3884 for (d
= 0; d
< as
->corank
; d
++)
3885 gfc_constructor_append_expr (&e
->value
.constructor
,
3886 bounds
[d
], &e
->where
);
3891 /* A DIM argument is specified. */
3892 if (dim
->expr_type
!= EXPR_CONSTANT
)
3895 d
= mpz_get_si (dim
->value
.integer
);
3897 if (d
< 1 || d
> as
->corank
)
3899 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3900 return &gfc_bad_expr
;
3903 return simplify_bound_dim (array
, kind
, d
+as
->rank
, upper
, as
, ref
, true);
3909 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3911 return simplify_bound (array
, dim
, kind
, 0);
3916 gfc_simplify_lcobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3918 return simplify_cobound (array
, dim
, kind
, 0);
3922 gfc_simplify_leadz (gfc_expr
*e
)
3924 unsigned long lz
, bs
;
3927 if (e
->expr_type
!= EXPR_CONSTANT
)
3930 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3931 bs
= gfc_integer_kinds
[i
].bit_size
;
3932 if (mpz_cmp_si (e
->value
.integer
, 0) == 0)
3934 else if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
3937 lz
= bs
- mpz_sizeinbase (e
->value
.integer
, 2);
3939 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, lz
);
3944 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
3947 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
3950 return &gfc_bad_expr
;
3952 if (e
->expr_type
== EXPR_CONSTANT
)
3954 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
3955 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
3956 return range_check (result
, "LEN");
3958 else if (e
->ts
.u
.cl
!= NULL
&& e
->ts
.u
.cl
->length
!= NULL
3959 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
3960 && e
->ts
.u
.cl
->length
->ts
.type
== BT_INTEGER
)
3962 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
3963 mpz_set (result
->value
.integer
, e
->ts
.u
.cl
->length
->value
.integer
);
3964 return range_check (result
, "LEN");
3966 else if (e
->expr_type
== EXPR_VARIABLE
&& e
->ts
.type
== BT_CHARACTER
3967 && e
->symtree
->n
.sym
3968 && e
->symtree
->n
.sym
->ts
.type
!= BT_DERIVED
3969 && e
->symtree
->n
.sym
->assoc
&& e
->symtree
->n
.sym
->assoc
->target
3970 && e
->symtree
->n
.sym
->assoc
->target
->ts
.type
== BT_DERIVED
3971 && e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
3972 && UNLIMITED_POLY (e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
))
3974 /* The expression in assoc->target points to a ref to the _data component
3975 of the unlimited polymorphic entity. To get the _len component the last
3976 _data ref needs to be stripped and a ref to the _len component added. */
3977 return gfc_get_len_component (e
->symtree
->n
.sym
->assoc
->target
);
3984 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
3988 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
3991 return &gfc_bad_expr
;
3993 if (e
->expr_type
!= EXPR_CONSTANT
)
3996 len
= e
->value
.character
.length
;
3997 for (count
= 0, i
= 1; i
<= len
; i
++)
3998 if (e
->value
.character
.string
[len
- i
] == ' ')
4003 result
= gfc_get_int_expr (k
, &e
->where
, len
- count
);
4004 return range_check (result
, "LEN_TRIM");
4008 gfc_simplify_lgamma (gfc_expr
*x
)
4013 if (x
->expr_type
!= EXPR_CONSTANT
)
4016 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4017 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
4019 return range_check (result
, "LGAMMA");
4024 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
4026 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4029 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4030 gfc_compare_string (a
, b
) >= 0);
4035 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
4037 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4040 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4041 gfc_compare_string (a
, b
) > 0);
4046 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
4048 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4051 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4052 gfc_compare_string (a
, b
) <= 0);
4057 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
4059 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4062 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4063 gfc_compare_string (a
, b
) < 0);
4068 gfc_simplify_log (gfc_expr
*x
)
4072 if (x
->expr_type
!= EXPR_CONSTANT
)
4075 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4080 if (mpfr_sgn (x
->value
.real
) <= 0)
4082 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4083 "to zero", &x
->where
);
4084 gfc_free_expr (result
);
4085 return &gfc_bad_expr
;
4088 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4092 if (mpfr_zero_p (mpc_realref (x
->value
.complex))
4093 && mpfr_zero_p (mpc_imagref (x
->value
.complex)))
4095 gfc_error ("Complex argument of LOG at %L cannot be zero",
4097 gfc_free_expr (result
);
4098 return &gfc_bad_expr
;
4101 gfc_set_model_kind (x
->ts
.kind
);
4102 mpc_log (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
4106 gfc_internal_error ("gfc_simplify_log: bad type");
4109 return range_check (result
, "LOG");
4114 gfc_simplify_log10 (gfc_expr
*x
)
4118 if (x
->expr_type
!= EXPR_CONSTANT
)
4121 if (mpfr_sgn (x
->value
.real
) <= 0)
4123 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4124 "to zero", &x
->where
);
4125 return &gfc_bad_expr
;
4128 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4129 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4131 return range_check (result
, "LOG10");
4136 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
4140 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
4142 return &gfc_bad_expr
;
4144 if (e
->expr_type
!= EXPR_CONSTANT
)
4147 return gfc_get_logical_expr (kind
, &e
->where
, e
->value
.logical
);
4152 gfc_simplify_matmul (gfc_expr
*matrix_a
, gfc_expr
*matrix_b
)
4155 int row
, result_rows
, col
, result_columns
;
4156 int stride_a
, offset_a
, stride_b
, offset_b
;
4158 if (!is_constant_array_expr (matrix_a
)
4159 || !is_constant_array_expr (matrix_b
))
4162 gcc_assert (gfc_compare_types (&matrix_a
->ts
, &matrix_b
->ts
));
4163 result
= gfc_get_array_expr (matrix_a
->ts
.type
,
4167 if (matrix_a
->rank
== 1 && matrix_b
->rank
== 2)
4170 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4172 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4175 result
->shape
= gfc_get_shape (result
->rank
);
4176 mpz_init_set_si (result
->shape
[0], result_columns
);
4178 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 1)
4180 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4182 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4186 result
->shape
= gfc_get_shape (result
->rank
);
4187 mpz_init_set_si (result
->shape
[0], result_rows
);
4189 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 2)
4191 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4192 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4193 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4194 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4197 result
->shape
= gfc_get_shape (result
->rank
);
4198 mpz_init_set_si (result
->shape
[0], result_rows
);
4199 mpz_init_set_si (result
->shape
[1], result_columns
);
4204 offset_a
= offset_b
= 0;
4205 for (col
= 0; col
< result_columns
; ++col
)
4209 for (row
= 0; row
< result_rows
; ++row
)
4211 gfc_expr
*e
= compute_dot_product (matrix_a
, stride_a
, offset_a
,
4212 matrix_b
, 1, offset_b
, false);
4213 gfc_constructor_append_expr (&result
->value
.constructor
,
4219 offset_b
+= stride_b
;
4227 gfc_simplify_maskr (gfc_expr
*i
, gfc_expr
*kind_arg
)
4233 if (i
->expr_type
!= EXPR_CONSTANT
)
4236 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKR", gfc_default_integer_kind
);
4238 return &gfc_bad_expr
;
4239 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4241 s
= gfc_extract_int (i
, &arg
);
4244 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4246 /* MASKR(n) = 2^n - 1 */
4247 mpz_set_ui (result
->value
.integer
, 1);
4248 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
, arg
);
4249 mpz_sub_ui (result
->value
.integer
, result
->value
.integer
, 1);
4251 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4258 gfc_simplify_maskl (gfc_expr
*i
, gfc_expr
*kind_arg
)
4265 if (i
->expr_type
!= EXPR_CONSTANT
)
4268 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKL", gfc_default_integer_kind
);
4270 return &gfc_bad_expr
;
4271 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4273 s
= gfc_extract_int (i
, &arg
);
4276 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4278 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4279 mpz_init_set_ui (z
, 1);
4280 mpz_mul_2exp (z
, z
, gfc_integer_kinds
[k
].bit_size
);
4281 mpz_set_ui (result
->value
.integer
, 1);
4282 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
,
4283 gfc_integer_kinds
[k
].bit_size
- arg
);
4284 mpz_sub (result
->value
.integer
, z
, result
->value
.integer
);
4287 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4294 gfc_simplify_merge (gfc_expr
*tsource
, gfc_expr
*fsource
, gfc_expr
*mask
)
4297 gfc_constructor
*tsource_ctor
, *fsource_ctor
, *mask_ctor
;
4299 if (mask
->expr_type
== EXPR_CONSTANT
)
4300 return gfc_get_parentheses (gfc_copy_expr (mask
->value
.logical
4301 ? tsource
: fsource
));
4303 if (!mask
->rank
|| !is_constant_array_expr (mask
)
4304 || !is_constant_array_expr (tsource
) || !is_constant_array_expr (fsource
))
4307 result
= gfc_get_array_expr (tsource
->ts
.type
, tsource
->ts
.kind
,
4309 if (tsource
->ts
.type
== BT_DERIVED
)
4310 result
->ts
.u
.derived
= tsource
->ts
.u
.derived
;
4311 else if (tsource
->ts
.type
== BT_CHARACTER
)
4312 result
->ts
.u
.cl
= tsource
->ts
.u
.cl
;
4314 tsource_ctor
= gfc_constructor_first (tsource
->value
.constructor
);
4315 fsource_ctor
= gfc_constructor_first (fsource
->value
.constructor
);
4316 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4320 if (mask_ctor
->expr
->value
.logical
)
4321 gfc_constructor_append_expr (&result
->value
.constructor
,
4322 gfc_copy_expr (tsource_ctor
->expr
),
4325 gfc_constructor_append_expr (&result
->value
.constructor
,
4326 gfc_copy_expr (fsource_ctor
->expr
),
4328 tsource_ctor
= gfc_constructor_next (tsource_ctor
);
4329 fsource_ctor
= gfc_constructor_next (fsource_ctor
);
4330 mask_ctor
= gfc_constructor_next (mask_ctor
);
4333 result
->shape
= gfc_get_shape (1);
4334 gfc_array_size (result
, &result
->shape
[0]);
4341 gfc_simplify_merge_bits (gfc_expr
*i
, gfc_expr
*j
, gfc_expr
*mask_expr
)
4343 mpz_t arg1
, arg2
, mask
;
4346 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
4347 || mask_expr
->expr_type
!= EXPR_CONSTANT
)
4350 result
= gfc_get_constant_expr (BT_INTEGER
, i
->ts
.kind
, &i
->where
);
4352 /* Convert all argument to unsigned. */
4353 mpz_init_set (arg1
, i
->value
.integer
);
4354 mpz_init_set (arg2
, j
->value
.integer
);
4355 mpz_init_set (mask
, mask_expr
->value
.integer
);
4357 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4358 mpz_and (arg1
, arg1
, mask
);
4359 mpz_com (mask
, mask
);
4360 mpz_and (arg2
, arg2
, mask
);
4361 mpz_ior (result
->value
.integer
, arg1
, arg2
);
4371 /* Selects between current value and extremum for simplify_min_max
4372 and simplify_minval_maxval. */
4374 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
)
4376 switch (arg
->ts
.type
)
4379 if (mpz_cmp (arg
->value
.integer
,
4380 extremum
->value
.integer
) * sign
> 0)
4381 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
4385 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4387 mpfr_max (extremum
->value
.real
, extremum
->value
.real
,
4388 arg
->value
.real
, GFC_RND_MODE
);
4390 mpfr_min (extremum
->value
.real
, extremum
->value
.real
,
4391 arg
->value
.real
, GFC_RND_MODE
);
4395 #define LENGTH(x) ((x)->value.character.length)
4396 #define STRING(x) ((x)->value.character.string)
4397 if (LENGTH (extremum
) < LENGTH(arg
))
4399 gfc_char_t
*tmp
= STRING(extremum
);
4401 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
4402 memcpy (STRING(extremum
), tmp
,
4403 LENGTH(extremum
) * sizeof (gfc_char_t
));
4404 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
4405 LENGTH(arg
) - LENGTH(extremum
));
4406 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
4407 LENGTH(extremum
) = LENGTH(arg
);
4411 if (gfc_compare_string (arg
, extremum
) * sign
> 0)
4413 free (STRING(extremum
));
4414 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
4415 memcpy (STRING(extremum
), STRING(arg
),
4416 LENGTH(arg
) * sizeof (gfc_char_t
));
4417 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
4418 LENGTH(extremum
) - LENGTH(arg
));
4419 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
4426 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4431 /* This function is special since MAX() can take any number of
4432 arguments. The simplified expression is a rewritten version of the
4433 argument list containing at most one constant element. Other
4434 constant elements are deleted. Because the argument list has
4435 already been checked, this function always succeeds. sign is 1 for
4436 MAX(), -1 for MIN(). */
4439 simplify_min_max (gfc_expr
*expr
, int sign
)
4441 gfc_actual_arglist
*arg
, *last
, *extremum
;
4442 gfc_intrinsic_sym
* specific
;
4446 specific
= expr
->value
.function
.isym
;
4448 arg
= expr
->value
.function
.actual
;
4450 for (; arg
; last
= arg
, arg
= arg
->next
)
4452 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
4455 if (extremum
== NULL
)
4461 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
4463 /* Delete the extra constant argument. */
4464 last
->next
= arg
->next
;
4467 gfc_free_actual_arglist (arg
);
4471 /* If there is one value left, replace the function call with the
4473 if (expr
->value
.function
.actual
->next
!= NULL
)
4476 /* Convert to the correct type and kind. */
4477 if (expr
->ts
.type
!= BT_UNKNOWN
)
4478 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4479 expr
->ts
.type
, expr
->ts
.kind
);
4481 if (specific
->ts
.type
!= BT_UNKNOWN
)
4482 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4483 specific
->ts
.type
, specific
->ts
.kind
);
4485 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
4490 gfc_simplify_min (gfc_expr
*e
)
4492 return simplify_min_max (e
, -1);
4497 gfc_simplify_max (gfc_expr
*e
)
4499 return simplify_min_max (e
, 1);
4503 /* This is a simplified version of simplify_min_max to provide
4504 simplification of minval and maxval for a vector. */
4507 simplify_minval_maxval (gfc_expr
*expr
, int sign
)
4509 gfc_constructor
*c
, *extremum
;
4510 gfc_intrinsic_sym
* specific
;
4513 specific
= expr
->value
.function
.isym
;
4515 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4516 c
; c
= gfc_constructor_next (c
))
4518 if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
4521 if (extremum
== NULL
)
4527 min_max_choose (c
->expr
, extremum
->expr
, sign
);
4530 if (extremum
== NULL
)
4533 /* Convert to the correct type and kind. */
4534 if (expr
->ts
.type
!= BT_UNKNOWN
)
4535 return gfc_convert_constant (extremum
->expr
,
4536 expr
->ts
.type
, expr
->ts
.kind
);
4538 if (specific
->ts
.type
!= BT_UNKNOWN
)
4539 return gfc_convert_constant (extremum
->expr
,
4540 specific
->ts
.type
, specific
->ts
.kind
);
4542 return gfc_copy_expr (extremum
->expr
);
4547 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4549 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4552 return simplify_minval_maxval (array
, -1);
4557 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4559 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4562 return simplify_minval_maxval (array
, 1);
4567 gfc_simplify_maxexponent (gfc_expr
*x
)
4569 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4570 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4571 gfc_real_kinds
[i
].max_exponent
);
4576 gfc_simplify_minexponent (gfc_expr
*x
)
4578 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4579 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4580 gfc_real_kinds
[i
].min_exponent
);
4585 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
4590 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4593 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4594 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4599 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4601 /* Result is processor-dependent. */
4602 gfc_error ("Second argument MOD at %L is zero", &a
->where
);
4603 gfc_free_expr (result
);
4604 return &gfc_bad_expr
;
4606 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4610 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4612 /* Result is processor-dependent. */
4613 gfc_error ("Second argument of MOD at %L is zero", &p
->where
);
4614 gfc_free_expr (result
);
4615 return &gfc_bad_expr
;
4618 gfc_set_model_kind (kind
);
4619 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4624 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4627 return range_check (result
, "MOD");
4632 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
4637 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4640 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4641 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4646 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4648 /* Result is processor-dependent. This processor just opts
4649 to not handle it at all. */
4650 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
4651 gfc_free_expr (result
);
4652 return &gfc_bad_expr
;
4654 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4659 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4661 /* Result is processor-dependent. */
4662 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
4663 gfc_free_expr (result
);
4664 return &gfc_bad_expr
;
4667 gfc_set_model_kind (kind
);
4668 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4670 if (mpfr_cmp_ui (result
->value
.real
, 0) != 0)
4672 if (mpfr_signbit (a
->value
.real
) != mpfr_signbit (p
->value
.real
))
4673 mpfr_add (result
->value
.real
, result
->value
.real
, p
->value
.real
,
4677 mpfr_copysign (result
->value
.real
, result
->value
.real
,
4678 p
->value
.real
, GFC_RND_MODE
);
4682 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4685 return range_check (result
, "MODULO");
4690 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
4693 mp_exp_t emin
, emax
;
4696 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
4699 result
= gfc_copy_expr (x
);
4701 /* Save current values of emin and emax. */
4702 emin
= mpfr_get_emin ();
4703 emax
= mpfr_get_emax ();
4705 /* Set emin and emax for the current model number. */
4706 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
4707 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
4708 mpfr_get_prec(result
->value
.real
) + 1);
4709 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
4710 mpfr_check_range (result
->value
.real
, 0, GMP_RNDU
);
4712 if (mpfr_sgn (s
->value
.real
) > 0)
4714 mpfr_nextabove (result
->value
.real
);
4715 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
4719 mpfr_nextbelow (result
->value
.real
);
4720 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
4723 mpfr_set_emin (emin
);
4724 mpfr_set_emax (emax
);
4726 /* Only NaN can occur. Do not use range check as it gives an
4727 error for denormal numbers. */
4728 if (mpfr_nan_p (result
->value
.real
) && flag_range_check
)
4730 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
4731 gfc_free_expr (result
);
4732 return &gfc_bad_expr
;
4740 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
4742 gfc_expr
*itrunc
, *result
;
4745 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
4747 return &gfc_bad_expr
;
4749 if (e
->expr_type
!= EXPR_CONSTANT
)
4752 itrunc
= gfc_copy_expr (e
);
4753 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
4755 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
4756 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
4758 gfc_free_expr (itrunc
);
4760 return range_check (result
, name
);
4765 gfc_simplify_new_line (gfc_expr
*e
)
4769 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 1);
4770 result
->value
.character
.string
[0] = '\n';
4777 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
4779 return simplify_nint ("NINT", e
, k
);
4784 gfc_simplify_idnint (gfc_expr
*e
)
4786 return simplify_nint ("IDNINT", e
, NULL
);
4791 add_squared (gfc_expr
*result
, gfc_expr
*e
)
4795 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4796 gcc_assert (result
->ts
.type
== BT_REAL
4797 && result
->expr_type
== EXPR_CONSTANT
);
4799 gfc_set_model_kind (result
->ts
.kind
);
4801 mpfr_pow_ui (tmp
, e
->value
.real
, 2, GFC_RND_MODE
);
4802 mpfr_add (result
->value
.real
, result
->value
.real
, tmp
,
4811 do_sqrt (gfc_expr
*result
, gfc_expr
*e
)
4813 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4814 gcc_assert (result
->ts
.type
== BT_REAL
4815 && result
->expr_type
== EXPR_CONSTANT
);
4817 mpfr_set (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
4818 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4824 gfc_simplify_norm2 (gfc_expr
*e
, gfc_expr
*dim
)
4828 if (!is_constant_array_expr (e
)
4829 || (dim
!= NULL
&& !gfc_is_constant_expr (dim
)))
4832 result
= transformational_result (e
, dim
, e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4833 init_result_expr (result
, 0, NULL
);
4835 if (!dim
|| e
->rank
== 1)
4837 result
= simplify_transformation_to_scalar (result
, e
, NULL
,
4839 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4842 result
= simplify_transformation_to_array (result
, e
, dim
, NULL
,
4843 add_squared
, &do_sqrt
);
4850 gfc_simplify_not (gfc_expr
*e
)
4854 if (e
->expr_type
!= EXPR_CONSTANT
)
4857 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4858 mpz_com (result
->value
.integer
, e
->value
.integer
);
4860 return range_check (result
, "NOT");
4865 gfc_simplify_null (gfc_expr
*mold
)
4871 result
= gfc_copy_expr (mold
);
4872 result
->expr_type
= EXPR_NULL
;
4875 result
= gfc_get_null_expr (NULL
);
4882 gfc_simplify_num_images (gfc_expr
*distance ATTRIBUTE_UNUSED
, gfc_expr
*failed
)
4886 if (flag_coarray
== GFC_FCOARRAY_NONE
)
4888 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
4889 return &gfc_bad_expr
;
4892 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
4895 if (failed
&& failed
->expr_type
!= EXPR_CONSTANT
)
4898 /* FIXME: gfc_current_locus is wrong. */
4899 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
4900 &gfc_current_locus
);
4902 if (failed
&& failed
->value
.logical
!= 0)
4903 mpz_set_si (result
->value
.integer
, 0);
4905 mpz_set_si (result
->value
.integer
, 1);
4912 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
4917 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
4920 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
4925 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
4926 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
4927 return range_check (result
, "OR");
4930 return gfc_get_logical_expr (kind
, &x
->where
,
4931 x
->value
.logical
|| y
->value
.logical
);
4939 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
4942 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
4944 if (!is_constant_array_expr (array
)
4945 || !is_constant_array_expr (vector
)
4946 || (!gfc_is_constant_expr (mask
)
4947 && !is_constant_array_expr (mask
)))
4950 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
4951 if (array
->ts
.type
== BT_DERIVED
)
4952 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
4954 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
4955 vector_ctor
= vector
4956 ? gfc_constructor_first (vector
->value
.constructor
)
4959 if (mask
->expr_type
== EXPR_CONSTANT
4960 && mask
->value
.logical
)
4962 /* Copy all elements of ARRAY to RESULT. */
4965 gfc_constructor_append_expr (&result
->value
.constructor
,
4966 gfc_copy_expr (array_ctor
->expr
),
4969 array_ctor
= gfc_constructor_next (array_ctor
);
4970 vector_ctor
= gfc_constructor_next (vector_ctor
);
4973 else if (mask
->expr_type
== EXPR_ARRAY
)
4975 /* Copy only those elements of ARRAY to RESULT whose
4976 MASK equals .TRUE.. */
4977 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4980 if (mask_ctor
->expr
->value
.logical
)
4982 gfc_constructor_append_expr (&result
->value
.constructor
,
4983 gfc_copy_expr (array_ctor
->expr
),
4985 vector_ctor
= gfc_constructor_next (vector_ctor
);
4988 array_ctor
= gfc_constructor_next (array_ctor
);
4989 mask_ctor
= gfc_constructor_next (mask_ctor
);
4993 /* Append any left-over elements from VECTOR to RESULT. */
4996 gfc_constructor_append_expr (&result
->value
.constructor
,
4997 gfc_copy_expr (vector_ctor
->expr
),
4999 vector_ctor
= gfc_constructor_next (vector_ctor
);
5002 result
->shape
= gfc_get_shape (1);
5003 gfc_array_size (result
, &result
->shape
[0]);
5005 if (array
->ts
.type
== BT_CHARACTER
)
5006 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
5013 do_xor (gfc_expr
*result
, gfc_expr
*e
)
5015 gcc_assert (e
->ts
.type
== BT_LOGICAL
&& e
->expr_type
== EXPR_CONSTANT
);
5016 gcc_assert (result
->ts
.type
== BT_LOGICAL
5017 && result
->expr_type
== EXPR_CONSTANT
);
5019 result
->value
.logical
= result
->value
.logical
!= e
->value
.logical
;
5026 gfc_simplify_parity (gfc_expr
*e
, gfc_expr
*dim
)
5028 return simplify_transformation (e
, dim
, NULL
, 0, do_xor
);
5033 gfc_simplify_popcnt (gfc_expr
*e
)
5038 if (e
->expr_type
!= EXPR_CONSTANT
)
5041 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5043 /* Convert argument to unsigned, then count the '1' bits. */
5044 mpz_init_set (x
, e
->value
.integer
);
5045 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
5046 res
= mpz_popcount (x
);
5049 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, res
);
5054 gfc_simplify_poppar (gfc_expr
*e
)
5060 if (e
->expr_type
!= EXPR_CONSTANT
)
5063 popcnt
= gfc_simplify_popcnt (e
);
5064 gcc_assert (popcnt
);
5066 s
= gfc_extract_int (popcnt
, &i
);
5069 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
% 2);
5074 gfc_simplify_precision (gfc_expr
*e
)
5076 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5077 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
,
5078 gfc_real_kinds
[i
].precision
);
5083 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
5085 return simplify_transformation (array
, dim
, mask
, 1, gfc_multiply
);
5090 gfc_simplify_radix (gfc_expr
*e
)
5093 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5098 i
= gfc_integer_kinds
[i
].radix
;
5102 i
= gfc_real_kinds
[i
].radix
;
5109 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
5114 gfc_simplify_range (gfc_expr
*e
)
5117 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5122 i
= gfc_integer_kinds
[i
].range
;
5127 i
= gfc_real_kinds
[i
].range
;
5134 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
5139 gfc_simplify_rank (gfc_expr
*e
)
5145 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, e
->rank
);
5150 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
5152 gfc_expr
*result
= NULL
;
5155 if (e
->ts
.type
== BT_COMPLEX
)
5156 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
5158 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
5161 return &gfc_bad_expr
;
5163 if (e
->expr_type
!= EXPR_CONSTANT
)
5166 if (convert_boz (e
, kind
) == &gfc_bad_expr
)
5167 return &gfc_bad_expr
;
5169 result
= gfc_convert_constant (e
, BT_REAL
, kind
);
5170 if (result
== &gfc_bad_expr
)
5171 return &gfc_bad_expr
;
5173 return range_check (result
, "REAL");
5178 gfc_simplify_realpart (gfc_expr
*e
)
5182 if (e
->expr_type
!= EXPR_CONSTANT
)
5185 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
5186 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
5188 return range_check (result
, "REALPART");
5192 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
5195 int i
, j
, len
, ncop
, nlen
;
5197 bool have_length
= false;
5199 /* If NCOPIES isn't a constant, there's nothing we can do. */
5200 if (n
->expr_type
!= EXPR_CONSTANT
)
5203 /* If NCOPIES is negative, it's an error. */
5204 if (mpz_sgn (n
->value
.integer
) < 0)
5206 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
5208 return &gfc_bad_expr
;
5211 /* If we don't know the character length, we can do no more. */
5212 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
5213 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
5215 len
= mpz_get_si (e
->ts
.u
.cl
->length
->value
.integer
);
5218 else if (e
->expr_type
== EXPR_CONSTANT
5219 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
5221 len
= e
->value
.character
.length
;
5226 /* If the source length is 0, any value of NCOPIES is valid
5227 and everything behaves as if NCOPIES == 0. */
5230 mpz_set_ui (ncopies
, 0);
5232 mpz_set (ncopies
, n
->value
.integer
);
5234 /* Check that NCOPIES isn't too large. */
5240 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
5242 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
5246 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
5247 e
->ts
.u
.cl
->length
->value
.integer
);
5251 mpz_init_set_si (mlen
, len
);
5252 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
5256 /* The check itself. */
5257 if (mpz_cmp (ncopies
, max
) > 0)
5260 mpz_clear (ncopies
);
5261 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
5263 return &gfc_bad_expr
;
5268 mpz_clear (ncopies
);
5270 /* For further simplification, we need the character string to be
5272 if (e
->expr_type
!= EXPR_CONSTANT
)
5276 (e
->ts
.u
.cl
->length
&&
5277 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
) != 0))
5279 const char *res
= gfc_extract_int (n
, &ncop
);
5280 gcc_assert (res
== NULL
);
5286 return gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 0);
5288 len
= e
->value
.character
.length
;
5291 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, nlen
);
5292 for (i
= 0; i
< ncop
; i
++)
5293 for (j
= 0; j
< len
; j
++)
5294 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
5296 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
5301 /* This one is a bear, but mainly has to do with shuffling elements. */
5304 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
5305 gfc_expr
*pad
, gfc_expr
*order_exp
)
5307 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
5308 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
5312 gfc_expr
*e
, *result
;
5314 /* Check that argument expression types are OK. */
5315 if (!is_constant_array_expr (source
)
5316 || !is_constant_array_expr (shape_exp
)
5317 || !is_constant_array_expr (pad
)
5318 || !is_constant_array_expr (order_exp
))
5321 if (source
->shape
== NULL
)
5324 /* Proceed with simplification, unpacking the array. */
5331 e
= gfc_constructor_lookup_expr (shape_exp
->value
.constructor
, rank
);
5335 gfc_extract_int (e
, &shape
[rank
]);
5337 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
5338 gcc_assert (shape
[rank
] >= 0);
5343 gcc_assert (rank
> 0);
5345 /* Now unpack the order array if present. */
5346 if (order_exp
== NULL
)
5348 for (i
= 0; i
< rank
; i
++)
5353 for (i
= 0; i
< rank
; i
++)
5356 for (i
= 0; i
< rank
; i
++)
5358 e
= gfc_constructor_lookup_expr (order_exp
->value
.constructor
, i
);
5361 gfc_extract_int (e
, &order
[i
]);
5363 gcc_assert (order
[i
] >= 1 && order
[i
] <= rank
);
5365 gcc_assert (x
[order
[i
]] == 0);
5370 /* Count the elements in the source and padding arrays. */
5375 gfc_array_size (pad
, &size
);
5376 npad
= mpz_get_ui (size
);
5380 gfc_array_size (source
, &size
);
5381 nsource
= mpz_get_ui (size
);
5384 /* If it weren't for that pesky permutation we could just loop
5385 through the source and round out any shortage with pad elements.
5386 But no, someone just had to have the compiler do something the
5387 user should be doing. */
5389 for (i
= 0; i
< rank
; i
++)
5392 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5394 if (source
->ts
.type
== BT_DERIVED
)
5395 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5396 result
->rank
= rank
;
5397 result
->shape
= gfc_get_shape (rank
);
5398 for (i
= 0; i
< rank
; i
++)
5399 mpz_init_set_ui (result
->shape
[i
], shape
[i
]);
5401 while (nsource
> 0 || npad
> 0)
5403 /* Figure out which element to extract. */
5404 mpz_set_ui (index
, 0);
5406 for (i
= rank
- 1; i
>= 0; i
--)
5408 mpz_add_ui (index
, index
, x
[order
[i
]]);
5410 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
5413 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
5414 gfc_internal_error ("Reshaped array too large at %C");
5416 j
= mpz_get_ui (index
);
5419 e
= gfc_constructor_lookup_expr (source
->value
.constructor
, j
);
5429 e
= gfc_constructor_lookup_expr (pad
->value
.constructor
, j
);
5433 gfc_constructor_append_expr (&result
->value
.constructor
,
5434 gfc_copy_expr (e
), &e
->where
);
5436 /* Calculate the next element. */
5440 if (++x
[i
] < shape
[i
])
5456 gfc_simplify_rrspacing (gfc_expr
*x
)
5462 if (x
->expr_type
!= EXPR_CONSTANT
)
5465 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
5467 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5469 /* RRSPACING(+/- 0.0) = 0.0 */
5470 if (mpfr_zero_p (x
->value
.real
))
5472 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5476 /* RRSPACING(inf) = NaN */
5477 if (mpfr_inf_p (x
->value
.real
))
5479 mpfr_set_nan (result
->value
.real
);
5483 /* RRSPACING(NaN) = same NaN */
5484 if (mpfr_nan_p (x
->value
.real
))
5486 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5490 /* | x * 2**(-e) | * 2**p. */
5491 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5492 e
= - (long int) mpfr_get_exp (x
->value
.real
);
5493 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
5495 p
= (long int) gfc_real_kinds
[i
].digits
;
5496 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
5498 return range_check (result
, "RRSPACING");
5503 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
5505 int k
, neg_flag
, power
, exp_range
;
5506 mpfr_t scale
, radix
;
5509 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5512 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5514 if (mpfr_zero_p (x
->value
.real
))
5516 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5520 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5522 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
5524 /* This check filters out values of i that would overflow an int. */
5525 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
5526 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
5528 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
5529 gfc_free_expr (result
);
5530 return &gfc_bad_expr
;
5533 /* Compute scale = radix ** power. */
5534 power
= mpz_get_si (i
->value
.integer
);
5544 gfc_set_model_kind (x
->ts
.kind
);
5547 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
5548 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
5551 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5553 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5555 mpfr_clears (scale
, radix
, NULL
);
5557 return range_check (result
, "SCALE");
5561 /* Variants of strspn and strcspn that operate on wide characters. */
5564 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5567 const gfc_char_t
*c
;
5571 for (c
= s2
; *c
; c
++)
5585 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5588 const gfc_char_t
*c
;
5592 for (c
= s2
; *c
; c
++)
5607 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
5612 size_t indx
, len
, lenc
;
5613 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
5616 return &gfc_bad_expr
;
5618 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
5619 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
5622 if (b
!= NULL
&& b
->value
.logical
!= 0)
5627 len
= e
->value
.character
.length
;
5628 lenc
= c
->value
.character
.length
;
5630 if (len
== 0 || lenc
== 0)
5638 indx
= wide_strcspn (e
->value
.character
.string
,
5639 c
->value
.character
.string
) + 1;
5646 for (indx
= len
; indx
> 0; indx
--)
5648 for (i
= 0; i
< lenc
; i
++)
5650 if (c
->value
.character
.string
[i
]
5651 == e
->value
.character
.string
[indx
- 1])
5660 result
= gfc_get_int_expr (k
, &e
->where
, indx
);
5661 return range_check (result
, "SCAN");
5666 gfc_simplify_selected_char_kind (gfc_expr
*e
)
5670 if (e
->expr_type
!= EXPR_CONSTANT
)
5673 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
5674 || gfc_compare_with_Cstring (e
, "default", false) == 0)
5676 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
5681 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5686 gfc_simplify_selected_int_kind (gfc_expr
*e
)
5690 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
) != NULL
)
5695 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
5696 if (gfc_integer_kinds
[i
].range
>= range
5697 && gfc_integer_kinds
[i
].kind
< kind
)
5698 kind
= gfc_integer_kinds
[i
].kind
;
5700 if (kind
== INT_MAX
)
5703 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5708 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
, gfc_expr
*rdx
)
5710 int range
, precision
, radix
, i
, kind
, found_precision
, found_range
,
5712 locus
*loc
= &gfc_current_locus
;
5718 if (p
->expr_type
!= EXPR_CONSTANT
5719 || gfc_extract_int (p
, &precision
) != NULL
)
5728 if (q
->expr_type
!= EXPR_CONSTANT
5729 || gfc_extract_int (q
, &range
) != NULL
)
5740 if (rdx
->expr_type
!= EXPR_CONSTANT
5741 || gfc_extract_int (rdx
, &radix
) != NULL
)
5749 found_precision
= 0;
5753 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
5755 if (gfc_real_kinds
[i
].precision
>= precision
)
5756 found_precision
= 1;
5758 if (gfc_real_kinds
[i
].range
>= range
)
5761 if (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
5764 if (gfc_real_kinds
[i
].precision
>= precision
5765 && gfc_real_kinds
[i
].range
>= range
5766 && (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
5767 && gfc_real_kinds
[i
].kind
< kind
)
5768 kind
= gfc_real_kinds
[i
].kind
;
5771 if (kind
== INT_MAX
)
5773 if (found_radix
&& found_range
&& !found_precision
)
5775 else if (found_radix
&& found_precision
&& !found_range
)
5777 else if (found_radix
&& !found_precision
&& !found_range
)
5779 else if (found_radix
)
5785 return gfc_get_int_expr (gfc_default_integer_kind
, loc
, kind
);
5790 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
5793 mpfr_t exp
, absv
, log2
, pow2
, frac
;
5796 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5799 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5801 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
5802 SET_EXPONENT (NaN) = same NaN */
5803 if (mpfr_zero_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
5805 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5809 /* SET_EXPONENT (inf) = NaN */
5810 if (mpfr_inf_p (x
->value
.real
))
5812 mpfr_set_nan (result
->value
.real
);
5816 gfc_set_model_kind (x
->ts
.kind
);
5823 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
5824 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
5826 mpfr_trunc (log2
, log2
);
5827 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
5829 /* Old exponent value, and fraction. */
5830 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
5832 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
5835 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
5836 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
5838 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
5840 return range_check (result
, "SET_EXPONENT");
5845 gfc_simplify_shape (gfc_expr
*source
, gfc_expr
*kind
)
5847 mpz_t shape
[GFC_MAX_DIMENSIONS
];
5848 gfc_expr
*result
, *e
, *f
;
5852 int k
= get_kind (BT_INTEGER
, kind
, "SHAPE", gfc_default_integer_kind
);
5854 if (source
->rank
== -1)
5857 result
= gfc_get_array_expr (BT_INTEGER
, k
, &source
->where
);
5859 if (source
->rank
== 0)
5862 if (source
->expr_type
== EXPR_VARIABLE
)
5864 ar
= gfc_find_array_ref (source
);
5865 t
= gfc_array_ref_shape (ar
, shape
);
5867 else if (source
->shape
)
5870 for (n
= 0; n
< source
->rank
; n
++)
5872 mpz_init (shape
[n
]);
5873 mpz_set (shape
[n
], source
->shape
[n
]);
5879 for (n
= 0; n
< source
->rank
; n
++)
5881 e
= gfc_get_constant_expr (BT_INTEGER
, k
, &source
->where
);
5884 mpz_set (e
->value
.integer
, shape
[n
]);
5887 mpz_set_ui (e
->value
.integer
, n
+ 1);
5889 f
= simplify_size (source
, e
, k
);
5893 gfc_free_expr (result
);
5900 if (e
== &gfc_bad_expr
|| range_check (e
, "SHAPE") == &gfc_bad_expr
)
5902 gfc_free_expr (result
);
5904 gfc_clear_shape (shape
, source
->rank
);
5905 return &gfc_bad_expr
;
5908 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
5912 gfc_clear_shape (shape
, source
->rank
);
5919 simplify_size (gfc_expr
*array
, gfc_expr
*dim
, int k
)
5922 gfc_expr
*return_value
;
5925 /* For unary operations, the size of the result is given by the size
5926 of the operand. For binary ones, it's the size of the first operand
5927 unless it is scalar, then it is the size of the second. */
5928 if (array
->expr_type
== EXPR_OP
&& !array
->value
.op
.uop
)
5930 gfc_expr
* replacement
;
5931 gfc_expr
* simplified
;
5933 switch (array
->value
.op
.op
)
5935 /* Unary operations. */
5937 case INTRINSIC_UPLUS
:
5938 case INTRINSIC_UMINUS
:
5939 case INTRINSIC_PARENTHESES
:
5940 replacement
= array
->value
.op
.op1
;
5943 /* Binary operations. If any one of the operands is scalar, take
5944 the other one's size. If both of them are arrays, it does not
5945 matter -- try to find one with known shape, if possible. */
5947 if (array
->value
.op
.op1
->rank
== 0)
5948 replacement
= array
->value
.op
.op2
;
5949 else if (array
->value
.op
.op2
->rank
== 0)
5950 replacement
= array
->value
.op
.op1
;
5953 simplified
= simplify_size (array
->value
.op
.op1
, dim
, k
);
5957 replacement
= array
->value
.op
.op2
;
5962 /* Try to reduce it directly if possible. */
5963 simplified
= simplify_size (replacement
, dim
, k
);
5965 /* Otherwise, we build a new SIZE call. This is hopefully at least
5966 simpler than the original one. */
5969 gfc_expr
*kind
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, k
);
5970 simplified
= gfc_build_intrinsic_call (gfc_current_ns
,
5971 GFC_ISYM_SIZE
, "size",
5973 gfc_copy_expr (replacement
),
5974 gfc_copy_expr (dim
),
5982 if (!gfc_array_size (array
, &size
))
5987 if (dim
->expr_type
!= EXPR_CONSTANT
)
5990 d
= mpz_get_ui (dim
->value
.integer
) - 1;
5991 if (!gfc_array_dimen_size (array
, d
, &size
))
5995 return_value
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
5996 mpz_set (return_value
->value
.integer
, size
);
5999 return return_value
;
6004 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6007 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
6010 return &gfc_bad_expr
;
6012 result
= simplify_size (array
, dim
, k
);
6013 if (result
== NULL
|| result
== &gfc_bad_expr
)
6016 return range_check (result
, "SIZE");
6020 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
6021 multiplied by the array size. */
6024 gfc_simplify_sizeof (gfc_expr
*x
)
6026 gfc_expr
*result
= NULL
;
6029 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6032 if (x
->ts
.type
== BT_CHARACTER
6033 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6034 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6037 if (x
->rank
&& x
->expr_type
!= EXPR_ARRAY
6038 && !gfc_array_size (x
, &array_size
))
6041 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_index_integer_kind
,
6043 mpz_set_si (result
->value
.integer
, gfc_target_expr_size (x
));
6049 /* STORAGE_SIZE returns the size in bits of a single array element. */
6052 gfc_simplify_storage_size (gfc_expr
*x
,
6055 gfc_expr
*result
= NULL
;
6058 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6061 if (x
->ts
.type
== BT_CHARACTER
&& x
->expr_type
!= EXPR_CONSTANT
6062 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6063 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6066 k
= get_kind (BT_INTEGER
, kind
, "STORAGE_SIZE", gfc_default_integer_kind
);
6068 return &gfc_bad_expr
;
6070 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
6072 mpz_set_si (result
->value
.integer
, gfc_element_size (x
));
6073 mpz_mul_ui (result
->value
.integer
, result
->value
.integer
, BITS_PER_UNIT
);
6075 return range_check (result
, "STORAGE_SIZE");
6080 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
6084 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6087 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6092 mpz_abs (result
->value
.integer
, x
->value
.integer
);
6093 if (mpz_sgn (y
->value
.integer
) < 0)
6094 mpz_neg (result
->value
.integer
, result
->value
.integer
);
6099 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
6102 mpfr_setsign (result
->value
.real
, x
->value
.real
,
6103 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
6107 gfc_internal_error ("Bad type in gfc_simplify_sign");
6115 gfc_simplify_sin (gfc_expr
*x
)
6119 if (x
->expr_type
!= EXPR_CONSTANT
)
6122 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6127 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6131 gfc_set_model (x
->value
.real
);
6132 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6136 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
6139 return range_check (result
, "SIN");
6144 gfc_simplify_sinh (gfc_expr
*x
)
6148 if (x
->expr_type
!= EXPR_CONSTANT
)
6151 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6156 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6160 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6167 return range_check (result
, "SINH");
6171 /* The argument is always a double precision real that is converted to
6172 single precision. TODO: Rounding! */
6175 gfc_simplify_sngl (gfc_expr
*a
)
6179 if (a
->expr_type
!= EXPR_CONSTANT
)
6182 result
= gfc_real2real (a
, gfc_default_real_kind
);
6183 return range_check (result
, "SNGL");
6188 gfc_simplify_spacing (gfc_expr
*x
)
6194 if (x
->expr_type
!= EXPR_CONSTANT
)
6197 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
6198 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6200 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
6201 if (mpfr_zero_p (x
->value
.real
))
6203 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
6207 /* SPACING(inf) = NaN */
6208 if (mpfr_inf_p (x
->value
.real
))
6210 mpfr_set_nan (result
->value
.real
);
6214 /* SPACING(NaN) = same NaN */
6215 if (mpfr_nan_p (x
->value
.real
))
6217 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6221 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
6222 are the radix, exponent of x, and precision. This excludes the
6223 possibility of subnormal numbers. Fortran 2003 states the result is
6224 b**max(e - p, emin - 1). */
6226 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
6227 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
6228 en
= en
> ep
? en
: ep
;
6230 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
6231 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
6233 return range_check (result
, "SPACING");
6238 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
6240 gfc_expr
*result
= NULL
;
6241 int nelem
, i
, j
, dim
, ncopies
;
6244 if ((!gfc_is_constant_expr (source
)
6245 && !is_constant_array_expr (source
))
6246 || !gfc_is_constant_expr (dim_expr
)
6247 || !gfc_is_constant_expr (ncopies_expr
))
6250 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
6251 gfc_extract_int (dim_expr
, &dim
);
6252 dim
-= 1; /* zero-base DIM */
6254 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
6255 gfc_extract_int (ncopies_expr
, &ncopies
);
6256 ncopies
= MAX (ncopies
, 0);
6258 /* Do not allow the array size to exceed the limit for an array
6260 if (source
->expr_type
== EXPR_ARRAY
)
6262 if (!gfc_array_size (source
, &size
))
6263 gfc_internal_error ("Failure getting length of a constant array.");
6266 mpz_init_set_ui (size
, 1);
6268 nelem
= mpz_get_si (size
) * ncopies
;
6269 if (nelem
> flag_max_array_constructor
)
6271 if (gfc_current_ns
->sym_root
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
6273 gfc_error ("The number of elements (%d) in the array constructor "
6274 "at %L requires an increase of the allowed %d upper "
6275 "limit. See %<-fmax-array-constructor%> option.",
6276 nelem
, &source
->where
, flag_max_array_constructor
);
6277 return &gfc_bad_expr
;
6283 if (source
->expr_type
== EXPR_CONSTANT
)
6285 gcc_assert (dim
== 0);
6287 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6289 if (source
->ts
.type
== BT_DERIVED
)
6290 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6292 result
->shape
= gfc_get_shape (result
->rank
);
6293 mpz_init_set_si (result
->shape
[0], ncopies
);
6295 for (i
= 0; i
< ncopies
; ++i
)
6296 gfc_constructor_append_expr (&result
->value
.constructor
,
6297 gfc_copy_expr (source
), NULL
);
6299 else if (source
->expr_type
== EXPR_ARRAY
)
6301 int offset
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
6302 gfc_constructor
*source_ctor
;
6304 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
6305 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
6307 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6309 if (source
->ts
.type
== BT_DERIVED
)
6310 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6311 result
->rank
= source
->rank
+ 1;
6312 result
->shape
= gfc_get_shape (result
->rank
);
6314 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
6317 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
6319 mpz_init_set_si (result
->shape
[i
], ncopies
);
6321 extent
[i
] = mpz_get_si (result
->shape
[i
]);
6322 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
6326 for (source_ctor
= gfc_constructor_first (source
->value
.constructor
);
6327 source_ctor
; source_ctor
= gfc_constructor_next (source_ctor
))
6329 for (i
= 0; i
< ncopies
; ++i
)
6330 gfc_constructor_insert_expr (&result
->value
.constructor
,
6331 gfc_copy_expr (source_ctor
->expr
),
6332 NULL
, offset
+ i
* rstride
[dim
]);
6334 offset
+= (dim
== 0 ? ncopies
: 1);
6339 gfc_error ("Simplification of SPREAD at %C not yet implemented");
6340 return &gfc_bad_expr
;
6343 if (source
->ts
.type
== BT_CHARACTER
)
6344 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
6351 gfc_simplify_sqrt (gfc_expr
*e
)
6353 gfc_expr
*result
= NULL
;
6355 if (e
->expr_type
!= EXPR_CONSTANT
)
6361 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
6363 gfc_error ("Argument of SQRT at %L has a negative value",
6365 return &gfc_bad_expr
;
6367 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6368 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
6372 gfc_set_model (e
->value
.real
);
6374 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6375 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
6379 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
6382 return range_check (result
, "SQRT");
6387 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
6389 return simplify_transformation (array
, dim
, mask
, 0, gfc_add
);
6394 gfc_simplify_cotan (gfc_expr
*x
)
6399 if (x
->expr_type
!= EXPR_CONSTANT
)
6402 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6407 mpfr_cot (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6411 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
6412 val
= &result
->value
.complex;
6413 mpc_init2 (swp
, mpfr_get_default_prec ());
6414 mpc_cos (swp
, x
->value
.complex, GFC_MPC_RND_MODE
);
6415 mpc_sin (*val
, x
->value
.complex, GFC_MPC_RND_MODE
);
6416 mpc_div (*val
, swp
, *val
, GFC_MPC_RND_MODE
);
6424 return range_check (result
, "COTAN");
6429 gfc_simplify_tan (gfc_expr
*x
)
6433 if (x
->expr_type
!= EXPR_CONSTANT
)
6436 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6441 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6445 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6452 return range_check (result
, "TAN");
6457 gfc_simplify_tanh (gfc_expr
*x
)
6461 if (x
->expr_type
!= EXPR_CONSTANT
)
6464 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6469 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6473 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6480 return range_check (result
, "TANH");
6485 gfc_simplify_tiny (gfc_expr
*e
)
6490 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
6492 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
6493 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
6500 gfc_simplify_trailz (gfc_expr
*e
)
6502 unsigned long tz
, bs
;
6505 if (e
->expr_type
!= EXPR_CONSTANT
)
6508 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
6509 bs
= gfc_integer_kinds
[i
].bit_size
;
6510 tz
= mpz_scan1 (e
->value
.integer
, 0);
6512 return gfc_get_int_expr (gfc_default_integer_kind
,
6513 &e
->where
, MIN (tz
, bs
));
6518 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
6521 gfc_expr
*mold_element
;
6526 unsigned char *buffer
;
6527 size_t result_length
;
6530 if (!gfc_is_constant_expr (source
)
6531 || (gfc_init_expr_flag
&& !gfc_is_constant_expr (mold
))
6532 || !gfc_is_constant_expr (size
))
6535 if (!gfc_calculate_transfer_sizes (source
, mold
, size
, &source_size
,
6536 &result_size
, &result_length
))
6539 /* Calculate the size of the source. */
6540 if (source
->expr_type
== EXPR_ARRAY
6541 && !gfc_array_size (source
, &tmp
))
6542 gfc_internal_error ("Failure getting length of a constant array.");
6544 /* Create an empty new expression with the appropriate characteristics. */
6545 result
= gfc_get_constant_expr (mold
->ts
.type
, mold
->ts
.kind
,
6547 result
->ts
= mold
->ts
;
6549 mold_element
= mold
->expr_type
== EXPR_ARRAY
6550 ? gfc_constructor_first (mold
->value
.constructor
)->expr
6553 /* Set result character length, if needed. Note that this needs to be
6554 set even for array expressions, in order to pass this information into
6555 gfc_target_interpret_expr. */
6556 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
6557 result
->value
.character
.length
= mold_element
->value
.character
.length
;
6559 /* Set the number of elements in the result, and determine its size. */
6561 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
6563 result
->expr_type
= EXPR_ARRAY
;
6565 result
->shape
= gfc_get_shape (1);
6566 mpz_init_set_ui (result
->shape
[0], result_length
);
6571 /* Allocate the buffer to store the binary version of the source. */
6572 buffer_size
= MAX (source_size
, result_size
);
6573 buffer
= (unsigned char*)alloca (buffer_size
);
6574 memset (buffer
, 0, buffer_size
);
6576 /* Now write source to the buffer. */
6577 gfc_target_encode_expr (source
, buffer
, buffer_size
);
6579 /* And read the buffer back into the new expression. */
6580 gfc_target_interpret_expr (buffer
, buffer_size
, result
, false);
6587 gfc_simplify_transpose (gfc_expr
*matrix
)
6589 int row
, matrix_rows
, col
, matrix_cols
;
6592 if (!is_constant_array_expr (matrix
))
6595 gcc_assert (matrix
->rank
== 2);
6597 result
= gfc_get_array_expr (matrix
->ts
.type
, matrix
->ts
.kind
,
6600 result
->shape
= gfc_get_shape (result
->rank
);
6601 mpz_set (result
->shape
[0], matrix
->shape
[1]);
6602 mpz_set (result
->shape
[1], matrix
->shape
[0]);
6604 if (matrix
->ts
.type
== BT_CHARACTER
)
6605 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
6606 else if (matrix
->ts
.type
== BT_DERIVED
)
6607 result
->ts
.u
.derived
= matrix
->ts
.u
.derived
;
6609 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
6610 matrix_cols
= mpz_get_si (matrix
->shape
[1]);
6611 for (row
= 0; row
< matrix_rows
; ++row
)
6612 for (col
= 0; col
< matrix_cols
; ++col
)
6614 gfc_expr
*e
= gfc_constructor_lookup_expr (matrix
->value
.constructor
,
6615 col
* matrix_rows
+ row
);
6616 gfc_constructor_insert_expr (&result
->value
.constructor
,
6617 gfc_copy_expr (e
), &matrix
->where
,
6618 row
* matrix_cols
+ col
);
6626 gfc_simplify_trim (gfc_expr
*e
)
6629 int count
, i
, len
, lentrim
;
6631 if (e
->expr_type
!= EXPR_CONSTANT
)
6634 len
= e
->value
.character
.length
;
6635 for (count
= 0, i
= 1; i
<= len
; ++i
)
6637 if (e
->value
.character
.string
[len
- i
] == ' ')
6643 lentrim
= len
- count
;
6645 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, lentrim
);
6646 for (i
= 0; i
< lentrim
; i
++)
6647 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
6654 gfc_simplify_image_index (gfc_expr
*coarray
, gfc_expr
*sub
)
6659 gfc_constructor
*sub_cons
;
6663 if (!is_constant_array_expr (sub
))
6666 /* Follow any component references. */
6667 as
= coarray
->symtree
->n
.sym
->as
;
6668 for (ref
= coarray
->ref
; ref
; ref
= ref
->next
)
6669 if (ref
->type
== REF_COMPONENT
)
6672 if (as
->type
== AS_DEFERRED
)
6675 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6676 the cosubscript addresses the first image. */
6678 sub_cons
= gfc_constructor_first (sub
->value
.constructor
);
6681 for (d
= 1; d
<= as
->corank
; d
++)
6686 gcc_assert (sub_cons
!= NULL
);
6688 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 0, as
,
6690 if (ca_bound
== NULL
)
6693 if (ca_bound
== &gfc_bad_expr
)
6696 cmp
= mpz_cmp (ca_bound
->value
.integer
, sub_cons
->expr
->value
.integer
);
6700 gfc_free_expr (ca_bound
);
6701 sub_cons
= gfc_constructor_next (sub_cons
);
6705 first_image
= false;
6709 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6710 "SUB has %ld and COARRAY lower bound is %ld)",
6712 mpz_get_si (sub_cons
->expr
->value
.integer
),
6713 mpz_get_si (ca_bound
->value
.integer
));
6714 gfc_free_expr (ca_bound
);
6715 return &gfc_bad_expr
;
6718 gfc_free_expr (ca_bound
);
6720 /* Check whether upperbound is valid for the multi-images case. */
6723 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 1, as
,
6725 if (ca_bound
== &gfc_bad_expr
)
6728 if (ca_bound
&& ca_bound
->expr_type
== EXPR_CONSTANT
6729 && mpz_cmp (ca_bound
->value
.integer
,
6730 sub_cons
->expr
->value
.integer
) < 0)
6732 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6733 "SUB has %ld and COARRAY upper bound is %ld)",
6735 mpz_get_si (sub_cons
->expr
->value
.integer
),
6736 mpz_get_si (ca_bound
->value
.integer
));
6737 gfc_free_expr (ca_bound
);
6738 return &gfc_bad_expr
;
6742 gfc_free_expr (ca_bound
);
6745 sub_cons
= gfc_constructor_next (sub_cons
);
6748 gcc_assert (sub_cons
== NULL
);
6750 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
&& !first_image
)
6753 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6754 &gfc_current_locus
);
6756 mpz_set_si (result
->value
.integer
, 1);
6758 mpz_set_si (result
->value
.integer
, 0);
6765 gfc_simplify_this_image (gfc_expr
*coarray
, gfc_expr
*dim
,
6766 gfc_expr
*distance ATTRIBUTE_UNUSED
)
6768 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
6771 /* If no coarray argument has been passed or when the first argument
6772 is actually a distance argment. */
6773 if (coarray
== NULL
|| !gfc_is_coarray (coarray
))
6776 /* FIXME: gfc_current_locus is wrong. */
6777 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6778 &gfc_current_locus
);
6779 mpz_set_si (result
->value
.integer
, 1);
6783 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6784 return simplify_cobound (coarray
, dim
, NULL
, 0);
6789 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6791 return simplify_bound (array
, dim
, kind
, 1);
6795 gfc_simplify_ucobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6797 return simplify_cobound (array
, dim
, kind
, 1);
6802 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
6804 gfc_expr
*result
, *e
;
6805 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
6807 if (!is_constant_array_expr (vector
)
6808 || !is_constant_array_expr (mask
)
6809 || (!gfc_is_constant_expr (field
)
6810 && !is_constant_array_expr (field
)))
6813 result
= gfc_get_array_expr (vector
->ts
.type
, vector
->ts
.kind
,
6815 if (vector
->ts
.type
== BT_DERIVED
)
6816 result
->ts
.u
.derived
= vector
->ts
.u
.derived
;
6817 result
->rank
= mask
->rank
;
6818 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
6820 if (vector
->ts
.type
== BT_CHARACTER
)
6821 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
6823 vector_ctor
= gfc_constructor_first (vector
->value
.constructor
);
6824 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
6826 = field
->expr_type
== EXPR_ARRAY
6827 ? gfc_constructor_first (field
->value
.constructor
)
6832 if (mask_ctor
->expr
->value
.logical
)
6834 gcc_assert (vector_ctor
);
6835 e
= gfc_copy_expr (vector_ctor
->expr
);
6836 vector_ctor
= gfc_constructor_next (vector_ctor
);
6838 else if (field
->expr_type
== EXPR_ARRAY
)
6839 e
= gfc_copy_expr (field_ctor
->expr
);
6841 e
= gfc_copy_expr (field
);
6843 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
6845 mask_ctor
= gfc_constructor_next (mask_ctor
);
6846 field_ctor
= gfc_constructor_next (field_ctor
);
6854 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
6858 size_t index
, len
, lenset
;
6860 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
6863 return &gfc_bad_expr
;
6865 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
6866 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
6869 if (b
!= NULL
&& b
->value
.logical
!= 0)
6874 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &s
->where
);
6876 len
= s
->value
.character
.length
;
6877 lenset
= set
->value
.character
.length
;
6881 mpz_set_ui (result
->value
.integer
, 0);
6889 mpz_set_ui (result
->value
.integer
, 1);
6893 index
= wide_strspn (s
->value
.character
.string
,
6894 set
->value
.character
.string
) + 1;
6903 mpz_set_ui (result
->value
.integer
, len
);
6906 for (index
= len
; index
> 0; index
--)
6908 for (i
= 0; i
< lenset
; i
++)
6910 if (s
->value
.character
.string
[index
- 1]
6911 == set
->value
.character
.string
[i
])
6919 mpz_set_ui (result
->value
.integer
, index
);
6925 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
6930 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6933 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
6938 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
6939 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
6940 return range_check (result
, "XOR");
6943 return gfc_get_logical_expr (kind
, &x
->where
,
6944 (x
->value
.logical
&& !y
->value
.logical
)
6945 || (!x
->value
.logical
&& y
->value
.logical
));
6953 /****************** Constant simplification *****************/
6955 /* Master function to convert one constant to another. While this is
6956 used as a simplification function, it requires the destination type
6957 and kind information which is supplied by a special case in
6961 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
6963 gfc_expr
*g
, *result
, *(*f
) (gfc_expr
*, int);
6978 f
= gfc_int2complex
;
6998 f
= gfc_real2complex
;
7009 f
= gfc_complex2int
;
7012 f
= gfc_complex2real
;
7015 f
= gfc_complex2complex
;
7041 f
= gfc_hollerith2int
;
7045 f
= gfc_hollerith2real
;
7049 f
= gfc_hollerith2complex
;
7053 f
= gfc_hollerith2character
;
7057 f
= gfc_hollerith2logical
;
7067 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
7072 switch (e
->expr_type
)
7075 result
= f (e
, kind
);
7077 return &gfc_bad_expr
;
7081 if (!gfc_is_constant_expr (e
))
7084 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
7085 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
7086 result
->rank
= e
->rank
;
7088 for (c
= gfc_constructor_first (e
->value
.constructor
);
7089 c
; c
= gfc_constructor_next (c
))
7092 if (c
->iterator
== NULL
)
7093 tmp
= f (c
->expr
, kind
);
7096 g
= gfc_convert_constant (c
->expr
, type
, kind
);
7097 if (g
== &gfc_bad_expr
)
7099 gfc_free_expr (result
);
7107 gfc_free_expr (result
);
7111 gfc_constructor_append_expr (&result
->value
.constructor
,
7125 /* Function for converting character constants. */
7127 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
7132 if (!gfc_is_constant_expr (e
))
7135 if (e
->expr_type
== EXPR_CONSTANT
)
7137 /* Simple case of a scalar. */
7138 result
= gfc_get_constant_expr (BT_CHARACTER
, kind
, &e
->where
);
7140 return &gfc_bad_expr
;
7142 result
->value
.character
.length
= e
->value
.character
.length
;
7143 result
->value
.character
.string
7144 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
7145 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
7146 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
7148 /* Check we only have values representable in the destination kind. */
7149 for (i
= 0; i
< result
->value
.character
.length
; i
++)
7150 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
7153 gfc_error ("Character %qs in string at %L cannot be converted "
7154 "into character kind %d",
7155 gfc_print_wide_char (result
->value
.character
.string
[i
]),
7157 return &gfc_bad_expr
;
7162 else if (e
->expr_type
== EXPR_ARRAY
)
7164 /* For an array constructor, we convert each constructor element. */
7167 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
7168 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
7169 result
->rank
= e
->rank
;
7170 result
->ts
.u
.cl
= e
->ts
.u
.cl
;
7172 for (c
= gfc_constructor_first (e
->value
.constructor
);
7173 c
; c
= gfc_constructor_next (c
))
7175 gfc_expr
*tmp
= gfc_convert_char_constant (c
->expr
, type
, kind
);
7176 if (tmp
== &gfc_bad_expr
)
7178 gfc_free_expr (result
);
7179 return &gfc_bad_expr
;
7184 gfc_free_expr (result
);
7188 gfc_constructor_append_expr (&result
->value
.constructor
,
7200 gfc_simplify_compiler_options (void)
7205 str
= gfc_get_option_string ();
7206 result
= gfc_get_character_expr (gfc_default_character_kind
,
7207 &gfc_current_locus
, str
, strlen (str
));
7214 gfc_simplify_compiler_version (void)
7219 len
= strlen ("GCC version ") + strlen (version_string
);
7220 buffer
= XALLOCAVEC (char, len
+ 1);
7221 snprintf (buffer
, len
+ 1, "GCC version %s", version_string
);
7222 return gfc_get_character_expr (gfc_default_character_kind
,
7223 &gfc_current_locus
, buffer
, len
);
7226 /* Simplification routines for intrinsics of IEEE modules. */
7229 simplify_ieee_selected_real_kind (gfc_expr
*expr
)
7231 gfc_actual_arglist
*arg
;
7232 gfc_expr
*p
= NULL
, *q
= NULL
, *rdx
= NULL
;
7234 arg
= expr
->value
.function
.actual
;
7238 q
= arg
->next
->expr
;
7239 if (arg
->next
->next
)
7240 rdx
= arg
->next
->next
->expr
;
7243 /* Currently, if IEEE is supported and this module is built, it means
7244 all our floating-point types conform to IEEE. Hence, we simply handle
7245 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
7246 return gfc_simplify_selected_real_kind (p
, q
, rdx
);
7250 simplify_ieee_support (gfc_expr
*expr
)
7252 /* We consider that if the IEEE modules are loaded, we have full support
7253 for flags, halting and rounding, which are the three functions
7254 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
7255 expressions. One day, we will need libgfortran to detect support and
7256 communicate it back to us, allowing for partial support. */
7258 return gfc_get_logical_expr (gfc_default_logical_kind
, &expr
->where
,
7263 matches_ieee_function_name (gfc_symbol
*sym
, const char *name
)
7265 int n
= strlen(name
);
7267 if (!strncmp(sym
->name
, name
, n
))
7270 /* If a generic was used and renamed, we need more work to find out.
7271 Compare the specific name. */
7272 if (sym
->generic
&& !strncmp(sym
->generic
->sym
->name
, name
, n
))
7279 gfc_simplify_ieee_functions (gfc_expr
*expr
)
7281 gfc_symbol
* sym
= expr
->symtree
->n
.sym
;
7283 if (matches_ieee_function_name(sym
, "ieee_selected_real_kind"))
7284 return simplify_ieee_selected_real_kind (expr
);
7285 else if (matches_ieee_function_name(sym
, "ieee_support_flag")
7286 || matches_ieee_function_name(sym
, "ieee_support_halting")
7287 || matches_ieee_function_name(sym
, "ieee_support_rounding"))
7288 return simplify_ieee_support (expr
);