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_d (x
, x
, 180.0, 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_fmod_d (tmp
, x
, 360.0, rnd_mode
);
1777 /* Set x = x * pi. */
1778 mpfr_const_pi (tmp
, rnd_mode
);
1779 mpfr_mul (x
, x
, tmp
, rnd_mode
);
1781 /* Set x = x / 180. */
1782 mpfr_div_d (x
, x
, 180.0, rnd_mode
);
1788 /* Convert argument to radians before calling a trig function. */
1791 gfc_simplify_trigd (gfc_expr
*icall
)
1795 arg
= icall
->value
.function
.actual
->expr
;
1797 if (arg
->ts
.type
!= BT_REAL
)
1798 gfc_internal_error ("in gfc_simplify_trigd(): Bad type");
1800 if (arg
->expr_type
== EXPR_CONSTANT
)
1801 /* Convert constant to radians before passing off to simplifier. */
1802 radians_f (arg
->value
.real
, GFC_RND_MODE
);
1804 /* Let the usual simplifier take over - we just simplified the arg. */
1805 return simplify_trig_call (icall
);
1808 /* Convert result of an inverse trig function to degrees. */
1811 gfc_simplify_atrigd (gfc_expr
*icall
)
1815 if (icall
->value
.function
.actual
->expr
->ts
.type
!= BT_REAL
)
1816 gfc_internal_error ("in gfc_simplify_atrigd(): Bad type");
1818 /* See if another simplifier has work to do first. */
1819 result
= simplify_trig_call (icall
);
1821 if (result
&& result
->expr_type
== EXPR_CONSTANT
)
1823 /* Convert constant to degrees after passing off to actual simplifier. */
1824 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1828 /* Let gfc_resolve_atrigd take care of the non-constant case. */
1832 /* Convert the result of atan2 to degrees. */
1835 gfc_simplify_atan2d (gfc_expr
*y
, gfc_expr
*x
)
1839 if (x
->ts
.type
!= BT_REAL
|| y
->ts
.type
!= BT_REAL
)
1840 gfc_internal_error ("in gfc_simplify_atan2d(): Bad type");
1842 if (x
->expr_type
== EXPR_CONSTANT
&& y
->expr_type
== EXPR_CONSTANT
)
1844 result
= gfc_simplify_atan2 (y
, x
);
1847 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1852 /* Let gfc_resolve_atan2d take care of the non-constant case. */
1857 gfc_simplify_cos (gfc_expr
*x
)
1861 if (x
->expr_type
!= EXPR_CONSTANT
)
1864 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1869 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1873 gfc_set_model_kind (x
->ts
.kind
);
1874 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1878 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1881 return range_check (result
, "COS");
1886 gfc_simplify_cosh (gfc_expr
*x
)
1890 if (x
->expr_type
!= EXPR_CONSTANT
)
1893 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1898 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1902 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1909 return range_check (result
, "COSH");
1914 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
1918 if (!is_constant_array_expr (mask
)
1919 || !gfc_is_constant_expr (dim
)
1920 || !gfc_is_constant_expr (kind
))
1923 result
= transformational_result (mask
, dim
,
1925 get_kind (BT_INTEGER
, kind
, "COUNT",
1926 gfc_default_integer_kind
),
1929 init_result_expr (result
, 0, NULL
);
1931 /* Passing MASK twice, once as data array, once as mask.
1932 Whenever gfc_count is called, '1' is added to the result. */
1933 return !dim
|| mask
->rank
== 1 ?
1934 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
1935 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
, NULL
);
1940 gfc_simplify_cshift (gfc_expr
*array
, gfc_expr
*shift
, gfc_expr
*dim
)
1942 gfc_expr
*a
, *result
;
1945 /* DIM is only useful for rank > 1, but deal with it here as one can
1946 set DIM = 1 for rank = 1. */
1949 if (!gfc_is_constant_expr (dim
))
1951 dm
= mpz_get_si (dim
->value
.integer
);
1956 /* Copy array into 'a', simplify it, and then test for a constant array. */
1957 a
= gfc_copy_expr (array
);
1958 gfc_simplify_expr (a
, 0);
1959 if (!is_constant_array_expr (a
))
1967 gfc_constructor
*ca
, *cr
;
1971 if (!gfc_is_constant_expr (shift
))
1977 shft
= mpz_get_si (shift
->value
.integer
);
1979 /* Case (i): If ARRAY has rank one, element i of the result is
1980 ARRAY (1 + MODULO (i + SHIFT - 1, SIZE (ARRAY))). */
1983 gfc_array_size (a
, &size
);
1984 sz
= mpz_get_si (size
);
1987 /* Adjust shft to deal with right or left shifts. */
1988 shft
= shft
< 0 ? 1 - shft
: shft
;
1990 /* Special case: Shift to the original order! */
1994 result
= gfc_copy_expr (a
);
1995 cr
= gfc_constructor_first (result
->value
.constructor
);
1996 for (i
= 0; i
< sz
; i
++, cr
= gfc_constructor_next (cr
))
1998 j
= (i
+ shft
) % sz
;
1999 ca
= gfc_constructor_first (a
->value
.constructor
);
2001 ca
= gfc_constructor_next (ca
);
2002 cr
->expr
= gfc_copy_expr (ca
->expr
);
2010 /* FIXME: Deal with rank > 1 arrays. For now, don't leak memory. */
2012 /* GCC bootstrap is too stupid to realize that the above code for dm
2013 is correct. First, dim can be specified for a rank 1 array. It is
2014 not needed in this nor used here. Second, the code is simply waiting
2015 for someone to implement rank > 1 simplification. For now, add a
2016 pessimization to the code that has a zero valid reason to be here. */
2017 if (dm
> array
->rank
)
2028 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
2030 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
2035 gfc_simplify_dble (gfc_expr
*e
)
2037 gfc_expr
*result
= NULL
;
2039 if (e
->expr_type
!= EXPR_CONSTANT
)
2042 if (convert_boz (e
, gfc_default_double_kind
) == &gfc_bad_expr
)
2043 return &gfc_bad_expr
;
2045 result
= gfc_convert_constant (e
, BT_REAL
, gfc_default_double_kind
);
2046 if (result
== &gfc_bad_expr
)
2047 return &gfc_bad_expr
;
2049 return range_check (result
, "DBLE");
2054 gfc_simplify_digits (gfc_expr
*x
)
2058 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2063 digits
= gfc_integer_kinds
[i
].digits
;
2068 digits
= gfc_real_kinds
[i
].digits
;
2075 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, digits
);
2080 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
2085 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2088 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
2089 result
= gfc_get_constant_expr (x
->ts
.type
, kind
, &x
->where
);
2094 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
2095 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2097 mpz_set_ui (result
->value
.integer
, 0);
2102 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
2103 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
2106 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2111 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2114 return range_check (result
, "DIM");
2119 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
2124 if (!is_constant_array_expr (vector_a
)
2125 || !is_constant_array_expr (vector_b
))
2128 gcc_assert (vector_a
->rank
== 1);
2129 gcc_assert (vector_b
->rank
== 1);
2131 temp
.expr_type
= EXPR_OP
;
2132 gfc_clear_ts (&temp
.ts
);
2133 temp
.value
.op
.op
= INTRINSIC_NONE
;
2134 temp
.value
.op
.op1
= vector_a
;
2135 temp
.value
.op
.op2
= vector_b
;
2136 gfc_type_convert_binary (&temp
, 1);
2138 return compute_dot_product (vector_a
, 1, 0, vector_b
, 1, 0, true);
2143 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
2145 gfc_expr
*a1
, *a2
, *result
;
2147 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2150 a1
= gfc_real2real (x
, gfc_default_double_kind
);
2151 a2
= gfc_real2real (y
, gfc_default_double_kind
);
2153 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &x
->where
);
2154 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
2159 return range_check (result
, "DPROD");
2164 simplify_dshift (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
,
2168 int i
, k
, size
, shift
;
2170 if (arg1
->expr_type
!= EXPR_CONSTANT
|| arg2
->expr_type
!= EXPR_CONSTANT
2171 || shiftarg
->expr_type
!= EXPR_CONSTANT
)
2174 k
= gfc_validate_kind (BT_INTEGER
, arg1
->ts
.kind
, false);
2175 size
= gfc_integer_kinds
[k
].bit_size
;
2177 gfc_extract_int (shiftarg
, &shift
);
2179 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2181 shift
= size
- shift
;
2183 result
= gfc_get_constant_expr (BT_INTEGER
, arg1
->ts
.kind
, &arg1
->where
);
2184 mpz_set_ui (result
->value
.integer
, 0);
2186 for (i
= 0; i
< shift
; i
++)
2187 if (mpz_tstbit (arg2
->value
.integer
, size
- shift
+ i
))
2188 mpz_setbit (result
->value
.integer
, i
);
2190 for (i
= 0; i
< size
- shift
; i
++)
2191 if (mpz_tstbit (arg1
->value
.integer
, i
))
2192 mpz_setbit (result
->value
.integer
, shift
+ i
);
2194 /* Convert to a signed value. */
2195 gfc_convert_mpz_to_signed (result
->value
.integer
, size
);
2202 gfc_simplify_dshiftr (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2204 return simplify_dshift (arg1
, arg2
, shiftarg
, true);
2209 gfc_simplify_dshiftl (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2211 return simplify_dshift (arg1
, arg2
, shiftarg
, false);
2216 gfc_simplify_erf (gfc_expr
*x
)
2220 if (x
->expr_type
!= EXPR_CONSTANT
)
2223 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2224 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2226 return range_check (result
, "ERF");
2231 gfc_simplify_erfc (gfc_expr
*x
)
2235 if (x
->expr_type
!= EXPR_CONSTANT
)
2238 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2239 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2241 return range_check (result
, "ERFC");
2245 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2247 #define MAX_ITER 200
2248 #define ARG_LIMIT 12
2250 /* Calculate ERFC_SCALED directly by its definition:
2252 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2254 using a large precision for intermediate results. This is used for all
2255 but large values of the argument. */
2257 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2262 prec
= mpfr_get_default_prec ();
2263 mpfr_set_default_prec (10 * prec
);
2268 mpfr_set (a
, arg
, GFC_RND_MODE
);
2269 mpfr_sqr (b
, a
, GFC_RND_MODE
);
2270 mpfr_exp (b
, b
, GFC_RND_MODE
);
2271 mpfr_erfc (a
, a
, GFC_RND_MODE
);
2272 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
2274 mpfr_set (res
, a
, GFC_RND_MODE
);
2275 mpfr_set_default_prec (prec
);
2281 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2283 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2284 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2287 This is used for large values of the argument. Intermediate calculations
2288 are performed with twice the precision. We don't do a fixed number of
2289 iterations of the sum, but stop when it has converged to the required
2292 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2294 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
2299 prec
= mpfr_get_default_prec ();
2300 mpfr_set_default_prec (2 * prec
);
2310 mpfr_init (sumtrunc
);
2311 mpfr_set_prec (oldsum
, prec
);
2312 mpfr_set_prec (sumtrunc
, prec
);
2314 mpfr_set (x
, arg
, GFC_RND_MODE
);
2315 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
2316 mpz_set_ui (num
, 1);
2318 mpfr_set (u
, x
, GFC_RND_MODE
);
2319 mpfr_sqr (u
, u
, GFC_RND_MODE
);
2320 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
2321 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
2323 for (i
= 1; i
< MAX_ITER
; i
++)
2325 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
2327 mpz_mul_ui (num
, num
, 2 * i
- 1);
2330 mpfr_set (w
, u
, GFC_RND_MODE
);
2331 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
2333 mpfr_set_z (v
, num
, GFC_RND_MODE
);
2334 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
2336 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
2338 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
2339 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
2343 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2345 gcc_assert (i
< MAX_ITER
);
2347 /* Divide by x * sqrt(Pi). */
2348 mpfr_const_pi (u
, GFC_RND_MODE
);
2349 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
2350 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
2351 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
2353 mpfr_set (res
, sum
, GFC_RND_MODE
);
2354 mpfr_set_default_prec (prec
);
2356 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
2362 gfc_simplify_erfc_scaled (gfc_expr
*x
)
2366 if (x
->expr_type
!= EXPR_CONSTANT
)
2369 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2370 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
2371 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
2373 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
2375 return range_check (result
, "ERFC_SCALED");
2383 gfc_simplify_epsilon (gfc_expr
*e
)
2388 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2390 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
2391 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
2393 return range_check (result
, "EPSILON");
2398 gfc_simplify_exp (gfc_expr
*x
)
2402 if (x
->expr_type
!= EXPR_CONSTANT
)
2405 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2410 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2414 gfc_set_model_kind (x
->ts
.kind
);
2415 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
2419 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2422 return range_check (result
, "EXP");
2427 gfc_simplify_exponent (gfc_expr
*x
)
2432 if (x
->expr_type
!= EXPR_CONSTANT
)
2435 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2438 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2439 if (mpfr_inf_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
2441 int i
= gfc_validate_kind (BT_INTEGER
, gfc_default_integer_kind
, false);
2442 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2446 /* EXPONENT(+/- 0.0) = 0 */
2447 if (mpfr_zero_p (x
->value
.real
))
2449 mpz_set_ui (result
->value
.integer
, 0);
2453 gfc_set_model (x
->value
.real
);
2455 val
= (long int) mpfr_get_exp (x
->value
.real
);
2456 mpz_set_si (result
->value
.integer
, val
);
2458 return range_check (result
, "EXPONENT");
2463 gfc_simplify_float (gfc_expr
*a
)
2467 if (a
->expr_type
!= EXPR_CONSTANT
)
2472 if (convert_boz (a
, gfc_default_real_kind
) == &gfc_bad_expr
)
2473 return &gfc_bad_expr
;
2475 result
= gfc_copy_expr (a
);
2478 result
= gfc_int2real (a
, gfc_default_real_kind
);
2480 return range_check (result
, "FLOAT");
2485 is_last_ref_vtab (gfc_expr
*e
)
2488 gfc_component
*comp
= NULL
;
2490 if (e
->expr_type
!= EXPR_VARIABLE
)
2493 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
2494 if (ref
->type
== REF_COMPONENT
)
2495 comp
= ref
->u
.c
.component
;
2497 if (!e
->ref
|| !comp
)
2498 return e
->symtree
->n
.sym
->attr
.vtab
;
2500 if (comp
->name
[0] == '_' && strcmp (comp
->name
, "_vptr") == 0)
2508 gfc_simplify_extends_type_of (gfc_expr
*a
, gfc_expr
*mold
)
2510 /* Avoid simplification of resolved symbols. */
2511 if (is_last_ref_vtab (a
) || is_last_ref_vtab (mold
))
2514 if (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_DERIVED
)
2515 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2516 gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2519 if (UNLIMITED_POLY (a
) || UNLIMITED_POLY (mold
))
2522 /* Return .false. if the dynamic type can never be the same. */
2523 if ((a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_CLASS
2524 && !gfc_type_is_extension_of
2525 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2526 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2527 && !gfc_type_is_extension_of
2528 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2529 mold
->ts
.u
.derived
->components
->ts
.u
.derived
))
2530 || (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_CLASS
2531 && !gfc_type_is_extension_of
2533 mold
->ts
.u
.derived
->components
->ts
.u
.derived
)
2534 && !gfc_type_is_extension_of
2535 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2537 || (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2538 && !gfc_type_is_extension_of
2539 (mold
->ts
.u
.derived
,
2540 a
->ts
.u
.derived
->components
->ts
.u
.derived
)))
2541 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2543 if (mold
->ts
.type
== BT_DERIVED
2544 && gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2545 a
->ts
.u
.derived
->components
->ts
.u
.derived
))
2546 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, true);
2553 gfc_simplify_same_type_as (gfc_expr
*a
, gfc_expr
*b
)
2555 /* Avoid simplification of resolved symbols. */
2556 if (is_last_ref_vtab (a
) || is_last_ref_vtab (b
))
2559 /* Return .false. if the dynamic type can never be the
2561 if (((a
->ts
.type
== BT_CLASS
&& gfc_expr_attr (a
).class_ok
)
2562 || (b
->ts
.type
== BT_CLASS
&& gfc_expr_attr (b
).class_ok
))
2563 && !gfc_type_compatible (&a
->ts
, &b
->ts
)
2564 && !gfc_type_compatible (&b
->ts
, &a
->ts
))
2565 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2567 if (a
->ts
.type
!= BT_DERIVED
|| b
->ts
.type
!= BT_DERIVED
)
2570 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2571 gfc_compare_derived_types (a
->ts
.u
.derived
,
2577 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
2583 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
2585 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2587 if (e
->expr_type
!= EXPR_CONSTANT
)
2590 mpfr_init2 (floor
, mpfr_get_prec (e
->value
.real
));
2591 mpfr_floor (floor
, e
->value
.real
);
2593 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
2594 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
2598 return range_check (result
, "FLOOR");
2603 gfc_simplify_fraction (gfc_expr
*x
)
2607 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2608 mpfr_t absv
, exp
, pow2
;
2613 if (x
->expr_type
!= EXPR_CONSTANT
)
2616 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
2618 /* FRACTION(inf) = NaN. */
2619 if (mpfr_inf_p (x
->value
.real
))
2621 mpfr_set_nan (result
->value
.real
);
2625 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2627 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
2628 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
2630 if (mpfr_sgn (x
->value
.real
) == 0)
2632 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2636 gfc_set_model_kind (x
->ts
.kind
);
2641 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
2642 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
2644 mpfr_trunc (exp
, exp
);
2645 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
2647 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
2649 mpfr_div (result
->value
.real
, x
->value
.real
, pow2
, GFC_RND_MODE
);
2651 mpfr_clears (exp
, absv
, pow2
, NULL
);
2655 /* mpfr_frexp() correctly handles zeros and NaNs. */
2656 mpfr_frexp (&e
, result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2660 return range_check (result
, "FRACTION");
2665 gfc_simplify_gamma (gfc_expr
*x
)
2669 if (x
->expr_type
!= EXPR_CONSTANT
)
2672 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2673 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2675 return range_check (result
, "GAMMA");
2680 gfc_simplify_huge (gfc_expr
*e
)
2685 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2686 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2691 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2695 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
2707 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
2711 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2714 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2715 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
2716 return range_check (result
, "HYPOT");
2720 /* We use the processor's collating sequence, because all
2721 systems that gfortran currently works on are ASCII. */
2724 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
2730 if (e
->expr_type
!= EXPR_CONSTANT
)
2733 if (e
->value
.character
.length
!= 1)
2735 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
2736 return &gfc_bad_expr
;
2739 index
= e
->value
.character
.string
[0];
2741 if (warn_surprising
&& index
> 127)
2742 gfc_warning (OPT_Wsurprising
,
2743 "Argument of IACHAR function at %L outside of range 0..127",
2746 k
= get_kind (BT_INTEGER
, kind
, "IACHAR", gfc_default_integer_kind
);
2748 return &gfc_bad_expr
;
2750 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2752 return range_check (result
, "IACHAR");
2757 do_bit_and (gfc_expr
*result
, gfc_expr
*e
)
2759 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2760 gcc_assert (result
->ts
.type
== BT_INTEGER
2761 && result
->expr_type
== EXPR_CONSTANT
);
2763 mpz_and (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2769 gfc_simplify_iall (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2771 return simplify_transformation (array
, dim
, mask
, -1, do_bit_and
);
2776 do_bit_ior (gfc_expr
*result
, gfc_expr
*e
)
2778 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2779 gcc_assert (result
->ts
.type
== BT_INTEGER
2780 && result
->expr_type
== EXPR_CONSTANT
);
2782 mpz_ior (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2788 gfc_simplify_iany (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2790 return simplify_transformation (array
, dim
, mask
, 0, do_bit_ior
);
2795 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
2799 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2802 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2803 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2805 return range_check (result
, "IAND");
2810 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
2815 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2818 gfc_extract_int (y
, &pos
);
2820 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2822 result
= gfc_copy_expr (x
);
2824 convert_mpz_to_unsigned (result
->value
.integer
,
2825 gfc_integer_kinds
[k
].bit_size
);
2827 mpz_clrbit (result
->value
.integer
, pos
);
2829 gfc_convert_mpz_to_signed (result
->value
.integer
,
2830 gfc_integer_kinds
[k
].bit_size
);
2837 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
2844 if (x
->expr_type
!= EXPR_CONSTANT
2845 || y
->expr_type
!= EXPR_CONSTANT
2846 || z
->expr_type
!= EXPR_CONSTANT
)
2849 gfc_extract_int (y
, &pos
);
2850 gfc_extract_int (z
, &len
);
2852 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
2854 bitsize
= gfc_integer_kinds
[k
].bit_size
;
2856 if (pos
+ len
> bitsize
)
2858 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2859 "bit size at %L", &y
->where
);
2860 return &gfc_bad_expr
;
2863 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2864 convert_mpz_to_unsigned (result
->value
.integer
,
2865 gfc_integer_kinds
[k
].bit_size
);
2867 bits
= XCNEWVEC (int, bitsize
);
2869 for (i
= 0; i
< bitsize
; i
++)
2872 for (i
= 0; i
< len
; i
++)
2873 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
2875 for (i
= 0; i
< bitsize
; i
++)
2878 mpz_clrbit (result
->value
.integer
, i
);
2879 else if (bits
[i
] == 1)
2880 mpz_setbit (result
->value
.integer
, i
);
2882 gfc_internal_error ("IBITS: Bad bit");
2887 gfc_convert_mpz_to_signed (result
->value
.integer
,
2888 gfc_integer_kinds
[k
].bit_size
);
2895 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
2900 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2903 gfc_extract_int (y
, &pos
);
2905 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2907 result
= gfc_copy_expr (x
);
2909 convert_mpz_to_unsigned (result
->value
.integer
,
2910 gfc_integer_kinds
[k
].bit_size
);
2912 mpz_setbit (result
->value
.integer
, pos
);
2914 gfc_convert_mpz_to_signed (result
->value
.integer
,
2915 gfc_integer_kinds
[k
].bit_size
);
2922 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
2928 if (e
->expr_type
!= EXPR_CONSTANT
)
2931 if (e
->value
.character
.length
!= 1)
2933 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
2934 return &gfc_bad_expr
;
2937 index
= e
->value
.character
.string
[0];
2939 k
= get_kind (BT_INTEGER
, kind
, "ICHAR", gfc_default_integer_kind
);
2941 return &gfc_bad_expr
;
2943 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2945 return range_check (result
, "ICHAR");
2950 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
2954 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2957 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2958 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2960 return range_check (result
, "IEOR");
2965 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
2968 int back
, len
, lensub
;
2969 int i
, j
, k
, count
, index
= 0, start
;
2971 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
2972 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
2975 if (b
!= NULL
&& b
->value
.logical
!= 0)
2980 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
2982 return &gfc_bad_expr
;
2984 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
2986 len
= x
->value
.character
.length
;
2987 lensub
= y
->value
.character
.length
;
2991 mpz_set_si (result
->value
.integer
, 0);
2999 mpz_set_si (result
->value
.integer
, 1);
3002 else if (lensub
== 1)
3004 for (i
= 0; i
< len
; i
++)
3006 for (j
= 0; j
< lensub
; j
++)
3008 if (y
->value
.character
.string
[j
]
3009 == x
->value
.character
.string
[i
])
3019 for (i
= 0; i
< len
; i
++)
3021 for (j
= 0; j
< lensub
; j
++)
3023 if (y
->value
.character
.string
[j
]
3024 == x
->value
.character
.string
[i
])
3029 for (k
= 0; k
< lensub
; k
++)
3031 if (y
->value
.character
.string
[k
]
3032 == x
->value
.character
.string
[k
+ start
])
3036 if (count
== lensub
)
3051 mpz_set_si (result
->value
.integer
, len
+ 1);
3054 else if (lensub
== 1)
3056 for (i
= 0; i
< len
; i
++)
3058 for (j
= 0; j
< lensub
; j
++)
3060 if (y
->value
.character
.string
[j
]
3061 == x
->value
.character
.string
[len
- i
])
3063 index
= len
- i
+ 1;
3071 for (i
= 0; i
< len
; i
++)
3073 for (j
= 0; j
< lensub
; j
++)
3075 if (y
->value
.character
.string
[j
]
3076 == x
->value
.character
.string
[len
- i
])
3079 if (start
<= len
- lensub
)
3082 for (k
= 0; k
< lensub
; k
++)
3083 if (y
->value
.character
.string
[k
]
3084 == x
->value
.character
.string
[k
+ start
])
3087 if (count
== lensub
)
3104 mpz_set_si (result
->value
.integer
, index
);
3105 return range_check (result
, "INDEX");
3110 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
3112 gfc_expr
*result
= NULL
;
3114 if (e
->expr_type
!= EXPR_CONSTANT
)
3117 result
= gfc_convert_constant (e
, BT_INTEGER
, kind
);
3118 if (result
== &gfc_bad_expr
)
3119 return &gfc_bad_expr
;
3121 return range_check (result
, name
);
3126 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
3130 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
3132 return &gfc_bad_expr
;
3134 return simplify_intconv (e
, kind
, "INT");
3138 gfc_simplify_int2 (gfc_expr
*e
)
3140 return simplify_intconv (e
, 2, "INT2");
3145 gfc_simplify_int8 (gfc_expr
*e
)
3147 return simplify_intconv (e
, 8, "INT8");
3152 gfc_simplify_long (gfc_expr
*e
)
3154 return simplify_intconv (e
, 4, "LONG");
3159 gfc_simplify_ifix (gfc_expr
*e
)
3161 gfc_expr
*rtrunc
, *result
;
3163 if (e
->expr_type
!= EXPR_CONSTANT
)
3166 rtrunc
= gfc_copy_expr (e
);
3167 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3169 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3171 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3173 gfc_free_expr (rtrunc
);
3175 return range_check (result
, "IFIX");
3180 gfc_simplify_idint (gfc_expr
*e
)
3182 gfc_expr
*rtrunc
, *result
;
3184 if (e
->expr_type
!= EXPR_CONSTANT
)
3187 rtrunc
= gfc_copy_expr (e
);
3188 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3190 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3192 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3194 gfc_free_expr (rtrunc
);
3196 return range_check (result
, "IDINT");
3201 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
3205 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3208 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3209 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3211 return range_check (result
, "IOR");
3216 do_bit_xor (gfc_expr
*result
, gfc_expr
*e
)
3218 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3219 gcc_assert (result
->ts
.type
== BT_INTEGER
3220 && result
->expr_type
== EXPR_CONSTANT
);
3222 mpz_xor (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3228 gfc_simplify_iparity (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3230 return simplify_transformation (array
, dim
, mask
, 0, do_bit_xor
);
3235 gfc_simplify_is_iostat_end (gfc_expr
*x
)
3237 if (x
->expr_type
!= EXPR_CONSTANT
)
3240 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3241 mpz_cmp_si (x
->value
.integer
,
3242 LIBERROR_END
) == 0);
3247 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
3249 if (x
->expr_type
!= EXPR_CONSTANT
)
3252 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3253 mpz_cmp_si (x
->value
.integer
,
3254 LIBERROR_EOR
) == 0);
3259 gfc_simplify_isnan (gfc_expr
*x
)
3261 if (x
->expr_type
!= EXPR_CONSTANT
)
3264 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3265 mpfr_nan_p (x
->value
.real
));
3269 /* Performs a shift on its first argument. Depending on the last
3270 argument, the shift can be arithmetic, i.e. with filling from the
3271 left like in the SHIFTA intrinsic. */
3273 simplify_shift (gfc_expr
*e
, gfc_expr
*s
, const char *name
,
3274 bool arithmetic
, int direction
)
3277 int ashift
, *bits
, i
, k
, bitsize
, shift
;
3279 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3282 gfc_extract_int (s
, &shift
);
3284 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
3285 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3287 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3291 mpz_set (result
->value
.integer
, e
->value
.integer
);
3295 if (direction
> 0 && shift
< 0)
3297 /* Left shift, as in SHIFTL. */
3298 gfc_error ("Second argument of %s is negative at %L", name
, &e
->where
);
3299 return &gfc_bad_expr
;
3301 else if (direction
< 0)
3303 /* Right shift, as in SHIFTR or SHIFTA. */
3306 gfc_error ("Second argument of %s is negative at %L",
3308 return &gfc_bad_expr
;
3314 ashift
= (shift
>= 0 ? shift
: -shift
);
3316 if (ashift
> bitsize
)
3318 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3319 "at %L", name
, &e
->where
);
3320 return &gfc_bad_expr
;
3323 bits
= XCNEWVEC (int, bitsize
);
3325 for (i
= 0; i
< bitsize
; i
++)
3326 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3331 for (i
= 0; i
< shift
; i
++)
3332 mpz_clrbit (result
->value
.integer
, i
);
3334 for (i
= 0; i
< bitsize
- shift
; i
++)
3337 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3339 mpz_setbit (result
->value
.integer
, i
+ shift
);
3345 if (arithmetic
&& bits
[bitsize
- 1])
3346 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3347 mpz_setbit (result
->value
.integer
, i
);
3349 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3350 mpz_clrbit (result
->value
.integer
, i
);
3352 for (i
= bitsize
- 1; i
>= ashift
; i
--)
3355 mpz_clrbit (result
->value
.integer
, i
- ashift
);
3357 mpz_setbit (result
->value
.integer
, i
- ashift
);
3361 gfc_convert_mpz_to_signed (result
->value
.integer
, bitsize
);
3369 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
3371 return simplify_shift (e
, s
, "ISHFT", false, 0);
3376 gfc_simplify_lshift (gfc_expr
*e
, gfc_expr
*s
)
3378 return simplify_shift (e
, s
, "LSHIFT", false, 1);
3383 gfc_simplify_rshift (gfc_expr
*e
, gfc_expr
*s
)
3385 return simplify_shift (e
, s
, "RSHIFT", true, -1);
3390 gfc_simplify_shifta (gfc_expr
*e
, gfc_expr
*s
)
3392 return simplify_shift (e
, s
, "SHIFTA", true, -1);
3397 gfc_simplify_shiftl (gfc_expr
*e
, gfc_expr
*s
)
3399 return simplify_shift (e
, s
, "SHIFTL", false, 1);
3404 gfc_simplify_shiftr (gfc_expr
*e
, gfc_expr
*s
)
3406 return simplify_shift (e
, s
, "SHIFTR", false, -1);
3411 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
3414 int shift
, ashift
, isize
, ssize
, delta
, k
;
3417 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3420 gfc_extract_int (s
, &shift
);
3422 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3423 isize
= gfc_integer_kinds
[k
].bit_size
;
3427 if (sz
->expr_type
!= EXPR_CONSTANT
)
3430 gfc_extract_int (sz
, &ssize
);
3443 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3444 "BIT_SIZE of first argument at %C");
3446 gfc_error ("Absolute value of SHIFT shall be less than or equal "
3448 return &gfc_bad_expr
;
3451 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3453 mpz_set (result
->value
.integer
, e
->value
.integer
);
3458 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
3460 bits
= XCNEWVEC (int, ssize
);
3462 for (i
= 0; i
< ssize
; i
++)
3463 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3465 delta
= ssize
- ashift
;
3469 for (i
= 0; i
< delta
; i
++)
3472 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3474 mpz_setbit (result
->value
.integer
, i
+ shift
);
3477 for (i
= delta
; i
< ssize
; i
++)
3480 mpz_clrbit (result
->value
.integer
, i
- delta
);
3482 mpz_setbit (result
->value
.integer
, i
- delta
);
3487 for (i
= 0; i
< ashift
; i
++)
3490 mpz_clrbit (result
->value
.integer
, i
+ delta
);
3492 mpz_setbit (result
->value
.integer
, i
+ delta
);
3495 for (i
= ashift
; i
< ssize
; i
++)
3498 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3500 mpz_setbit (result
->value
.integer
, i
+ shift
);
3504 gfc_convert_mpz_to_signed (result
->value
.integer
, isize
);
3512 gfc_simplify_kind (gfc_expr
*e
)
3514 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, e
->ts
.kind
);
3519 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
3520 gfc_array_spec
*as
, gfc_ref
*ref
, bool coarray
)
3522 gfc_expr
*l
, *u
, *result
;
3525 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3526 gfc_default_integer_kind
);
3528 return &gfc_bad_expr
;
3530 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3532 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3533 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3534 if (!coarray
&& array
->expr_type
!= EXPR_VARIABLE
)
3538 gfc_expr
* dim
= result
;
3539 mpz_set_si (dim
->value
.integer
, d
);
3541 result
= simplify_size (array
, dim
, k
);
3542 gfc_free_expr (dim
);
3547 mpz_set_si (result
->value
.integer
, 1);
3552 /* Otherwise, we have a variable expression. */
3553 gcc_assert (array
->expr_type
== EXPR_VARIABLE
);
3556 if (!gfc_resolve_array_spec (as
, 0))
3559 /* The last dimension of an assumed-size array is special. */
3560 if ((!coarray
&& d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
3561 || (coarray
&& d
== as
->rank
+ as
->corank
3562 && (!upper
|| flag_coarray
== GFC_FCOARRAY_SINGLE
)))
3564 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
3566 gfc_free_expr (result
);
3567 return gfc_copy_expr (as
->lower
[d
-1]);
3573 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3575 /* Then, we need to know the extent of the given dimension. */
3576 if (coarray
|| (ref
->u
.ar
.type
== AR_FULL
&& !ref
->next
))
3578 gfc_expr
*declared_bound
;
3580 bool constant_lbound
, constant_ubound
;
3585 gcc_assert (l
!= NULL
);
3587 constant_lbound
= l
->expr_type
== EXPR_CONSTANT
;
3588 constant_ubound
= u
&& u
->expr_type
== EXPR_CONSTANT
;
3590 empty_bound
= upper
? 0 : 1;
3591 declared_bound
= upper
? u
: l
;
3593 if ((!upper
&& !constant_lbound
)
3594 || (upper
&& !constant_ubound
))
3599 /* For {L,U}BOUND, the value depends on whether the array
3600 is empty. We can nevertheless simplify if the declared bound
3601 has the same value as that of an empty array, in which case
3602 the result isn't dependent on the array emptyness. */
3603 if (mpz_cmp_si (declared_bound
->value
.integer
, empty_bound
) == 0)
3604 mpz_set_si (result
->value
.integer
, empty_bound
);
3605 else if (!constant_lbound
|| !constant_ubound
)
3606 /* Array emptyness can't be determined, we can't simplify. */
3608 else if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
3609 mpz_set_si (result
->value
.integer
, empty_bound
);
3611 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
3614 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
3620 if (!gfc_ref_dimen_size (&ref
->u
.ar
, d
- 1, &result
->value
.integer
, NULL
))
3624 mpz_set_si (result
->value
.integer
, (long int) 1);
3628 return range_check (result
, upper
? "UBOUND" : "LBOUND");
3631 gfc_free_expr (result
);
3637 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3643 if (array
->ts
.type
== BT_CLASS
)
3646 if (array
->expr_type
!= EXPR_VARIABLE
)
3653 /* Follow any component references. */
3654 as
= array
->symtree
->n
.sym
->as
;
3655 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3660 switch (ref
->u
.ar
.type
)
3667 /* We're done because 'as' has already been set in the
3668 previous iteration. */
3682 as
= ref
->u
.c
.component
->as
;
3694 if (as
&& (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_RANK
3695 || (as
->type
== AS_ASSUMED_SHAPE
&& upper
)))
3699 || (as
->type
!= AS_DEFERRED
3700 && array
->expr_type
== EXPR_VARIABLE
3701 && !gfc_expr_attr (array
).allocatable
3702 && !gfc_expr_attr (array
).pointer
));
3706 /* Multi-dimensional bounds. */
3707 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3711 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3712 if (upper
&& as
&& as
->type
== AS_ASSUMED_SIZE
)
3714 /* An error message will be emitted in
3715 check_assumed_size_reference (resolve.c). */
3716 return &gfc_bad_expr
;
3719 /* Simplify the bounds for each dimension. */
3720 for (d
= 0; d
< array
->rank
; d
++)
3722 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
, ref
,
3724 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3728 for (j
= 0; j
< d
; j
++)
3729 gfc_free_expr (bounds
[j
]);
3734 /* Allocate the result expression. */
3735 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3736 gfc_default_integer_kind
);
3738 return &gfc_bad_expr
;
3740 e
= gfc_get_array_expr (BT_INTEGER
, k
, &array
->where
);
3742 /* The result is a rank 1 array; its size is the rank of the first
3743 argument to {L,U}BOUND. */
3745 e
->shape
= gfc_get_shape (1);
3746 mpz_init_set_ui (e
->shape
[0], array
->rank
);
3748 /* Create the constructor for this array. */
3749 for (d
= 0; d
< array
->rank
; d
++)
3750 gfc_constructor_append_expr (&e
->value
.constructor
,
3751 bounds
[d
], &e
->where
);
3757 /* A DIM argument is specified. */
3758 if (dim
->expr_type
!= EXPR_CONSTANT
)
3761 d
= mpz_get_si (dim
->value
.integer
);
3763 if ((d
< 1 || d
> array
->rank
)
3764 || (d
== array
->rank
&& as
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
3766 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3767 return &gfc_bad_expr
;
3770 if (as
&& as
->type
== AS_ASSUMED_RANK
)
3773 return simplify_bound_dim (array
, kind
, d
, upper
, as
, ref
, false);
3779 simplify_cobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3785 if (array
->expr_type
!= EXPR_VARIABLE
)
3788 /* Follow any component references. */
3789 as
= (array
->ts
.type
== BT_CLASS
&& array
->ts
.u
.derived
->components
)
3790 ? array
->ts
.u
.derived
->components
->as
3791 : array
->symtree
->n
.sym
->as
;
3792 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3797 switch (ref
->u
.ar
.type
)
3800 if (ref
->u
.ar
.as
->corank
> 0)
3802 gcc_assert (as
== ref
->u
.ar
.as
);
3809 /* We're done because 'as' has already been set in the
3810 previous iteration. */
3824 as
= ref
->u
.c
.component
->as
;
3837 if (as
->cotype
== AS_DEFERRED
|| as
->cotype
== AS_ASSUMED_SHAPE
)
3842 /* Multi-dimensional cobounds. */
3843 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3847 /* Simplify the cobounds for each dimension. */
3848 for (d
= 0; d
< as
->corank
; d
++)
3850 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1 + as
->rank
,
3851 upper
, as
, ref
, true);
3852 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3856 for (j
= 0; j
< d
; j
++)
3857 gfc_free_expr (bounds
[j
]);
3862 /* Allocate the result expression. */
3863 e
= gfc_get_expr ();
3864 e
->where
= array
->where
;
3865 e
->expr_type
= EXPR_ARRAY
;
3866 e
->ts
.type
= BT_INTEGER
;
3867 k
= get_kind (BT_INTEGER
, kind
, upper
? "UCOBOUND" : "LCOBOUND",
3868 gfc_default_integer_kind
);
3872 return &gfc_bad_expr
;
3876 /* The result is a rank 1 array; its size is the rank of the first
3877 argument to {L,U}COBOUND. */
3879 e
->shape
= gfc_get_shape (1);
3880 mpz_init_set_ui (e
->shape
[0], as
->corank
);
3882 /* Create the constructor for this array. */
3883 for (d
= 0; d
< as
->corank
; d
++)
3884 gfc_constructor_append_expr (&e
->value
.constructor
,
3885 bounds
[d
], &e
->where
);
3890 /* A DIM argument is specified. */
3891 if (dim
->expr_type
!= EXPR_CONSTANT
)
3894 d
= mpz_get_si (dim
->value
.integer
);
3896 if (d
< 1 || d
> as
->corank
)
3898 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3899 return &gfc_bad_expr
;
3902 return simplify_bound_dim (array
, kind
, d
+as
->rank
, upper
, as
, ref
, true);
3908 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3910 return simplify_bound (array
, dim
, kind
, 0);
3915 gfc_simplify_lcobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3917 return simplify_cobound (array
, dim
, kind
, 0);
3921 gfc_simplify_leadz (gfc_expr
*e
)
3923 unsigned long lz
, bs
;
3926 if (e
->expr_type
!= EXPR_CONSTANT
)
3929 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3930 bs
= gfc_integer_kinds
[i
].bit_size
;
3931 if (mpz_cmp_si (e
->value
.integer
, 0) == 0)
3933 else if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
3936 lz
= bs
- mpz_sizeinbase (e
->value
.integer
, 2);
3938 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, lz
);
3943 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
3946 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
3949 return &gfc_bad_expr
;
3951 if (e
->expr_type
== EXPR_CONSTANT
)
3953 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
3954 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
3955 return range_check (result
, "LEN");
3957 else if (e
->ts
.u
.cl
!= NULL
&& e
->ts
.u
.cl
->length
!= NULL
3958 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
3959 && e
->ts
.u
.cl
->length
->ts
.type
== BT_INTEGER
)
3961 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
3962 mpz_set (result
->value
.integer
, e
->ts
.u
.cl
->length
->value
.integer
);
3963 return range_check (result
, "LEN");
3965 else if (e
->expr_type
== EXPR_VARIABLE
&& e
->ts
.type
== BT_CHARACTER
3966 && e
->symtree
->n
.sym
3967 && e
->symtree
->n
.sym
->ts
.type
!= BT_DERIVED
3968 && e
->symtree
->n
.sym
->assoc
&& e
->symtree
->n
.sym
->assoc
->target
3969 && e
->symtree
->n
.sym
->assoc
->target
->ts
.type
== BT_DERIVED
3970 && e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
3971 && UNLIMITED_POLY (e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
))
3973 /* The expression in assoc->target points to a ref to the _data component
3974 of the unlimited polymorphic entity. To get the _len component the last
3975 _data ref needs to be stripped and a ref to the _len component added. */
3976 return gfc_get_len_component (e
->symtree
->n
.sym
->assoc
->target
);
3983 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
3987 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
3990 return &gfc_bad_expr
;
3992 if (e
->expr_type
!= EXPR_CONSTANT
)
3995 len
= e
->value
.character
.length
;
3996 for (count
= 0, i
= 1; i
<= len
; i
++)
3997 if (e
->value
.character
.string
[len
- i
] == ' ')
4002 result
= gfc_get_int_expr (k
, &e
->where
, len
- count
);
4003 return range_check (result
, "LEN_TRIM");
4007 gfc_simplify_lgamma (gfc_expr
*x
)
4012 if (x
->expr_type
!= EXPR_CONSTANT
)
4015 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4016 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
4018 return range_check (result
, "LGAMMA");
4023 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
4025 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4028 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4029 gfc_compare_string (a
, b
) >= 0);
4034 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
4036 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4039 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4040 gfc_compare_string (a
, b
) > 0);
4045 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
4047 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4050 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4051 gfc_compare_string (a
, b
) <= 0);
4056 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
4058 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4061 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4062 gfc_compare_string (a
, b
) < 0);
4067 gfc_simplify_log (gfc_expr
*x
)
4071 if (x
->expr_type
!= EXPR_CONSTANT
)
4074 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4079 if (mpfr_sgn (x
->value
.real
) <= 0)
4081 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4082 "to zero", &x
->where
);
4083 gfc_free_expr (result
);
4084 return &gfc_bad_expr
;
4087 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4091 if (mpfr_zero_p (mpc_realref (x
->value
.complex))
4092 && mpfr_zero_p (mpc_imagref (x
->value
.complex)))
4094 gfc_error ("Complex argument of LOG at %L cannot be zero",
4096 gfc_free_expr (result
);
4097 return &gfc_bad_expr
;
4100 gfc_set_model_kind (x
->ts
.kind
);
4101 mpc_log (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
4105 gfc_internal_error ("gfc_simplify_log: bad type");
4108 return range_check (result
, "LOG");
4113 gfc_simplify_log10 (gfc_expr
*x
)
4117 if (x
->expr_type
!= EXPR_CONSTANT
)
4120 if (mpfr_sgn (x
->value
.real
) <= 0)
4122 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4123 "to zero", &x
->where
);
4124 return &gfc_bad_expr
;
4127 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4128 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4130 return range_check (result
, "LOG10");
4135 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
4139 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
4141 return &gfc_bad_expr
;
4143 if (e
->expr_type
!= EXPR_CONSTANT
)
4146 return gfc_get_logical_expr (kind
, &e
->where
, e
->value
.logical
);
4151 gfc_simplify_matmul (gfc_expr
*matrix_a
, gfc_expr
*matrix_b
)
4154 int row
, result_rows
, col
, result_columns
;
4155 int stride_a
, offset_a
, stride_b
, offset_b
;
4157 if (!is_constant_array_expr (matrix_a
)
4158 || !is_constant_array_expr (matrix_b
))
4161 gcc_assert (gfc_compare_types (&matrix_a
->ts
, &matrix_b
->ts
));
4162 result
= gfc_get_array_expr (matrix_a
->ts
.type
,
4166 if (matrix_a
->rank
== 1 && matrix_b
->rank
== 2)
4169 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4171 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4174 result
->shape
= gfc_get_shape (result
->rank
);
4175 mpz_init_set_si (result
->shape
[0], result_columns
);
4177 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 1)
4179 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4181 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4185 result
->shape
= gfc_get_shape (result
->rank
);
4186 mpz_init_set_si (result
->shape
[0], result_rows
);
4188 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 2)
4190 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4191 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4192 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4193 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4196 result
->shape
= gfc_get_shape (result
->rank
);
4197 mpz_init_set_si (result
->shape
[0], result_rows
);
4198 mpz_init_set_si (result
->shape
[1], result_columns
);
4203 offset_a
= offset_b
= 0;
4204 for (col
= 0; col
< result_columns
; ++col
)
4208 for (row
= 0; row
< result_rows
; ++row
)
4210 gfc_expr
*e
= compute_dot_product (matrix_a
, stride_a
, offset_a
,
4211 matrix_b
, 1, offset_b
, false);
4212 gfc_constructor_append_expr (&result
->value
.constructor
,
4218 offset_b
+= stride_b
;
4226 gfc_simplify_maskr (gfc_expr
*i
, gfc_expr
*kind_arg
)
4232 if (i
->expr_type
!= EXPR_CONSTANT
)
4235 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKR", gfc_default_integer_kind
);
4237 return &gfc_bad_expr
;
4238 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4240 s
= gfc_extract_int (i
, &arg
);
4243 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4245 /* MASKR(n) = 2^n - 1 */
4246 mpz_set_ui (result
->value
.integer
, 1);
4247 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
, arg
);
4248 mpz_sub_ui (result
->value
.integer
, result
->value
.integer
, 1);
4250 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4257 gfc_simplify_maskl (gfc_expr
*i
, gfc_expr
*kind_arg
)
4264 if (i
->expr_type
!= EXPR_CONSTANT
)
4267 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKL", gfc_default_integer_kind
);
4269 return &gfc_bad_expr
;
4270 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4272 s
= gfc_extract_int (i
, &arg
);
4275 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4277 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4278 mpz_init_set_ui (z
, 1);
4279 mpz_mul_2exp (z
, z
, gfc_integer_kinds
[k
].bit_size
);
4280 mpz_set_ui (result
->value
.integer
, 1);
4281 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
,
4282 gfc_integer_kinds
[k
].bit_size
- arg
);
4283 mpz_sub (result
->value
.integer
, z
, result
->value
.integer
);
4286 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4293 gfc_simplify_merge (gfc_expr
*tsource
, gfc_expr
*fsource
, gfc_expr
*mask
)
4296 gfc_constructor
*tsource_ctor
, *fsource_ctor
, *mask_ctor
;
4298 if (mask
->expr_type
== EXPR_CONSTANT
)
4299 return gfc_get_parentheses (gfc_copy_expr (mask
->value
.logical
4300 ? tsource
: fsource
));
4302 if (!mask
->rank
|| !is_constant_array_expr (mask
)
4303 || !is_constant_array_expr (tsource
) || !is_constant_array_expr (fsource
))
4306 result
= gfc_get_array_expr (tsource
->ts
.type
, tsource
->ts
.kind
,
4308 if (tsource
->ts
.type
== BT_DERIVED
)
4309 result
->ts
.u
.derived
= tsource
->ts
.u
.derived
;
4310 else if (tsource
->ts
.type
== BT_CHARACTER
)
4311 result
->ts
.u
.cl
= tsource
->ts
.u
.cl
;
4313 tsource_ctor
= gfc_constructor_first (tsource
->value
.constructor
);
4314 fsource_ctor
= gfc_constructor_first (fsource
->value
.constructor
);
4315 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4319 if (mask_ctor
->expr
->value
.logical
)
4320 gfc_constructor_append_expr (&result
->value
.constructor
,
4321 gfc_copy_expr (tsource_ctor
->expr
),
4324 gfc_constructor_append_expr (&result
->value
.constructor
,
4325 gfc_copy_expr (fsource_ctor
->expr
),
4327 tsource_ctor
= gfc_constructor_next (tsource_ctor
);
4328 fsource_ctor
= gfc_constructor_next (fsource_ctor
);
4329 mask_ctor
= gfc_constructor_next (mask_ctor
);
4332 result
->shape
= gfc_get_shape (1);
4333 gfc_array_size (result
, &result
->shape
[0]);
4340 gfc_simplify_merge_bits (gfc_expr
*i
, gfc_expr
*j
, gfc_expr
*mask_expr
)
4342 mpz_t arg1
, arg2
, mask
;
4345 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
4346 || mask_expr
->expr_type
!= EXPR_CONSTANT
)
4349 result
= gfc_get_constant_expr (BT_INTEGER
, i
->ts
.kind
, &i
->where
);
4351 /* Convert all argument to unsigned. */
4352 mpz_init_set (arg1
, i
->value
.integer
);
4353 mpz_init_set (arg2
, j
->value
.integer
);
4354 mpz_init_set (mask
, mask_expr
->value
.integer
);
4356 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4357 mpz_and (arg1
, arg1
, mask
);
4358 mpz_com (mask
, mask
);
4359 mpz_and (arg2
, arg2
, mask
);
4360 mpz_ior (result
->value
.integer
, arg1
, arg2
);
4370 /* Selects between current value and extremum for simplify_min_max
4371 and simplify_minval_maxval. */
4373 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
)
4375 switch (arg
->ts
.type
)
4378 if (mpz_cmp (arg
->value
.integer
,
4379 extremum
->value
.integer
) * sign
> 0)
4380 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
4384 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4386 mpfr_max (extremum
->value
.real
, extremum
->value
.real
,
4387 arg
->value
.real
, GFC_RND_MODE
);
4389 mpfr_min (extremum
->value
.real
, extremum
->value
.real
,
4390 arg
->value
.real
, GFC_RND_MODE
);
4394 #define LENGTH(x) ((x)->value.character.length)
4395 #define STRING(x) ((x)->value.character.string)
4396 if (LENGTH (extremum
) < LENGTH(arg
))
4398 gfc_char_t
*tmp
= STRING(extremum
);
4400 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
4401 memcpy (STRING(extremum
), tmp
,
4402 LENGTH(extremum
) * sizeof (gfc_char_t
));
4403 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
4404 LENGTH(arg
) - LENGTH(extremum
));
4405 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
4406 LENGTH(extremum
) = LENGTH(arg
);
4410 if (gfc_compare_string (arg
, extremum
) * sign
> 0)
4412 free (STRING(extremum
));
4413 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
4414 memcpy (STRING(extremum
), STRING(arg
),
4415 LENGTH(arg
) * sizeof (gfc_char_t
));
4416 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
4417 LENGTH(extremum
) - LENGTH(arg
));
4418 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
4425 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4430 /* This function is special since MAX() can take any number of
4431 arguments. The simplified expression is a rewritten version of the
4432 argument list containing at most one constant element. Other
4433 constant elements are deleted. Because the argument list has
4434 already been checked, this function always succeeds. sign is 1 for
4435 MAX(), -1 for MIN(). */
4438 simplify_min_max (gfc_expr
*expr
, int sign
)
4440 gfc_actual_arglist
*arg
, *last
, *extremum
;
4441 gfc_intrinsic_sym
* specific
;
4445 specific
= expr
->value
.function
.isym
;
4447 arg
= expr
->value
.function
.actual
;
4449 for (; arg
; last
= arg
, arg
= arg
->next
)
4451 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
4454 if (extremum
== NULL
)
4460 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
4462 /* Delete the extra constant argument. */
4463 last
->next
= arg
->next
;
4466 gfc_free_actual_arglist (arg
);
4470 /* If there is one value left, replace the function call with the
4472 if (expr
->value
.function
.actual
->next
!= NULL
)
4475 /* Convert to the correct type and kind. */
4476 if (expr
->ts
.type
!= BT_UNKNOWN
)
4477 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4478 expr
->ts
.type
, expr
->ts
.kind
);
4480 if (specific
->ts
.type
!= BT_UNKNOWN
)
4481 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4482 specific
->ts
.type
, specific
->ts
.kind
);
4484 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
4489 gfc_simplify_min (gfc_expr
*e
)
4491 return simplify_min_max (e
, -1);
4496 gfc_simplify_max (gfc_expr
*e
)
4498 return simplify_min_max (e
, 1);
4502 /* This is a simplified version of simplify_min_max to provide
4503 simplification of minval and maxval for a vector. */
4506 simplify_minval_maxval (gfc_expr
*expr
, int sign
)
4508 gfc_constructor
*c
, *extremum
;
4509 gfc_intrinsic_sym
* specific
;
4512 specific
= expr
->value
.function
.isym
;
4514 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4515 c
; c
= gfc_constructor_next (c
))
4517 if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
4520 if (extremum
== NULL
)
4526 min_max_choose (c
->expr
, extremum
->expr
, sign
);
4529 if (extremum
== NULL
)
4532 /* Convert to the correct type and kind. */
4533 if (expr
->ts
.type
!= BT_UNKNOWN
)
4534 return gfc_convert_constant (extremum
->expr
,
4535 expr
->ts
.type
, expr
->ts
.kind
);
4537 if (specific
->ts
.type
!= BT_UNKNOWN
)
4538 return gfc_convert_constant (extremum
->expr
,
4539 specific
->ts
.type
, specific
->ts
.kind
);
4541 return gfc_copy_expr (extremum
->expr
);
4546 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4548 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4551 return simplify_minval_maxval (array
, -1);
4556 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4558 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
4561 return simplify_minval_maxval (array
, 1);
4566 gfc_simplify_maxexponent (gfc_expr
*x
)
4568 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4569 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4570 gfc_real_kinds
[i
].max_exponent
);
4575 gfc_simplify_minexponent (gfc_expr
*x
)
4577 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4578 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
4579 gfc_real_kinds
[i
].min_exponent
);
4584 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
4589 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4592 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4593 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4598 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4600 /* Result is processor-dependent. */
4601 gfc_error ("Second argument MOD at %L is zero", &a
->where
);
4602 gfc_free_expr (result
);
4603 return &gfc_bad_expr
;
4605 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4609 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4611 /* Result is processor-dependent. */
4612 gfc_error ("Second argument of MOD at %L is zero", &p
->where
);
4613 gfc_free_expr (result
);
4614 return &gfc_bad_expr
;
4617 gfc_set_model_kind (kind
);
4618 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4623 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4626 return range_check (result
, "MOD");
4631 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
4636 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
4639 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
4640 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
4645 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
4647 /* Result is processor-dependent. This processor just opts
4648 to not handle it at all. */
4649 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
4650 gfc_free_expr (result
);
4651 return &gfc_bad_expr
;
4653 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
4658 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
4660 /* Result is processor-dependent. */
4661 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
4662 gfc_free_expr (result
);
4663 return &gfc_bad_expr
;
4666 gfc_set_model_kind (kind
);
4667 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
4669 if (mpfr_cmp_ui (result
->value
.real
, 0) != 0)
4671 if (mpfr_signbit (a
->value
.real
) != mpfr_signbit (p
->value
.real
))
4672 mpfr_add (result
->value
.real
, result
->value
.real
, p
->value
.real
,
4676 mpfr_copysign (result
->value
.real
, result
->value
.real
,
4677 p
->value
.real
, GFC_RND_MODE
);
4681 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4684 return range_check (result
, "MODULO");
4689 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
4692 mp_exp_t emin
, emax
;
4695 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
4698 result
= gfc_copy_expr (x
);
4700 /* Save current values of emin and emax. */
4701 emin
= mpfr_get_emin ();
4702 emax
= mpfr_get_emax ();
4704 /* Set emin and emax for the current model number. */
4705 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
4706 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
4707 mpfr_get_prec(result
->value
.real
) + 1);
4708 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
4709 mpfr_check_range (result
->value
.real
, 0, GMP_RNDU
);
4711 if (mpfr_sgn (s
->value
.real
) > 0)
4713 mpfr_nextabove (result
->value
.real
);
4714 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
4718 mpfr_nextbelow (result
->value
.real
);
4719 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
4722 mpfr_set_emin (emin
);
4723 mpfr_set_emax (emax
);
4725 /* Only NaN can occur. Do not use range check as it gives an
4726 error for denormal numbers. */
4727 if (mpfr_nan_p (result
->value
.real
) && flag_range_check
)
4729 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
4730 gfc_free_expr (result
);
4731 return &gfc_bad_expr
;
4739 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
4741 gfc_expr
*itrunc
, *result
;
4744 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
4746 return &gfc_bad_expr
;
4748 if (e
->expr_type
!= EXPR_CONSTANT
)
4751 itrunc
= gfc_copy_expr (e
);
4752 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
4754 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
4755 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
4757 gfc_free_expr (itrunc
);
4759 return range_check (result
, name
);
4764 gfc_simplify_new_line (gfc_expr
*e
)
4768 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 1);
4769 result
->value
.character
.string
[0] = '\n';
4776 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
4778 return simplify_nint ("NINT", e
, k
);
4783 gfc_simplify_idnint (gfc_expr
*e
)
4785 return simplify_nint ("IDNINT", e
, NULL
);
4790 add_squared (gfc_expr
*result
, gfc_expr
*e
)
4794 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4795 gcc_assert (result
->ts
.type
== BT_REAL
4796 && result
->expr_type
== EXPR_CONSTANT
);
4798 gfc_set_model_kind (result
->ts
.kind
);
4800 mpfr_pow_ui (tmp
, e
->value
.real
, 2, GFC_RND_MODE
);
4801 mpfr_add (result
->value
.real
, result
->value
.real
, tmp
,
4810 do_sqrt (gfc_expr
*result
, gfc_expr
*e
)
4812 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
4813 gcc_assert (result
->ts
.type
== BT_REAL
4814 && result
->expr_type
== EXPR_CONSTANT
);
4816 mpfr_set (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
4817 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4823 gfc_simplify_norm2 (gfc_expr
*e
, gfc_expr
*dim
)
4827 if (!is_constant_array_expr (e
)
4828 || (dim
!= NULL
&& !gfc_is_constant_expr (dim
)))
4831 result
= transformational_result (e
, dim
, e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4832 init_result_expr (result
, 0, NULL
);
4834 if (!dim
|| e
->rank
== 1)
4836 result
= simplify_transformation_to_scalar (result
, e
, NULL
,
4838 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4841 result
= simplify_transformation_to_array (result
, e
, dim
, NULL
,
4842 add_squared
, &do_sqrt
);
4849 gfc_simplify_not (gfc_expr
*e
)
4853 if (e
->expr_type
!= EXPR_CONSTANT
)
4856 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4857 mpz_com (result
->value
.integer
, e
->value
.integer
);
4859 return range_check (result
, "NOT");
4864 gfc_simplify_null (gfc_expr
*mold
)
4870 result
= gfc_copy_expr (mold
);
4871 result
->expr_type
= EXPR_NULL
;
4874 result
= gfc_get_null_expr (NULL
);
4881 gfc_simplify_num_images (gfc_expr
*distance ATTRIBUTE_UNUSED
, gfc_expr
*failed
)
4885 if (flag_coarray
== GFC_FCOARRAY_NONE
)
4887 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
4888 return &gfc_bad_expr
;
4891 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
4894 if (failed
&& failed
->expr_type
!= EXPR_CONSTANT
)
4897 /* FIXME: gfc_current_locus is wrong. */
4898 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
4899 &gfc_current_locus
);
4901 if (failed
&& failed
->value
.logical
!= 0)
4902 mpz_set_si (result
->value
.integer
, 0);
4904 mpz_set_si (result
->value
.integer
, 1);
4911 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
4916 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
4919 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
4924 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
4925 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
4926 return range_check (result
, "OR");
4929 return gfc_get_logical_expr (kind
, &x
->where
,
4930 x
->value
.logical
|| y
->value
.logical
);
4938 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
4941 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
4943 if (!is_constant_array_expr (array
)
4944 || !is_constant_array_expr (vector
)
4945 || (!gfc_is_constant_expr (mask
)
4946 && !is_constant_array_expr (mask
)))
4949 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
4950 if (array
->ts
.type
== BT_DERIVED
)
4951 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
4953 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
4954 vector_ctor
= vector
4955 ? gfc_constructor_first (vector
->value
.constructor
)
4958 if (mask
->expr_type
== EXPR_CONSTANT
4959 && mask
->value
.logical
)
4961 /* Copy all elements of ARRAY to RESULT. */
4964 gfc_constructor_append_expr (&result
->value
.constructor
,
4965 gfc_copy_expr (array_ctor
->expr
),
4968 array_ctor
= gfc_constructor_next (array_ctor
);
4969 vector_ctor
= gfc_constructor_next (vector_ctor
);
4972 else if (mask
->expr_type
== EXPR_ARRAY
)
4974 /* Copy only those elements of ARRAY to RESULT whose
4975 MASK equals .TRUE.. */
4976 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4979 if (mask_ctor
->expr
->value
.logical
)
4981 gfc_constructor_append_expr (&result
->value
.constructor
,
4982 gfc_copy_expr (array_ctor
->expr
),
4984 vector_ctor
= gfc_constructor_next (vector_ctor
);
4987 array_ctor
= gfc_constructor_next (array_ctor
);
4988 mask_ctor
= gfc_constructor_next (mask_ctor
);
4992 /* Append any left-over elements from VECTOR to RESULT. */
4995 gfc_constructor_append_expr (&result
->value
.constructor
,
4996 gfc_copy_expr (vector_ctor
->expr
),
4998 vector_ctor
= gfc_constructor_next (vector_ctor
);
5001 result
->shape
= gfc_get_shape (1);
5002 gfc_array_size (result
, &result
->shape
[0]);
5004 if (array
->ts
.type
== BT_CHARACTER
)
5005 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
5012 do_xor (gfc_expr
*result
, gfc_expr
*e
)
5014 gcc_assert (e
->ts
.type
== BT_LOGICAL
&& e
->expr_type
== EXPR_CONSTANT
);
5015 gcc_assert (result
->ts
.type
== BT_LOGICAL
5016 && result
->expr_type
== EXPR_CONSTANT
);
5018 result
->value
.logical
= result
->value
.logical
!= e
->value
.logical
;
5025 gfc_simplify_parity (gfc_expr
*e
, gfc_expr
*dim
)
5027 return simplify_transformation (e
, dim
, NULL
, 0, do_xor
);
5032 gfc_simplify_popcnt (gfc_expr
*e
)
5037 if (e
->expr_type
!= EXPR_CONSTANT
)
5040 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5042 /* Convert argument to unsigned, then count the '1' bits. */
5043 mpz_init_set (x
, e
->value
.integer
);
5044 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
5045 res
= mpz_popcount (x
);
5048 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, res
);
5053 gfc_simplify_poppar (gfc_expr
*e
)
5059 if (e
->expr_type
!= EXPR_CONSTANT
)
5062 popcnt
= gfc_simplify_popcnt (e
);
5063 gcc_assert (popcnt
);
5065 s
= gfc_extract_int (popcnt
, &i
);
5068 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
% 2);
5073 gfc_simplify_precision (gfc_expr
*e
)
5075 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5076 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
,
5077 gfc_real_kinds
[i
].precision
);
5082 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
5084 return simplify_transformation (array
, dim
, mask
, 1, gfc_multiply
);
5089 gfc_simplify_radix (gfc_expr
*e
)
5092 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5097 i
= gfc_integer_kinds
[i
].radix
;
5101 i
= gfc_real_kinds
[i
].radix
;
5108 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
5113 gfc_simplify_range (gfc_expr
*e
)
5116 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5121 i
= gfc_integer_kinds
[i
].range
;
5126 i
= gfc_real_kinds
[i
].range
;
5133 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
5138 gfc_simplify_rank (gfc_expr
*e
)
5144 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, e
->rank
);
5149 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
5151 gfc_expr
*result
= NULL
;
5154 if (e
->ts
.type
== BT_COMPLEX
)
5155 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
5157 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
5160 return &gfc_bad_expr
;
5162 if (e
->expr_type
!= EXPR_CONSTANT
)
5165 if (convert_boz (e
, kind
) == &gfc_bad_expr
)
5166 return &gfc_bad_expr
;
5168 result
= gfc_convert_constant (e
, BT_REAL
, kind
);
5169 if (result
== &gfc_bad_expr
)
5170 return &gfc_bad_expr
;
5172 return range_check (result
, "REAL");
5177 gfc_simplify_realpart (gfc_expr
*e
)
5181 if (e
->expr_type
!= EXPR_CONSTANT
)
5184 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
5185 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
5187 return range_check (result
, "REALPART");
5191 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
5194 int i
, j
, len
, ncop
, nlen
;
5196 bool have_length
= false;
5198 /* If NCOPIES isn't a constant, there's nothing we can do. */
5199 if (n
->expr_type
!= EXPR_CONSTANT
)
5202 /* If NCOPIES is negative, it's an error. */
5203 if (mpz_sgn (n
->value
.integer
) < 0)
5205 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
5207 return &gfc_bad_expr
;
5210 /* If we don't know the character length, we can do no more. */
5211 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
5212 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
5214 len
= mpz_get_si (e
->ts
.u
.cl
->length
->value
.integer
);
5217 else if (e
->expr_type
== EXPR_CONSTANT
5218 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
5220 len
= e
->value
.character
.length
;
5225 /* If the source length is 0, any value of NCOPIES is valid
5226 and everything behaves as if NCOPIES == 0. */
5229 mpz_set_ui (ncopies
, 0);
5231 mpz_set (ncopies
, n
->value
.integer
);
5233 /* Check that NCOPIES isn't too large. */
5239 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
5241 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
5245 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
5246 e
->ts
.u
.cl
->length
->value
.integer
);
5250 mpz_init_set_si (mlen
, len
);
5251 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
5255 /* The check itself. */
5256 if (mpz_cmp (ncopies
, max
) > 0)
5259 mpz_clear (ncopies
);
5260 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
5262 return &gfc_bad_expr
;
5267 mpz_clear (ncopies
);
5269 /* For further simplification, we need the character string to be
5271 if (e
->expr_type
!= EXPR_CONSTANT
)
5275 (e
->ts
.u
.cl
->length
&&
5276 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
) != 0))
5278 const char *res
= gfc_extract_int (n
, &ncop
);
5279 gcc_assert (res
== NULL
);
5285 return gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 0);
5287 len
= e
->value
.character
.length
;
5290 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, nlen
);
5291 for (i
= 0; i
< ncop
; i
++)
5292 for (j
= 0; j
< len
; j
++)
5293 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
5295 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
5300 /* This one is a bear, but mainly has to do with shuffling elements. */
5303 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
5304 gfc_expr
*pad
, gfc_expr
*order_exp
)
5306 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
5307 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
5311 gfc_expr
*e
, *result
;
5313 /* Check that argument expression types are OK. */
5314 if (!is_constant_array_expr (source
)
5315 || !is_constant_array_expr (shape_exp
)
5316 || !is_constant_array_expr (pad
)
5317 || !is_constant_array_expr (order_exp
))
5320 if (source
->shape
== NULL
)
5323 /* Proceed with simplification, unpacking the array. */
5330 e
= gfc_constructor_lookup_expr (shape_exp
->value
.constructor
, rank
);
5334 gfc_extract_int (e
, &shape
[rank
]);
5336 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
5337 gcc_assert (shape
[rank
] >= 0);
5342 gcc_assert (rank
> 0);
5344 /* Now unpack the order array if present. */
5345 if (order_exp
== NULL
)
5347 for (i
= 0; i
< rank
; i
++)
5352 for (i
= 0; i
< rank
; i
++)
5355 for (i
= 0; i
< rank
; i
++)
5357 e
= gfc_constructor_lookup_expr (order_exp
->value
.constructor
, i
);
5360 gfc_extract_int (e
, &order
[i
]);
5362 gcc_assert (order
[i
] >= 1 && order
[i
] <= rank
);
5364 gcc_assert (x
[order
[i
]] == 0);
5369 /* Count the elements in the source and padding arrays. */
5374 gfc_array_size (pad
, &size
);
5375 npad
= mpz_get_ui (size
);
5379 gfc_array_size (source
, &size
);
5380 nsource
= mpz_get_ui (size
);
5383 /* If it weren't for that pesky permutation we could just loop
5384 through the source and round out any shortage with pad elements.
5385 But no, someone just had to have the compiler do something the
5386 user should be doing. */
5388 for (i
= 0; i
< rank
; i
++)
5391 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5393 if (source
->ts
.type
== BT_DERIVED
)
5394 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5395 result
->rank
= rank
;
5396 result
->shape
= gfc_get_shape (rank
);
5397 for (i
= 0; i
< rank
; i
++)
5398 mpz_init_set_ui (result
->shape
[i
], shape
[i
]);
5400 while (nsource
> 0 || npad
> 0)
5402 /* Figure out which element to extract. */
5403 mpz_set_ui (index
, 0);
5405 for (i
= rank
- 1; i
>= 0; i
--)
5407 mpz_add_ui (index
, index
, x
[order
[i
]]);
5409 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
5412 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
5413 gfc_internal_error ("Reshaped array too large at %C");
5415 j
= mpz_get_ui (index
);
5418 e
= gfc_constructor_lookup_expr (source
->value
.constructor
, j
);
5428 e
= gfc_constructor_lookup_expr (pad
->value
.constructor
, j
);
5432 gfc_constructor_append_expr (&result
->value
.constructor
,
5433 gfc_copy_expr (e
), &e
->where
);
5435 /* Calculate the next element. */
5439 if (++x
[i
] < shape
[i
])
5455 gfc_simplify_rrspacing (gfc_expr
*x
)
5461 if (x
->expr_type
!= EXPR_CONSTANT
)
5464 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
5466 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5468 /* RRSPACING(+/- 0.0) = 0.0 */
5469 if (mpfr_zero_p (x
->value
.real
))
5471 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5475 /* RRSPACING(inf) = NaN */
5476 if (mpfr_inf_p (x
->value
.real
))
5478 mpfr_set_nan (result
->value
.real
);
5482 /* RRSPACING(NaN) = same NaN */
5483 if (mpfr_nan_p (x
->value
.real
))
5485 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5489 /* | x * 2**(-e) | * 2**p. */
5490 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5491 e
= - (long int) mpfr_get_exp (x
->value
.real
);
5492 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
5494 p
= (long int) gfc_real_kinds
[i
].digits
;
5495 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
5497 return range_check (result
, "RRSPACING");
5502 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
5504 int k
, neg_flag
, power
, exp_range
;
5505 mpfr_t scale
, radix
;
5508 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5511 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5513 if (mpfr_zero_p (x
->value
.real
))
5515 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
5519 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5521 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
5523 /* This check filters out values of i that would overflow an int. */
5524 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
5525 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
5527 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
5528 gfc_free_expr (result
);
5529 return &gfc_bad_expr
;
5532 /* Compute scale = radix ** power. */
5533 power
= mpz_get_si (i
->value
.integer
);
5543 gfc_set_model_kind (x
->ts
.kind
);
5546 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
5547 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
5550 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5552 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
5554 mpfr_clears (scale
, radix
, NULL
);
5556 return range_check (result
, "SCALE");
5560 /* Variants of strspn and strcspn that operate on wide characters. */
5563 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5566 const gfc_char_t
*c
;
5570 for (c
= s2
; *c
; c
++)
5584 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
5587 const gfc_char_t
*c
;
5591 for (c
= s2
; *c
; c
++)
5606 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
5611 size_t indx
, len
, lenc
;
5612 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
5615 return &gfc_bad_expr
;
5617 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
5618 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
5621 if (b
!= NULL
&& b
->value
.logical
!= 0)
5626 len
= e
->value
.character
.length
;
5627 lenc
= c
->value
.character
.length
;
5629 if (len
== 0 || lenc
== 0)
5637 indx
= wide_strcspn (e
->value
.character
.string
,
5638 c
->value
.character
.string
) + 1;
5645 for (indx
= len
; indx
> 0; indx
--)
5647 for (i
= 0; i
< lenc
; i
++)
5649 if (c
->value
.character
.string
[i
]
5650 == e
->value
.character
.string
[indx
- 1])
5659 result
= gfc_get_int_expr (k
, &e
->where
, indx
);
5660 return range_check (result
, "SCAN");
5665 gfc_simplify_selected_char_kind (gfc_expr
*e
)
5669 if (e
->expr_type
!= EXPR_CONSTANT
)
5672 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
5673 || gfc_compare_with_Cstring (e
, "default", false) == 0)
5675 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
5680 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5685 gfc_simplify_selected_int_kind (gfc_expr
*e
)
5689 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
) != NULL
)
5694 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
5695 if (gfc_integer_kinds
[i
].range
>= range
5696 && gfc_integer_kinds
[i
].kind
< kind
)
5697 kind
= gfc_integer_kinds
[i
].kind
;
5699 if (kind
== INT_MAX
)
5702 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
5707 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
, gfc_expr
*rdx
)
5709 int range
, precision
, radix
, i
, kind
, found_precision
, found_range
,
5711 locus
*loc
= &gfc_current_locus
;
5717 if (p
->expr_type
!= EXPR_CONSTANT
5718 || gfc_extract_int (p
, &precision
) != NULL
)
5727 if (q
->expr_type
!= EXPR_CONSTANT
5728 || gfc_extract_int (q
, &range
) != NULL
)
5739 if (rdx
->expr_type
!= EXPR_CONSTANT
5740 || gfc_extract_int (rdx
, &radix
) != NULL
)
5748 found_precision
= 0;
5752 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
5754 if (gfc_real_kinds
[i
].precision
>= precision
)
5755 found_precision
= 1;
5757 if (gfc_real_kinds
[i
].range
>= range
)
5760 if (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
5763 if (gfc_real_kinds
[i
].precision
>= precision
5764 && gfc_real_kinds
[i
].range
>= range
5765 && (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
5766 && gfc_real_kinds
[i
].kind
< kind
)
5767 kind
= gfc_real_kinds
[i
].kind
;
5770 if (kind
== INT_MAX
)
5772 if (found_radix
&& found_range
&& !found_precision
)
5774 else if (found_radix
&& found_precision
&& !found_range
)
5776 else if (found_radix
&& !found_precision
&& !found_range
)
5778 else if (found_radix
)
5784 return gfc_get_int_expr (gfc_default_integer_kind
, loc
, kind
);
5789 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
5792 mpfr_t exp
, absv
, log2
, pow2
, frac
;
5795 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
5798 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5800 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
5801 SET_EXPONENT (NaN) = same NaN */
5802 if (mpfr_zero_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
5804 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5808 /* SET_EXPONENT (inf) = NaN */
5809 if (mpfr_inf_p (x
->value
.real
))
5811 mpfr_set_nan (result
->value
.real
);
5815 gfc_set_model_kind (x
->ts
.kind
);
5822 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
5823 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
5825 mpfr_trunc (log2
, log2
);
5826 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
5828 /* Old exponent value, and fraction. */
5829 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
5831 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
5834 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
5835 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
5837 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
5839 return range_check (result
, "SET_EXPONENT");
5844 gfc_simplify_shape (gfc_expr
*source
, gfc_expr
*kind
)
5846 mpz_t shape
[GFC_MAX_DIMENSIONS
];
5847 gfc_expr
*result
, *e
, *f
;
5851 int k
= get_kind (BT_INTEGER
, kind
, "SHAPE", gfc_default_integer_kind
);
5853 if (source
->rank
== -1)
5856 result
= gfc_get_array_expr (BT_INTEGER
, k
, &source
->where
);
5858 if (source
->rank
== 0)
5861 if (source
->expr_type
== EXPR_VARIABLE
)
5863 ar
= gfc_find_array_ref (source
);
5864 t
= gfc_array_ref_shape (ar
, shape
);
5866 else if (source
->shape
)
5869 for (n
= 0; n
< source
->rank
; n
++)
5871 mpz_init (shape
[n
]);
5872 mpz_set (shape
[n
], source
->shape
[n
]);
5878 for (n
= 0; n
< source
->rank
; n
++)
5880 e
= gfc_get_constant_expr (BT_INTEGER
, k
, &source
->where
);
5883 mpz_set (e
->value
.integer
, shape
[n
]);
5886 mpz_set_ui (e
->value
.integer
, n
+ 1);
5888 f
= simplify_size (source
, e
, k
);
5892 gfc_free_expr (result
);
5899 if (e
== &gfc_bad_expr
|| range_check (e
, "SHAPE") == &gfc_bad_expr
)
5901 gfc_free_expr (result
);
5903 gfc_clear_shape (shape
, source
->rank
);
5904 return &gfc_bad_expr
;
5907 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
5911 gfc_clear_shape (shape
, source
->rank
);
5918 simplify_size (gfc_expr
*array
, gfc_expr
*dim
, int k
)
5921 gfc_expr
*return_value
;
5924 /* For unary operations, the size of the result is given by the size
5925 of the operand. For binary ones, it's the size of the first operand
5926 unless it is scalar, then it is the size of the second. */
5927 if (array
->expr_type
== EXPR_OP
&& !array
->value
.op
.uop
)
5929 gfc_expr
* replacement
;
5930 gfc_expr
* simplified
;
5932 switch (array
->value
.op
.op
)
5934 /* Unary operations. */
5936 case INTRINSIC_UPLUS
:
5937 case INTRINSIC_UMINUS
:
5938 case INTRINSIC_PARENTHESES
:
5939 replacement
= array
->value
.op
.op1
;
5942 /* Binary operations. If any one of the operands is scalar, take
5943 the other one's size. If both of them are arrays, it does not
5944 matter -- try to find one with known shape, if possible. */
5946 if (array
->value
.op
.op1
->rank
== 0)
5947 replacement
= array
->value
.op
.op2
;
5948 else if (array
->value
.op
.op2
->rank
== 0)
5949 replacement
= array
->value
.op
.op1
;
5952 simplified
= simplify_size (array
->value
.op
.op1
, dim
, k
);
5956 replacement
= array
->value
.op
.op2
;
5961 /* Try to reduce it directly if possible. */
5962 simplified
= simplify_size (replacement
, dim
, k
);
5964 /* Otherwise, we build a new SIZE call. This is hopefully at least
5965 simpler than the original one. */
5968 gfc_expr
*kind
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, k
);
5969 simplified
= gfc_build_intrinsic_call (gfc_current_ns
,
5970 GFC_ISYM_SIZE
, "size",
5972 gfc_copy_expr (replacement
),
5973 gfc_copy_expr (dim
),
5981 if (!gfc_array_size (array
, &size
))
5986 if (dim
->expr_type
!= EXPR_CONSTANT
)
5989 d
= mpz_get_ui (dim
->value
.integer
) - 1;
5990 if (!gfc_array_dimen_size (array
, d
, &size
))
5994 return_value
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
5995 mpz_set (return_value
->value
.integer
, size
);
5998 return return_value
;
6003 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6006 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
6009 return &gfc_bad_expr
;
6011 result
= simplify_size (array
, dim
, k
);
6012 if (result
== NULL
|| result
== &gfc_bad_expr
)
6015 return range_check (result
, "SIZE");
6019 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
6020 multiplied by the array size. */
6023 gfc_simplify_sizeof (gfc_expr
*x
)
6025 gfc_expr
*result
= NULL
;
6028 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6031 if (x
->ts
.type
== BT_CHARACTER
6032 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6033 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6036 if (x
->rank
&& x
->expr_type
!= EXPR_ARRAY
6037 && !gfc_array_size (x
, &array_size
))
6040 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_index_integer_kind
,
6042 mpz_set_si (result
->value
.integer
, gfc_target_expr_size (x
));
6048 /* STORAGE_SIZE returns the size in bits of a single array element. */
6051 gfc_simplify_storage_size (gfc_expr
*x
,
6054 gfc_expr
*result
= NULL
;
6057 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6060 if (x
->ts
.type
== BT_CHARACTER
&& x
->expr_type
!= EXPR_CONSTANT
6061 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6062 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6065 k
= get_kind (BT_INTEGER
, kind
, "STORAGE_SIZE", gfc_default_integer_kind
);
6067 return &gfc_bad_expr
;
6069 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
6071 mpz_set_si (result
->value
.integer
, gfc_element_size (x
));
6072 mpz_mul_ui (result
->value
.integer
, result
->value
.integer
, BITS_PER_UNIT
);
6074 return range_check (result
, "STORAGE_SIZE");
6079 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
6083 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6086 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6091 mpz_abs (result
->value
.integer
, x
->value
.integer
);
6092 if (mpz_sgn (y
->value
.integer
) < 0)
6093 mpz_neg (result
->value
.integer
, result
->value
.integer
);
6098 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
6101 mpfr_setsign (result
->value
.real
, x
->value
.real
,
6102 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
6106 gfc_internal_error ("Bad type in gfc_simplify_sign");
6114 gfc_simplify_sin (gfc_expr
*x
)
6118 if (x
->expr_type
!= EXPR_CONSTANT
)
6121 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6126 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6130 gfc_set_model (x
->value
.real
);
6131 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6135 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
6138 return range_check (result
, "SIN");
6143 gfc_simplify_sinh (gfc_expr
*x
)
6147 if (x
->expr_type
!= EXPR_CONSTANT
)
6150 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6155 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6159 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6166 return range_check (result
, "SINH");
6170 /* The argument is always a double precision real that is converted to
6171 single precision. TODO: Rounding! */
6174 gfc_simplify_sngl (gfc_expr
*a
)
6178 if (a
->expr_type
!= EXPR_CONSTANT
)
6181 result
= gfc_real2real (a
, gfc_default_real_kind
);
6182 return range_check (result
, "SNGL");
6187 gfc_simplify_spacing (gfc_expr
*x
)
6193 if (x
->expr_type
!= EXPR_CONSTANT
)
6196 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
6197 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6199 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
6200 if (mpfr_zero_p (x
->value
.real
))
6202 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
6206 /* SPACING(inf) = NaN */
6207 if (mpfr_inf_p (x
->value
.real
))
6209 mpfr_set_nan (result
->value
.real
);
6213 /* SPACING(NaN) = same NaN */
6214 if (mpfr_nan_p (x
->value
.real
))
6216 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6220 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
6221 are the radix, exponent of x, and precision. This excludes the
6222 possibility of subnormal numbers. Fortran 2003 states the result is
6223 b**max(e - p, emin - 1). */
6225 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
6226 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
6227 en
= en
> ep
? en
: ep
;
6229 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
6230 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
6232 return range_check (result
, "SPACING");
6237 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
6239 gfc_expr
*result
= NULL
;
6240 int nelem
, i
, j
, dim
, ncopies
;
6243 if ((!gfc_is_constant_expr (source
)
6244 && !is_constant_array_expr (source
))
6245 || !gfc_is_constant_expr (dim_expr
)
6246 || !gfc_is_constant_expr (ncopies_expr
))
6249 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
6250 gfc_extract_int (dim_expr
, &dim
);
6251 dim
-= 1; /* zero-base DIM */
6253 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
6254 gfc_extract_int (ncopies_expr
, &ncopies
);
6255 ncopies
= MAX (ncopies
, 0);
6257 /* Do not allow the array size to exceed the limit for an array
6259 if (source
->expr_type
== EXPR_ARRAY
)
6261 if (!gfc_array_size (source
, &size
))
6262 gfc_internal_error ("Failure getting length of a constant array.");
6265 mpz_init_set_ui (size
, 1);
6267 nelem
= mpz_get_si (size
) * ncopies
;
6268 if (nelem
> flag_max_array_constructor
)
6270 if (gfc_current_ns
->sym_root
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
6272 gfc_error ("The number of elements (%d) in the array constructor "
6273 "at %L requires an increase of the allowed %d upper "
6274 "limit. See %<-fmax-array-constructor%> option.",
6275 nelem
, &source
->where
, flag_max_array_constructor
);
6276 return &gfc_bad_expr
;
6282 if (source
->expr_type
== EXPR_CONSTANT
)
6284 gcc_assert (dim
== 0);
6286 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6288 if (source
->ts
.type
== BT_DERIVED
)
6289 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6291 result
->shape
= gfc_get_shape (result
->rank
);
6292 mpz_init_set_si (result
->shape
[0], ncopies
);
6294 for (i
= 0; i
< ncopies
; ++i
)
6295 gfc_constructor_append_expr (&result
->value
.constructor
,
6296 gfc_copy_expr (source
), NULL
);
6298 else if (source
->expr_type
== EXPR_ARRAY
)
6300 int offset
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
6301 gfc_constructor
*source_ctor
;
6303 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
6304 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
6306 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6308 if (source
->ts
.type
== BT_DERIVED
)
6309 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6310 result
->rank
= source
->rank
+ 1;
6311 result
->shape
= gfc_get_shape (result
->rank
);
6313 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
6316 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
6318 mpz_init_set_si (result
->shape
[i
], ncopies
);
6320 extent
[i
] = mpz_get_si (result
->shape
[i
]);
6321 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
6325 for (source_ctor
= gfc_constructor_first (source
->value
.constructor
);
6326 source_ctor
; source_ctor
= gfc_constructor_next (source_ctor
))
6328 for (i
= 0; i
< ncopies
; ++i
)
6329 gfc_constructor_insert_expr (&result
->value
.constructor
,
6330 gfc_copy_expr (source_ctor
->expr
),
6331 NULL
, offset
+ i
* rstride
[dim
]);
6333 offset
+= (dim
== 0 ? ncopies
: 1);
6338 gfc_error ("Simplification of SPREAD at %C not yet implemented");
6339 return &gfc_bad_expr
;
6342 if (source
->ts
.type
== BT_CHARACTER
)
6343 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
6350 gfc_simplify_sqrt (gfc_expr
*e
)
6352 gfc_expr
*result
= NULL
;
6354 if (e
->expr_type
!= EXPR_CONSTANT
)
6360 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
6362 gfc_error ("Argument of SQRT at %L has a negative value",
6364 return &gfc_bad_expr
;
6366 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6367 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
6371 gfc_set_model (e
->value
.real
);
6373 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6374 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
6378 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
6381 return range_check (result
, "SQRT");
6386 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
6388 return simplify_transformation (array
, dim
, mask
, 0, gfc_add
);
6393 gfc_simplify_cotan (gfc_expr
*x
)
6398 if (x
->expr_type
!= EXPR_CONSTANT
)
6401 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6406 mpfr_cot (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6410 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
6411 val
= &result
->value
.complex;
6412 mpc_init2 (swp
, mpfr_get_default_prec ());
6413 mpc_cos (swp
, x
->value
.complex, GFC_MPC_RND_MODE
);
6414 mpc_sin (*val
, x
->value
.complex, GFC_MPC_RND_MODE
);
6415 mpc_div (*val
, swp
, *val
, GFC_MPC_RND_MODE
);
6423 return range_check (result
, "COTAN");
6428 gfc_simplify_tan (gfc_expr
*x
)
6432 if (x
->expr_type
!= EXPR_CONSTANT
)
6435 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6440 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6444 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6451 return range_check (result
, "TAN");
6456 gfc_simplify_tanh (gfc_expr
*x
)
6460 if (x
->expr_type
!= EXPR_CONSTANT
)
6463 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6468 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6472 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6479 return range_check (result
, "TANH");
6484 gfc_simplify_tiny (gfc_expr
*e
)
6489 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
6491 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
6492 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
6499 gfc_simplify_trailz (gfc_expr
*e
)
6501 unsigned long tz
, bs
;
6504 if (e
->expr_type
!= EXPR_CONSTANT
)
6507 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
6508 bs
= gfc_integer_kinds
[i
].bit_size
;
6509 tz
= mpz_scan1 (e
->value
.integer
, 0);
6511 return gfc_get_int_expr (gfc_default_integer_kind
,
6512 &e
->where
, MIN (tz
, bs
));
6517 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
6520 gfc_expr
*mold_element
;
6525 unsigned char *buffer
;
6526 size_t result_length
;
6529 if (!gfc_is_constant_expr (source
)
6530 || (gfc_init_expr_flag
&& !gfc_is_constant_expr (mold
))
6531 || !gfc_is_constant_expr (size
))
6534 if (!gfc_calculate_transfer_sizes (source
, mold
, size
, &source_size
,
6535 &result_size
, &result_length
))
6538 /* Calculate the size of the source. */
6539 if (source
->expr_type
== EXPR_ARRAY
6540 && !gfc_array_size (source
, &tmp
))
6541 gfc_internal_error ("Failure getting length of a constant array.");
6543 /* Create an empty new expression with the appropriate characteristics. */
6544 result
= gfc_get_constant_expr (mold
->ts
.type
, mold
->ts
.kind
,
6546 result
->ts
= mold
->ts
;
6548 mold_element
= mold
->expr_type
== EXPR_ARRAY
6549 ? gfc_constructor_first (mold
->value
.constructor
)->expr
6552 /* Set result character length, if needed. Note that this needs to be
6553 set even for array expressions, in order to pass this information into
6554 gfc_target_interpret_expr. */
6555 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
6556 result
->value
.character
.length
= mold_element
->value
.character
.length
;
6558 /* Set the number of elements in the result, and determine its size. */
6560 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
6562 result
->expr_type
= EXPR_ARRAY
;
6564 result
->shape
= gfc_get_shape (1);
6565 mpz_init_set_ui (result
->shape
[0], result_length
);
6570 /* Allocate the buffer to store the binary version of the source. */
6571 buffer_size
= MAX (source_size
, result_size
);
6572 buffer
= (unsigned char*)alloca (buffer_size
);
6573 memset (buffer
, 0, buffer_size
);
6575 /* Now write source to the buffer. */
6576 gfc_target_encode_expr (source
, buffer
, buffer_size
);
6578 /* And read the buffer back into the new expression. */
6579 gfc_target_interpret_expr (buffer
, buffer_size
, result
, false);
6586 gfc_simplify_transpose (gfc_expr
*matrix
)
6588 int row
, matrix_rows
, col
, matrix_cols
;
6591 if (!is_constant_array_expr (matrix
))
6594 gcc_assert (matrix
->rank
== 2);
6596 result
= gfc_get_array_expr (matrix
->ts
.type
, matrix
->ts
.kind
,
6599 result
->shape
= gfc_get_shape (result
->rank
);
6600 mpz_set (result
->shape
[0], matrix
->shape
[1]);
6601 mpz_set (result
->shape
[1], matrix
->shape
[0]);
6603 if (matrix
->ts
.type
== BT_CHARACTER
)
6604 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
6605 else if (matrix
->ts
.type
== BT_DERIVED
)
6606 result
->ts
.u
.derived
= matrix
->ts
.u
.derived
;
6608 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
6609 matrix_cols
= mpz_get_si (matrix
->shape
[1]);
6610 for (row
= 0; row
< matrix_rows
; ++row
)
6611 for (col
= 0; col
< matrix_cols
; ++col
)
6613 gfc_expr
*e
= gfc_constructor_lookup_expr (matrix
->value
.constructor
,
6614 col
* matrix_rows
+ row
);
6615 gfc_constructor_insert_expr (&result
->value
.constructor
,
6616 gfc_copy_expr (e
), &matrix
->where
,
6617 row
* matrix_cols
+ col
);
6625 gfc_simplify_trim (gfc_expr
*e
)
6628 int count
, i
, len
, lentrim
;
6630 if (e
->expr_type
!= EXPR_CONSTANT
)
6633 len
= e
->value
.character
.length
;
6634 for (count
= 0, i
= 1; i
<= len
; ++i
)
6636 if (e
->value
.character
.string
[len
- i
] == ' ')
6642 lentrim
= len
- count
;
6644 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, lentrim
);
6645 for (i
= 0; i
< lentrim
; i
++)
6646 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
6653 gfc_simplify_image_index (gfc_expr
*coarray
, gfc_expr
*sub
)
6658 gfc_constructor
*sub_cons
;
6662 if (!is_constant_array_expr (sub
))
6665 /* Follow any component references. */
6666 as
= coarray
->symtree
->n
.sym
->as
;
6667 for (ref
= coarray
->ref
; ref
; ref
= ref
->next
)
6668 if (ref
->type
== REF_COMPONENT
)
6671 if (as
->type
== AS_DEFERRED
)
6674 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6675 the cosubscript addresses the first image. */
6677 sub_cons
= gfc_constructor_first (sub
->value
.constructor
);
6680 for (d
= 1; d
<= as
->corank
; d
++)
6685 gcc_assert (sub_cons
!= NULL
);
6687 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 0, as
,
6689 if (ca_bound
== NULL
)
6692 if (ca_bound
== &gfc_bad_expr
)
6695 cmp
= mpz_cmp (ca_bound
->value
.integer
, sub_cons
->expr
->value
.integer
);
6699 gfc_free_expr (ca_bound
);
6700 sub_cons
= gfc_constructor_next (sub_cons
);
6704 first_image
= false;
6708 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6709 "SUB has %ld and COARRAY lower bound is %ld)",
6711 mpz_get_si (sub_cons
->expr
->value
.integer
),
6712 mpz_get_si (ca_bound
->value
.integer
));
6713 gfc_free_expr (ca_bound
);
6714 return &gfc_bad_expr
;
6717 gfc_free_expr (ca_bound
);
6719 /* Check whether upperbound is valid for the multi-images case. */
6722 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 1, as
,
6724 if (ca_bound
== &gfc_bad_expr
)
6727 if (ca_bound
&& ca_bound
->expr_type
== EXPR_CONSTANT
6728 && mpz_cmp (ca_bound
->value
.integer
,
6729 sub_cons
->expr
->value
.integer
) < 0)
6731 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6732 "SUB has %ld and COARRAY upper bound is %ld)",
6734 mpz_get_si (sub_cons
->expr
->value
.integer
),
6735 mpz_get_si (ca_bound
->value
.integer
));
6736 gfc_free_expr (ca_bound
);
6737 return &gfc_bad_expr
;
6741 gfc_free_expr (ca_bound
);
6744 sub_cons
= gfc_constructor_next (sub_cons
);
6747 gcc_assert (sub_cons
== NULL
);
6749 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
&& !first_image
)
6752 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6753 &gfc_current_locus
);
6755 mpz_set_si (result
->value
.integer
, 1);
6757 mpz_set_si (result
->value
.integer
, 0);
6764 gfc_simplify_this_image (gfc_expr
*coarray
, gfc_expr
*dim
,
6765 gfc_expr
*distance ATTRIBUTE_UNUSED
)
6767 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
6770 /* If no coarray argument has been passed or when the first argument
6771 is actually a distance argment. */
6772 if (coarray
== NULL
|| !gfc_is_coarray (coarray
))
6775 /* FIXME: gfc_current_locus is wrong. */
6776 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6777 &gfc_current_locus
);
6778 mpz_set_si (result
->value
.integer
, 1);
6782 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6783 return simplify_cobound (coarray
, dim
, NULL
, 0);
6788 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6790 return simplify_bound (array
, dim
, kind
, 1);
6794 gfc_simplify_ucobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6796 return simplify_cobound (array
, dim
, kind
, 1);
6801 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
6803 gfc_expr
*result
, *e
;
6804 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
6806 if (!is_constant_array_expr (vector
)
6807 || !is_constant_array_expr (mask
)
6808 || (!gfc_is_constant_expr (field
)
6809 && !is_constant_array_expr (field
)))
6812 result
= gfc_get_array_expr (vector
->ts
.type
, vector
->ts
.kind
,
6814 if (vector
->ts
.type
== BT_DERIVED
)
6815 result
->ts
.u
.derived
= vector
->ts
.u
.derived
;
6816 result
->rank
= mask
->rank
;
6817 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
6819 if (vector
->ts
.type
== BT_CHARACTER
)
6820 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
6822 vector_ctor
= gfc_constructor_first (vector
->value
.constructor
);
6823 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
6825 = field
->expr_type
== EXPR_ARRAY
6826 ? gfc_constructor_first (field
->value
.constructor
)
6831 if (mask_ctor
->expr
->value
.logical
)
6833 gcc_assert (vector_ctor
);
6834 e
= gfc_copy_expr (vector_ctor
->expr
);
6835 vector_ctor
= gfc_constructor_next (vector_ctor
);
6837 else if (field
->expr_type
== EXPR_ARRAY
)
6838 e
= gfc_copy_expr (field_ctor
->expr
);
6840 e
= gfc_copy_expr (field
);
6842 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
6844 mask_ctor
= gfc_constructor_next (mask_ctor
);
6845 field_ctor
= gfc_constructor_next (field_ctor
);
6853 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
6857 size_t index
, len
, lenset
;
6859 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
6862 return &gfc_bad_expr
;
6864 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
6865 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
6868 if (b
!= NULL
&& b
->value
.logical
!= 0)
6873 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &s
->where
);
6875 len
= s
->value
.character
.length
;
6876 lenset
= set
->value
.character
.length
;
6880 mpz_set_ui (result
->value
.integer
, 0);
6888 mpz_set_ui (result
->value
.integer
, 1);
6892 index
= wide_strspn (s
->value
.character
.string
,
6893 set
->value
.character
.string
) + 1;
6902 mpz_set_ui (result
->value
.integer
, len
);
6905 for (index
= len
; index
> 0; index
--)
6907 for (i
= 0; i
< lenset
; i
++)
6909 if (s
->value
.character
.string
[index
- 1]
6910 == set
->value
.character
.string
[i
])
6918 mpz_set_ui (result
->value
.integer
, index
);
6924 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
6929 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6932 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
6937 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
6938 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
6939 return range_check (result
, "XOR");
6942 return gfc_get_logical_expr (kind
, &x
->where
,
6943 (x
->value
.logical
&& !y
->value
.logical
)
6944 || (!x
->value
.logical
&& y
->value
.logical
));
6952 /****************** Constant simplification *****************/
6954 /* Master function to convert one constant to another. While this is
6955 used as a simplification function, it requires the destination type
6956 and kind information which is supplied by a special case in
6960 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
6962 gfc_expr
*g
, *result
, *(*f
) (gfc_expr
*, int);
6977 f
= gfc_int2complex
;
6997 f
= gfc_real2complex
;
7008 f
= gfc_complex2int
;
7011 f
= gfc_complex2real
;
7014 f
= gfc_complex2complex
;
7040 f
= gfc_hollerith2int
;
7044 f
= gfc_hollerith2real
;
7048 f
= gfc_hollerith2complex
;
7052 f
= gfc_hollerith2character
;
7056 f
= gfc_hollerith2logical
;
7066 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
7071 switch (e
->expr_type
)
7074 result
= f (e
, kind
);
7076 return &gfc_bad_expr
;
7080 if (!gfc_is_constant_expr (e
))
7083 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
7084 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
7085 result
->rank
= e
->rank
;
7087 for (c
= gfc_constructor_first (e
->value
.constructor
);
7088 c
; c
= gfc_constructor_next (c
))
7091 if (c
->iterator
== NULL
)
7092 tmp
= f (c
->expr
, kind
);
7095 g
= gfc_convert_constant (c
->expr
, type
, kind
);
7096 if (g
== &gfc_bad_expr
)
7098 gfc_free_expr (result
);
7106 gfc_free_expr (result
);
7110 gfc_constructor_append_expr (&result
->value
.constructor
,
7124 /* Function for converting character constants. */
7126 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
7131 if (!gfc_is_constant_expr (e
))
7134 if (e
->expr_type
== EXPR_CONSTANT
)
7136 /* Simple case of a scalar. */
7137 result
= gfc_get_constant_expr (BT_CHARACTER
, kind
, &e
->where
);
7139 return &gfc_bad_expr
;
7141 result
->value
.character
.length
= e
->value
.character
.length
;
7142 result
->value
.character
.string
7143 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
7144 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
7145 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
7147 /* Check we only have values representable in the destination kind. */
7148 for (i
= 0; i
< result
->value
.character
.length
; i
++)
7149 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
7152 gfc_error ("Character %qs in string at %L cannot be converted "
7153 "into character kind %d",
7154 gfc_print_wide_char (result
->value
.character
.string
[i
]),
7156 return &gfc_bad_expr
;
7161 else if (e
->expr_type
== EXPR_ARRAY
)
7163 /* For an array constructor, we convert each constructor element. */
7166 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
7167 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
7168 result
->rank
= e
->rank
;
7169 result
->ts
.u
.cl
= e
->ts
.u
.cl
;
7171 for (c
= gfc_constructor_first (e
->value
.constructor
);
7172 c
; c
= gfc_constructor_next (c
))
7174 gfc_expr
*tmp
= gfc_convert_char_constant (c
->expr
, type
, kind
);
7175 if (tmp
== &gfc_bad_expr
)
7177 gfc_free_expr (result
);
7178 return &gfc_bad_expr
;
7183 gfc_free_expr (result
);
7187 gfc_constructor_append_expr (&result
->value
.constructor
,
7199 gfc_simplify_compiler_options (void)
7204 str
= gfc_get_option_string ();
7205 result
= gfc_get_character_expr (gfc_default_character_kind
,
7206 &gfc_current_locus
, str
, strlen (str
));
7213 gfc_simplify_compiler_version (void)
7218 len
= strlen ("GCC version ") + strlen (version_string
);
7219 buffer
= XALLOCAVEC (char, len
+ 1);
7220 snprintf (buffer
, len
+ 1, "GCC version %s", version_string
);
7221 return gfc_get_character_expr (gfc_default_character_kind
,
7222 &gfc_current_locus
, buffer
, len
);
7225 /* Simplification routines for intrinsics of IEEE modules. */
7228 simplify_ieee_selected_real_kind (gfc_expr
*expr
)
7230 gfc_actual_arglist
*arg
;
7231 gfc_expr
*p
= NULL
, *q
= NULL
, *rdx
= NULL
;
7233 arg
= expr
->value
.function
.actual
;
7237 q
= arg
->next
->expr
;
7238 if (arg
->next
->next
)
7239 rdx
= arg
->next
->next
->expr
;
7242 /* Currently, if IEEE is supported and this module is built, it means
7243 all our floating-point types conform to IEEE. Hence, we simply handle
7244 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
7245 return gfc_simplify_selected_real_kind (p
, q
, rdx
);
7249 simplify_ieee_support (gfc_expr
*expr
)
7251 /* We consider that if the IEEE modules are loaded, we have full support
7252 for flags, halting and rounding, which are the three functions
7253 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
7254 expressions. One day, we will need libgfortran to detect support and
7255 communicate it back to us, allowing for partial support. */
7257 return gfc_get_logical_expr (gfc_default_logical_kind
, &expr
->where
,
7262 matches_ieee_function_name (gfc_symbol
*sym
, const char *name
)
7264 int n
= strlen(name
);
7266 if (!strncmp(sym
->name
, name
, n
))
7269 /* If a generic was used and renamed, we need more work to find out.
7270 Compare the specific name. */
7271 if (sym
->generic
&& !strncmp(sym
->generic
->sym
->name
, name
, n
))
7278 gfc_simplify_ieee_functions (gfc_expr
*expr
)
7280 gfc_symbol
* sym
= expr
->symtree
->n
.sym
;
7282 if (matches_ieee_function_name(sym
, "ieee_selected_real_kind"))
7283 return simplify_ieee_selected_real_kind (expr
);
7284 else if (matches_ieee_function_name(sym
, "ieee_support_flag")
7285 || matches_ieee_function_name(sym
, "ieee_support_halting")
7286 || matches_ieee_function_name(sym
, "ieee_support_rounding"))
7287 return simplify_ieee_support (expr
);