1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught & Katherine Holcomb
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
27 #include "intrinsic.h"
28 #include "target-memory.h"
30 gfc_expr gfc_bad_expr
;
33 /* Note that 'simplification' is not just transforming expressions.
34 For functions that are not simplified at compile time, range
35 checking is done if possible.
37 The return convention is that each simplification function returns:
39 A new expression node corresponding to the simplified arguments.
40 The original arguments are destroyed by the caller, and must not
41 be a part of the new expression.
43 NULL pointer indicating that no simplification was possible and
44 the original expression should remain intact. If the
45 simplification function sets the type and/or the function name
46 via the pointer gfc_simple_expression, then this type is
49 An expression pointer to gfc_bad_expr (a static placeholder)
50 indicating that some error has prevented simplification. For
51 example, sqrt(-1.0). The error is generated within the function
52 and should be propagated upwards
54 By the time a simplification function gets control, it has been
55 decided that the function call is really supposed to be the
56 intrinsic. No type checking is strictly necessary, since only
57 valid types will be passed on. On the other hand, a simplification
58 subroutine may have to look at the type of an argument as part of
61 Array arguments are never passed to these subroutines.
63 The functions in this file don't have much comment with them, but
64 everything is reasonably straight-forward. The Standard, chapter 13
65 is the best comment you'll find for this file anyway. */
67 /* Range checks an expression node. If all goes well, returns the
68 node, otherwise returns &gfc_bad_expr and frees the node. */
71 range_check (gfc_expr
*result
, const char *name
)
76 switch (gfc_range_check (result
))
82 gfc_error ("Result of %s overflows its kind at %L", name
,
87 gfc_error ("Result of %s underflows its kind at %L", name
,
92 gfc_error ("Result of %s is NaN at %L", name
, &result
->where
);
96 gfc_error ("Result of %s gives range error for its kind at %L", name
,
101 gfc_free_expr (result
);
102 return &gfc_bad_expr
;
106 /* A helper function that gets an optional and possibly missing
107 kind parameter. Returns the kind, -1 if something went wrong. */
110 get_kind (bt type
, gfc_expr
*k
, const char *name
, int default_kind
)
117 if (k
->expr_type
!= EXPR_CONSTANT
)
119 gfc_error ("KIND parameter of %s at %L must be an initialization "
120 "expression", name
, &k
->where
);
124 if (gfc_extract_int (k
, &kind
) != NULL
125 || gfc_validate_kind (type
, kind
, true) < 0)
127 gfc_error ("Invalid KIND parameter of %s at %L", name
, &k
->where
);
135 /* Helper function to get an integer constant with a kind number given
136 by an integer constant expression. */
138 int_expr_with_kind (int i
, gfc_expr
*kind
, const char *name
)
140 gfc_expr
*res
= gfc_int_expr (i
);
141 res
->ts
.kind
= get_kind (BT_INTEGER
, kind
, name
, gfc_default_integer_kind
);
142 if (res
->ts
.kind
== -1)
149 /* Converts an mpz_t signed variable into an unsigned one, assuming
150 two's complement representations and a binary width of bitsize.
151 The conversion is a no-op unless x is negative; otherwise, it can
152 be accomplished by masking out the high bits. */
155 convert_mpz_to_unsigned (mpz_t x
, int bitsize
)
161 /* Confirm that no bits above the signed range are unset. */
162 gcc_assert (mpz_scan0 (x
, bitsize
-1) == ULONG_MAX
);
164 mpz_init_set_ui (mask
, 1);
165 mpz_mul_2exp (mask
, mask
, bitsize
);
166 mpz_sub_ui (mask
, mask
, 1);
168 mpz_and (x
, x
, mask
);
174 /* Confirm that no bits above the signed range are set. */
175 gcc_assert (mpz_scan1 (x
, bitsize
-1) == ULONG_MAX
);
180 /* Converts an mpz_t unsigned variable into a signed one, assuming
181 two's complement representations and a binary width of bitsize.
182 If the bitsize-1 bit is set, this is taken as a sign bit and
183 the number is converted to the corresponding negative number. */
186 convert_mpz_to_signed (mpz_t x
, int bitsize
)
190 /* Confirm that no bits above the unsigned range are set. */
191 gcc_assert (mpz_scan1 (x
, bitsize
) == ULONG_MAX
);
193 if (mpz_tstbit (x
, bitsize
- 1) == 1)
195 mpz_init_set_ui (mask
, 1);
196 mpz_mul_2exp (mask
, mask
, bitsize
);
197 mpz_sub_ui (mask
, mask
, 1);
199 /* We negate the number by hand, zeroing the high bits, that is
200 make it the corresponding positive number, and then have it
201 negated by GMP, giving the correct representation of the
204 mpz_add_ui (x
, x
, 1);
205 mpz_and (x
, x
, mask
);
214 /********************** Simplification functions *****************************/
217 gfc_simplify_abs (gfc_expr
*e
)
221 if (e
->expr_type
!= EXPR_CONSTANT
)
227 result
= gfc_constant_result (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
229 mpz_abs (result
->value
.integer
, e
->value
.integer
);
231 result
= range_check (result
, "IABS");
235 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
237 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
239 result
= range_check (result
, "ABS");
243 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
245 gfc_set_model_kind (e
->ts
.kind
);
247 mpfr_hypot (result
->value
.real
, e
->value
.complex.r
,
248 e
->value
.complex.i
, GFC_RND_MODE
);
249 result
= range_check (result
, "CABS");
253 gfc_internal_error ("gfc_simplify_abs(): Bad type");
261 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
265 bool too_large
= false;
267 if (e
->expr_type
!= EXPR_CONSTANT
)
270 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
272 return &gfc_bad_expr
;
274 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
276 gfc_error ("Argument of %s function at %L is negative", name
,
278 return &gfc_bad_expr
;
281 if (ascii
&& gfc_option
.warn_surprising
282 && mpz_cmp_si (e
->value
.integer
, 127) > 0)
283 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
286 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
291 mpz_init_set_ui (t
, 2);
292 mpz_pow_ui (t
, t
, 32);
293 mpz_sub_ui (t
, t
, 1);
294 if (mpz_cmp (e
->value
.integer
, t
) > 0)
301 gfc_error ("Argument of %s function at %L is too large for the "
302 "collating sequence of kind %d", name
, &e
->where
, kind
);
303 return &gfc_bad_expr
;
306 result
= gfc_constant_result (BT_CHARACTER
, kind
, &e
->where
);
307 result
->value
.character
.string
= gfc_get_wide_string (2);
308 result
->value
.character
.length
= 1;
309 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
310 result
->value
.character
.string
[1] = '\0'; /* For debugger */
316 /* We use the processor's collating sequence, because all
317 systems that gfortran currently works on are ASCII. */
320 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
322 return simplify_achar_char (e
, k
, "ACHAR", true);
327 gfc_simplify_acos (gfc_expr
*x
)
331 if (x
->expr_type
!= EXPR_CONSTANT
)
334 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
335 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
337 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
339 return &gfc_bad_expr
;
342 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
344 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
346 return range_check (result
, "ACOS");
350 gfc_simplify_acosh (gfc_expr
*x
)
354 if (x
->expr_type
!= EXPR_CONSTANT
)
357 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
359 gfc_error ("Argument of ACOSH at %L must not be less than 1",
361 return &gfc_bad_expr
;
364 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
366 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
368 return range_check (result
, "ACOSH");
372 gfc_simplify_adjustl (gfc_expr
*e
)
378 if (e
->expr_type
!= EXPR_CONSTANT
)
381 len
= e
->value
.character
.length
;
383 result
= gfc_constant_result (BT_CHARACTER
, e
->ts
.kind
, &e
->where
);
385 result
->value
.character
.length
= len
;
386 result
->value
.character
.string
= gfc_get_wide_string (len
+ 1);
388 for (count
= 0, i
= 0; i
< len
; ++i
)
390 ch
= e
->value
.character
.string
[i
];
396 for (i
= 0; i
< len
- count
; ++i
)
397 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
399 for (i
= len
- count
; i
< len
; ++i
)
400 result
->value
.character
.string
[i
] = ' ';
402 result
->value
.character
.string
[len
] = '\0'; /* For debugger */
409 gfc_simplify_adjustr (gfc_expr
*e
)
415 if (e
->expr_type
!= EXPR_CONSTANT
)
418 len
= e
->value
.character
.length
;
420 result
= gfc_constant_result (BT_CHARACTER
, e
->ts
.kind
, &e
->where
);
422 result
->value
.character
.length
= len
;
423 result
->value
.character
.string
= gfc_get_wide_string (len
+ 1);
425 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
427 ch
= e
->value
.character
.string
[i
];
433 for (i
= 0; i
< count
; ++i
)
434 result
->value
.character
.string
[i
] = ' ';
436 for (i
= count
; i
< len
; ++i
)
437 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
439 result
->value
.character
.string
[len
] = '\0'; /* For debugger */
446 gfc_simplify_aimag (gfc_expr
*e
)
450 if (e
->expr_type
!= EXPR_CONSTANT
)
453 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
454 mpfr_set (result
->value
.real
, e
->value
.complex.i
, GFC_RND_MODE
);
456 return range_check (result
, "AIMAG");
461 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
463 gfc_expr
*rtrunc
, *result
;
466 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
468 return &gfc_bad_expr
;
470 if (e
->expr_type
!= EXPR_CONSTANT
)
473 rtrunc
= gfc_copy_expr (e
);
475 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
477 result
= gfc_real2real (rtrunc
, kind
);
478 gfc_free_expr (rtrunc
);
480 return range_check (result
, "AINT");
485 gfc_simplify_dint (gfc_expr
*e
)
487 gfc_expr
*rtrunc
, *result
;
489 if (e
->expr_type
!= EXPR_CONSTANT
)
492 rtrunc
= gfc_copy_expr (e
);
494 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
496 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
497 gfc_free_expr (rtrunc
);
499 return range_check (result
, "DINT");
504 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
509 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
511 return &gfc_bad_expr
;
513 if (e
->expr_type
!= EXPR_CONSTANT
)
516 result
= gfc_constant_result (e
->ts
.type
, kind
, &e
->where
);
518 mpfr_round (result
->value
.real
, e
->value
.real
);
520 return range_check (result
, "ANINT");
525 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
530 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
533 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
534 if (x
->ts
.type
== BT_INTEGER
)
536 result
= gfc_constant_result (BT_INTEGER
, kind
, &x
->where
);
537 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
538 return range_check (result
, "AND");
540 else /* BT_LOGICAL */
542 result
= gfc_constant_result (BT_LOGICAL
, kind
, &x
->where
);
543 result
->value
.logical
= x
->value
.logical
&& y
->value
.logical
;
550 gfc_simplify_dnint (gfc_expr
*e
)
554 if (e
->expr_type
!= EXPR_CONSTANT
)
557 result
= gfc_constant_result (BT_REAL
, gfc_default_double_kind
, &e
->where
);
559 mpfr_round (result
->value
.real
, e
->value
.real
);
561 return range_check (result
, "DNINT");
566 gfc_simplify_asin (gfc_expr
*x
)
570 if (x
->expr_type
!= EXPR_CONSTANT
)
573 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
574 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
576 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
578 return &gfc_bad_expr
;
581 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
583 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
585 return range_check (result
, "ASIN");
590 gfc_simplify_asinh (gfc_expr
*x
)
594 if (x
->expr_type
!= EXPR_CONSTANT
)
597 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
599 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
601 return range_check (result
, "ASINH");
606 gfc_simplify_atan (gfc_expr
*x
)
610 if (x
->expr_type
!= EXPR_CONSTANT
)
613 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
615 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
617 return range_check (result
, "ATAN");
622 gfc_simplify_atanh (gfc_expr
*x
)
626 if (x
->expr_type
!= EXPR_CONSTANT
)
629 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
630 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
632 gfc_error ("Argument of ATANH at %L must be inside the range -1 to 1",
634 return &gfc_bad_expr
;
637 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
639 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
641 return range_check (result
, "ATANH");
646 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
650 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
653 if (mpfr_sgn (y
->value
.real
) == 0 && mpfr_sgn (x
->value
.real
) == 0)
655 gfc_error ("If first argument of ATAN2 %L is zero, then the "
656 "second argument must not be zero", &x
->where
);
657 return &gfc_bad_expr
;
660 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
662 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
664 return range_check (result
, "ATAN2");
669 gfc_simplify_bessel_j0 (gfc_expr
*x ATTRIBUTE_UNUSED
)
671 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
674 if (x
->expr_type
!= EXPR_CONSTANT
)
677 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
678 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
680 return range_check (result
, "BESSEL_J0");
688 gfc_simplify_bessel_j1 (gfc_expr
*x ATTRIBUTE_UNUSED
)
690 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
693 if (x
->expr_type
!= EXPR_CONSTANT
)
696 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
697 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
699 return range_check (result
, "BESSEL_J1");
707 gfc_simplify_bessel_jn (gfc_expr
*order ATTRIBUTE_UNUSED
,
708 gfc_expr
*x ATTRIBUTE_UNUSED
)
710 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
714 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
717 n
= mpz_get_si (order
->value
.integer
);
718 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
719 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
721 return range_check (result
, "BESSEL_JN");
729 gfc_simplify_bessel_y0 (gfc_expr
*x ATTRIBUTE_UNUSED
)
731 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
734 if (x
->expr_type
!= EXPR_CONSTANT
)
737 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
738 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
740 return range_check (result
, "BESSEL_Y0");
748 gfc_simplify_bessel_y1 (gfc_expr
*x ATTRIBUTE_UNUSED
)
750 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
753 if (x
->expr_type
!= EXPR_CONSTANT
)
756 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
757 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
759 return range_check (result
, "BESSEL_Y1");
767 gfc_simplify_bessel_yn (gfc_expr
*order ATTRIBUTE_UNUSED
,
768 gfc_expr
*x ATTRIBUTE_UNUSED
)
770 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
774 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
777 n
= mpz_get_si (order
->value
.integer
);
778 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
779 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
781 return range_check (result
, "BESSEL_YN");
789 gfc_simplify_bit_size (gfc_expr
*e
)
794 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
795 result
= gfc_constant_result (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
796 mpz_set_ui (result
->value
.integer
, gfc_integer_kinds
[i
].bit_size
);
803 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
807 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
810 if (gfc_extract_int (bit
, &b
) != NULL
|| b
< 0)
811 return gfc_logical_expr (0, &e
->where
);
813 return gfc_logical_expr (mpz_tstbit (e
->value
.integer
, b
), &e
->where
);
818 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
820 gfc_expr
*ceil
, *result
;
823 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
825 return &gfc_bad_expr
;
827 if (e
->expr_type
!= EXPR_CONSTANT
)
830 result
= gfc_constant_result (BT_INTEGER
, kind
, &e
->where
);
832 ceil
= gfc_copy_expr (e
);
834 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
835 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
);
837 gfc_free_expr (ceil
);
839 return range_check (result
, "CEILING");
844 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
846 return simplify_achar_char (e
, k
, "CHAR", false);
850 /* Common subroutine for simplifying CMPLX and DCMPLX. */
853 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
857 result
= gfc_constant_result (BT_COMPLEX
, kind
, &x
->where
);
859 mpfr_set_ui (result
->value
.complex.i
, 0, GFC_RND_MODE
);
865 mpfr_set_z (result
->value
.complex.r
, x
->value
.integer
, GFC_RND_MODE
);
869 mpfr_set (result
->value
.complex.r
, x
->value
.real
, GFC_RND_MODE
);
873 mpfr_set (result
->value
.complex.r
, x
->value
.complex.r
, GFC_RND_MODE
);
874 mpfr_set (result
->value
.complex.i
, x
->value
.complex.i
, GFC_RND_MODE
);
878 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
887 mpfr_set_z (result
->value
.complex.i
, y
->value
.integer
, GFC_RND_MODE
);
891 mpfr_set (result
->value
.complex.i
, y
->value
.real
, GFC_RND_MODE
);
895 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
904 ts
.kind
= result
->ts
.kind
;
906 if (!gfc_convert_boz (x
, &ts
))
907 return &gfc_bad_expr
;
908 mpfr_set (result
->value
.complex.r
, x
->value
.real
, GFC_RND_MODE
);
915 ts
.kind
= result
->ts
.kind
;
917 if (!gfc_convert_boz (y
, &ts
))
918 return &gfc_bad_expr
;
919 mpfr_set (result
->value
.complex.i
, y
->value
.real
, GFC_RND_MODE
);
922 return range_check (result
, name
);
926 /* Function called when we won't simplify an expression like CMPLX (or
927 COMPLEX or DCMPLX) but still want to convert BOZ arguments. */
930 only_convert_cmplx_boz (gfc_expr
*x
, gfc_expr
*y
, int kind
)
937 if (x
->is_boz
&& !gfc_convert_boz (x
, &ts
))
938 return &gfc_bad_expr
;
940 if (y
&& y
->is_boz
&& !gfc_convert_boz (y
, &ts
))
941 return &gfc_bad_expr
;
948 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
952 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_real_kind
);
954 return &gfc_bad_expr
;
956 if (x
->expr_type
!= EXPR_CONSTANT
957 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
958 return only_convert_cmplx_boz (x
, y
, kind
);
960 return simplify_cmplx ("CMPLX", x
, y
, kind
);
965 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
969 if (x
->ts
.type
== BT_INTEGER
)
971 if (y
->ts
.type
== BT_INTEGER
)
972 kind
= gfc_default_real_kind
;
978 if (y
->ts
.type
== BT_REAL
)
979 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
984 if (x
->expr_type
!= EXPR_CONSTANT
985 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
986 return only_convert_cmplx_boz (x
, y
, kind
);
988 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
993 gfc_simplify_conjg (gfc_expr
*e
)
997 if (e
->expr_type
!= EXPR_CONSTANT
)
1000 result
= gfc_copy_expr (e
);
1001 mpfr_neg (result
->value
.complex.i
, result
->value
.complex.i
, GFC_RND_MODE
);
1003 return range_check (result
, "CONJG");
1008 gfc_simplify_cos (gfc_expr
*x
)
1013 if (x
->expr_type
!= EXPR_CONSTANT
)
1016 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1021 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1024 gfc_set_model_kind (x
->ts
.kind
);
1028 mpfr_cos (xp
, x
->value
.complex.r
, GFC_RND_MODE
);
1029 mpfr_cosh (xq
, x
->value
.complex.i
, GFC_RND_MODE
);
1030 mpfr_mul (result
->value
.complex.r
, xp
, xq
, GFC_RND_MODE
);
1032 mpfr_sin (xp
, x
->value
.complex.r
, GFC_RND_MODE
);
1033 mpfr_sinh (xq
, x
->value
.complex.i
, GFC_RND_MODE
);
1034 mpfr_mul (xp
, xp
, xq
, GFC_RND_MODE
);
1035 mpfr_neg (result
->value
.complex.i
, xp
, GFC_RND_MODE
);
1037 mpfr_clears (xp
, xq
, NULL
);
1040 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1043 return range_check (result
, "COS");
1049 gfc_simplify_cosh (gfc_expr
*x
)
1053 if (x
->expr_type
!= EXPR_CONSTANT
)
1056 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1058 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1060 return range_check (result
, "COSH");
1065 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
1068 if (x
->expr_type
!= EXPR_CONSTANT
1069 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1070 return only_convert_cmplx_boz (x
, y
, gfc_default_double_kind
);
1072 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
1077 gfc_simplify_dble (gfc_expr
*e
)
1079 gfc_expr
*result
= NULL
;
1081 if (e
->expr_type
!= EXPR_CONSTANT
)
1088 result
= gfc_int2real (e
, gfc_default_double_kind
);
1092 result
= gfc_real2real (e
, gfc_default_double_kind
);
1096 result
= gfc_complex2real (e
, gfc_default_double_kind
);
1100 gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e
->where
);
1103 if (e
->ts
.type
== BT_INTEGER
&& e
->is_boz
)
1108 ts
.kind
= gfc_default_double_kind
;
1109 result
= gfc_copy_expr (e
);
1110 if (!gfc_convert_boz (result
, &ts
))
1112 gfc_free_expr (result
);
1113 return &gfc_bad_expr
;
1117 return range_check (result
, "DBLE");
1122 gfc_simplify_digits (gfc_expr
*x
)
1126 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
1130 digits
= gfc_integer_kinds
[i
].digits
;
1135 digits
= gfc_real_kinds
[i
].digits
;
1142 return gfc_int_expr (digits
);
1147 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
1152 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1155 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1156 result
= gfc_constant_result (x
->ts
.type
, kind
, &x
->where
);
1161 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
1162 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1164 mpz_set_ui (result
->value
.integer
, 0);
1169 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
1170 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
1173 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
1178 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1181 return range_check (result
, "DIM");
1186 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
1188 gfc_expr
*a1
, *a2
, *result
;
1190 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1193 result
= gfc_constant_result (BT_REAL
, gfc_default_double_kind
, &x
->where
);
1195 a1
= gfc_real2real (x
, gfc_default_double_kind
);
1196 a2
= gfc_real2real (y
, gfc_default_double_kind
);
1198 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
1203 return range_check (result
, "DPROD");
1208 gfc_simplify_erf (gfc_expr
*x
)
1212 if (x
->expr_type
!= EXPR_CONSTANT
)
1215 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1217 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1219 return range_check (result
, "ERF");
1224 gfc_simplify_erfc (gfc_expr
*x
)
1228 if (x
->expr_type
!= EXPR_CONSTANT
)
1231 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1233 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1235 return range_check (result
, "ERFC");
1240 gfc_simplify_epsilon (gfc_expr
*e
)
1245 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1247 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
1249 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
1251 return range_check (result
, "EPSILON");
1256 gfc_simplify_exp (gfc_expr
*x
)
1261 if (x
->expr_type
!= EXPR_CONSTANT
)
1264 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1269 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1273 gfc_set_model_kind (x
->ts
.kind
);
1276 mpfr_exp (xq
, x
->value
.complex.r
, GFC_RND_MODE
);
1277 mpfr_cos (xp
, x
->value
.complex.i
, GFC_RND_MODE
);
1278 mpfr_mul (result
->value
.complex.r
, xq
, xp
, GFC_RND_MODE
);
1279 mpfr_sin (xp
, x
->value
.complex.i
, GFC_RND_MODE
);
1280 mpfr_mul (result
->value
.complex.i
, xq
, xp
, GFC_RND_MODE
);
1281 mpfr_clears (xp
, xq
, NULL
);
1285 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
1288 return range_check (result
, "EXP");
1292 gfc_simplify_exponent (gfc_expr
*x
)
1297 if (x
->expr_type
!= EXPR_CONSTANT
)
1300 result
= gfc_constant_result (BT_INTEGER
, gfc_default_integer_kind
,
1303 gfc_set_model (x
->value
.real
);
1305 if (mpfr_sgn (x
->value
.real
) == 0)
1307 mpz_set_ui (result
->value
.integer
, 0);
1311 i
= (int) mpfr_get_exp (x
->value
.real
);
1312 mpz_set_si (result
->value
.integer
, i
);
1314 return range_check (result
, "EXPONENT");
1319 gfc_simplify_float (gfc_expr
*a
)
1323 if (a
->expr_type
!= EXPR_CONSTANT
)
1332 ts
.kind
= gfc_default_real_kind
;
1334 result
= gfc_copy_expr (a
);
1335 if (!gfc_convert_boz (result
, &ts
))
1337 gfc_free_expr (result
);
1338 return &gfc_bad_expr
;
1342 result
= gfc_int2real (a
, gfc_default_real_kind
);
1343 return range_check (result
, "FLOAT");
1348 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
1354 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
1356 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
1358 if (e
->expr_type
!= EXPR_CONSTANT
)
1361 result
= gfc_constant_result (BT_INTEGER
, kind
, &e
->where
);
1363 gfc_set_model_kind (kind
);
1365 mpfr_floor (floor
, e
->value
.real
);
1367 gfc_mpfr_to_mpz (result
->value
.integer
, floor
);
1371 return range_check (result
, "FLOOR");
1376 gfc_simplify_fraction (gfc_expr
*x
)
1379 mpfr_t absv
, exp
, pow2
;
1381 if (x
->expr_type
!= EXPR_CONSTANT
)
1384 result
= gfc_constant_result (BT_REAL
, x
->ts
.kind
, &x
->where
);
1386 if (mpfr_sgn (x
->value
.real
) == 0)
1388 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
1392 gfc_set_model_kind (x
->ts
.kind
);
1397 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
1398 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
1400 mpfr_trunc (exp
, exp
);
1401 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
1403 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
1405 mpfr_div (result
->value
.real
, absv
, pow2
, GFC_RND_MODE
);
1407 mpfr_clears (exp
, absv
, pow2
, NULL
);
1409 return range_check (result
, "FRACTION");
1414 gfc_simplify_gamma (gfc_expr
*x
)
1418 if (x
->expr_type
!= EXPR_CONSTANT
)
1421 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1423 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1425 return range_check (result
, "GAMMA");
1430 gfc_simplify_huge (gfc_expr
*e
)
1435 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1437 result
= gfc_constant_result (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
1442 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
1446 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
1458 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
1462 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1465 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1466 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
1467 return range_check (result
, "HYPOT");
1471 /* We use the processor's collating sequence, because all
1472 systems that gfortran currently works on are ASCII. */
1475 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
1480 if (e
->expr_type
!= EXPR_CONSTANT
)
1483 if (e
->value
.character
.length
!= 1)
1485 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
1486 return &gfc_bad_expr
;
1489 index
= e
->value
.character
.string
[0];
1491 if (gfc_option
.warn_surprising
&& index
> 127)
1492 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
1495 if ((result
= int_expr_with_kind (index
, kind
, "IACHAR")) == NULL
)
1496 return &gfc_bad_expr
;
1498 result
->where
= e
->where
;
1500 return range_check (result
, "IACHAR");
1505 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
1509 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1512 result
= gfc_constant_result (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
1514 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1516 return range_check (result
, "IAND");
1521 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
1526 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1529 if (gfc_extract_int (y
, &pos
) != NULL
|| pos
< 0)
1531 gfc_error ("Invalid second argument of IBCLR at %L", &y
->where
);
1532 return &gfc_bad_expr
;
1535 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
1537 if (pos
>= gfc_integer_kinds
[k
].bit_size
)
1539 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
1541 return &gfc_bad_expr
;
1544 result
= gfc_copy_expr (x
);
1546 convert_mpz_to_unsigned (result
->value
.integer
,
1547 gfc_integer_kinds
[k
].bit_size
);
1549 mpz_clrbit (result
->value
.integer
, pos
);
1551 convert_mpz_to_signed (result
->value
.integer
,
1552 gfc_integer_kinds
[k
].bit_size
);
1559 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
1566 if (x
->expr_type
!= EXPR_CONSTANT
1567 || y
->expr_type
!= EXPR_CONSTANT
1568 || z
->expr_type
!= EXPR_CONSTANT
)
1571 if (gfc_extract_int (y
, &pos
) != NULL
|| pos
< 0)
1573 gfc_error ("Invalid second argument of IBITS at %L", &y
->where
);
1574 return &gfc_bad_expr
;
1577 if (gfc_extract_int (z
, &len
) != NULL
|| len
< 0)
1579 gfc_error ("Invalid third argument of IBITS at %L", &z
->where
);
1580 return &gfc_bad_expr
;
1583 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
1585 bitsize
= gfc_integer_kinds
[k
].bit_size
;
1587 if (pos
+ len
> bitsize
)
1589 gfc_error ("Sum of second and third arguments of IBITS exceeds "
1590 "bit size at %L", &y
->where
);
1591 return &gfc_bad_expr
;
1594 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1595 convert_mpz_to_unsigned (result
->value
.integer
,
1596 gfc_integer_kinds
[k
].bit_size
);
1598 bits
= gfc_getmem (bitsize
* sizeof (int));
1600 for (i
= 0; i
< bitsize
; i
++)
1603 for (i
= 0; i
< len
; i
++)
1604 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
1606 for (i
= 0; i
< bitsize
; i
++)
1609 mpz_clrbit (result
->value
.integer
, i
);
1610 else if (bits
[i
] == 1)
1611 mpz_setbit (result
->value
.integer
, i
);
1613 gfc_internal_error ("IBITS: Bad bit");
1618 convert_mpz_to_signed (result
->value
.integer
,
1619 gfc_integer_kinds
[k
].bit_size
);
1626 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
1631 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1634 if (gfc_extract_int (y
, &pos
) != NULL
|| pos
< 0)
1636 gfc_error ("Invalid second argument of IBSET at %L", &y
->where
);
1637 return &gfc_bad_expr
;
1640 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
1642 if (pos
>= gfc_integer_kinds
[k
].bit_size
)
1644 gfc_error ("Second argument of IBSET exceeds bit size at %L",
1646 return &gfc_bad_expr
;
1649 result
= gfc_copy_expr (x
);
1651 convert_mpz_to_unsigned (result
->value
.integer
,
1652 gfc_integer_kinds
[k
].bit_size
);
1654 mpz_setbit (result
->value
.integer
, pos
);
1656 convert_mpz_to_signed (result
->value
.integer
,
1657 gfc_integer_kinds
[k
].bit_size
);
1664 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
1669 if (e
->expr_type
!= EXPR_CONSTANT
)
1672 if (e
->value
.character
.length
!= 1)
1674 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
1675 return &gfc_bad_expr
;
1678 index
= e
->value
.character
.string
[0];
1680 if ((result
= int_expr_with_kind (index
, kind
, "ICHAR")) == NULL
)
1681 return &gfc_bad_expr
;
1683 result
->where
= e
->where
;
1684 return range_check (result
, "ICHAR");
1689 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
1693 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1696 result
= gfc_constant_result (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
1698 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1700 return range_check (result
, "IEOR");
1705 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
1708 int back
, len
, lensub
;
1709 int i
, j
, k
, count
, index
= 0, start
;
1711 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
1712 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
1715 if (b
!= NULL
&& b
->value
.logical
!= 0)
1720 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
1722 return &gfc_bad_expr
;
1724 result
= gfc_constant_result (BT_INTEGER
, k
, &x
->where
);
1726 len
= x
->value
.character
.length
;
1727 lensub
= y
->value
.character
.length
;
1731 mpz_set_si (result
->value
.integer
, 0);
1739 mpz_set_si (result
->value
.integer
, 1);
1742 else if (lensub
== 1)
1744 for (i
= 0; i
< len
; i
++)
1746 for (j
= 0; j
< lensub
; j
++)
1748 if (y
->value
.character
.string
[j
]
1749 == x
->value
.character
.string
[i
])
1759 for (i
= 0; i
< len
; i
++)
1761 for (j
= 0; j
< lensub
; j
++)
1763 if (y
->value
.character
.string
[j
]
1764 == x
->value
.character
.string
[i
])
1769 for (k
= 0; k
< lensub
; k
++)
1771 if (y
->value
.character
.string
[k
]
1772 == x
->value
.character
.string
[k
+ start
])
1776 if (count
== lensub
)
1791 mpz_set_si (result
->value
.integer
, len
+ 1);
1794 else if (lensub
== 1)
1796 for (i
= 0; i
< len
; i
++)
1798 for (j
= 0; j
< lensub
; j
++)
1800 if (y
->value
.character
.string
[j
]
1801 == x
->value
.character
.string
[len
- i
])
1803 index
= len
- i
+ 1;
1811 for (i
= 0; i
< len
; i
++)
1813 for (j
= 0; j
< lensub
; j
++)
1815 if (y
->value
.character
.string
[j
]
1816 == x
->value
.character
.string
[len
- i
])
1819 if (start
<= len
- lensub
)
1822 for (k
= 0; k
< lensub
; k
++)
1823 if (y
->value
.character
.string
[k
]
1824 == x
->value
.character
.string
[k
+ start
])
1827 if (count
== lensub
)
1844 mpz_set_si (result
->value
.integer
, index
);
1845 return range_check (result
, "INDEX");
1850 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
1852 gfc_expr
*result
= NULL
;
1855 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
1857 return &gfc_bad_expr
;
1859 if (e
->expr_type
!= EXPR_CONSTANT
)
1865 result
= gfc_int2int (e
, kind
);
1869 result
= gfc_real2int (e
, kind
);
1873 result
= gfc_complex2int (e
, kind
);
1877 gfc_error ("Argument of INT at %L is not a valid type", &e
->where
);
1878 return &gfc_bad_expr
;
1881 return range_check (result
, "INT");
1886 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
1888 gfc_expr
*result
= NULL
;
1890 if (e
->expr_type
!= EXPR_CONSTANT
)
1896 result
= gfc_int2int (e
, kind
);
1900 result
= gfc_real2int (e
, kind
);
1904 result
= gfc_complex2int (e
, kind
);
1908 gfc_error ("Argument of %s at %L is not a valid type", name
, &e
->where
);
1909 return &gfc_bad_expr
;
1912 return range_check (result
, name
);
1917 gfc_simplify_int2 (gfc_expr
*e
)
1919 return simplify_intconv (e
, 2, "INT2");
1924 gfc_simplify_int8 (gfc_expr
*e
)
1926 return simplify_intconv (e
, 8, "INT8");
1931 gfc_simplify_long (gfc_expr
*e
)
1933 return simplify_intconv (e
, 4, "LONG");
1938 gfc_simplify_ifix (gfc_expr
*e
)
1940 gfc_expr
*rtrunc
, *result
;
1942 if (e
->expr_type
!= EXPR_CONSTANT
)
1945 result
= gfc_constant_result (BT_INTEGER
, gfc_default_integer_kind
,
1948 rtrunc
= gfc_copy_expr (e
);
1950 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
1951 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
);
1953 gfc_free_expr (rtrunc
);
1954 return range_check (result
, "IFIX");
1959 gfc_simplify_idint (gfc_expr
*e
)
1961 gfc_expr
*rtrunc
, *result
;
1963 if (e
->expr_type
!= EXPR_CONSTANT
)
1966 result
= gfc_constant_result (BT_INTEGER
, gfc_default_integer_kind
,
1969 rtrunc
= gfc_copy_expr (e
);
1971 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
1972 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
);
1974 gfc_free_expr (rtrunc
);
1975 return range_check (result
, "IDINT");
1980 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
1984 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1987 result
= gfc_constant_result (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
1989 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1990 return range_check (result
, "IOR");
1995 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
1998 int shift
, ashift
, isize
, k
, *bits
, i
;
2000 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
2003 if (gfc_extract_int (s
, &shift
) != NULL
)
2005 gfc_error ("Invalid second argument of ISHFT at %L", &s
->where
);
2006 return &gfc_bad_expr
;
2009 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
2011 isize
= gfc_integer_kinds
[k
].bit_size
;
2020 gfc_error ("Magnitude of second argument of ISHFT exceeds bit size "
2021 "at %L", &s
->where
);
2022 return &gfc_bad_expr
;
2025 result
= gfc_constant_result (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2029 mpz_set (result
->value
.integer
, e
->value
.integer
);
2030 return range_check (result
, "ISHFT");
2033 bits
= gfc_getmem (isize
* sizeof (int));
2035 for (i
= 0; i
< isize
; i
++)
2036 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
2040 for (i
= 0; i
< shift
; i
++)
2041 mpz_clrbit (result
->value
.integer
, i
);
2043 for (i
= 0; i
< isize
- shift
; i
++)
2046 mpz_clrbit (result
->value
.integer
, i
+ shift
);
2048 mpz_setbit (result
->value
.integer
, i
+ shift
);
2053 for (i
= isize
- 1; i
>= isize
- ashift
; i
--)
2054 mpz_clrbit (result
->value
.integer
, i
);
2056 for (i
= isize
- 1; i
>= ashift
; i
--)
2059 mpz_clrbit (result
->value
.integer
, i
- ashift
);
2061 mpz_setbit (result
->value
.integer
, i
- ashift
);
2065 convert_mpz_to_signed (result
->value
.integer
, isize
);
2073 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
2076 int shift
, ashift
, isize
, ssize
, delta
, k
;
2079 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
2082 if (gfc_extract_int (s
, &shift
) != NULL
)
2084 gfc_error ("Invalid second argument of ISHFTC at %L", &s
->where
);
2085 return &gfc_bad_expr
;
2088 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2089 isize
= gfc_integer_kinds
[k
].bit_size
;
2093 if (sz
->expr_type
!= EXPR_CONSTANT
)
2096 if (gfc_extract_int (sz
, &ssize
) != NULL
|| ssize
<= 0)
2098 gfc_error ("Invalid third argument of ISHFTC at %L", &sz
->where
);
2099 return &gfc_bad_expr
;
2104 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
2105 "BIT_SIZE of first argument at %L", &s
->where
);
2106 return &gfc_bad_expr
;
2120 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2121 "third argument at %L", &s
->where
);
2123 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2124 "BIT_SIZE of first argument at %L", &s
->where
);
2125 return &gfc_bad_expr
;
2128 result
= gfc_constant_result (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2130 mpz_set (result
->value
.integer
, e
->value
.integer
);
2135 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
2137 bits
= gfc_getmem (ssize
* sizeof (int));
2139 for (i
= 0; i
< ssize
; i
++)
2140 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
2142 delta
= ssize
- ashift
;
2146 for (i
= 0; i
< delta
; i
++)
2149 mpz_clrbit (result
->value
.integer
, i
+ shift
);
2151 mpz_setbit (result
->value
.integer
, i
+ shift
);
2154 for (i
= delta
; i
< ssize
; i
++)
2157 mpz_clrbit (result
->value
.integer
, i
- delta
);
2159 mpz_setbit (result
->value
.integer
, i
- delta
);
2164 for (i
= 0; i
< ashift
; i
++)
2167 mpz_clrbit (result
->value
.integer
, i
+ delta
);
2169 mpz_setbit (result
->value
.integer
, i
+ delta
);
2172 for (i
= ashift
; i
< ssize
; i
++)
2175 mpz_clrbit (result
->value
.integer
, i
+ shift
);
2177 mpz_setbit (result
->value
.integer
, i
+ shift
);
2181 convert_mpz_to_signed (result
->value
.integer
, isize
);
2189 gfc_simplify_kind (gfc_expr
*e
)
2192 if (e
->ts
.type
== BT_DERIVED
)
2194 gfc_error ("Argument of KIND at %L is a DERIVED type", &e
->where
);
2195 return &gfc_bad_expr
;
2198 return gfc_int_expr (e
->ts
.kind
);
2203 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
2206 gfc_expr
*l
, *u
, *result
;
2209 /* The last dimension of an assumed-size array is special. */
2210 if (d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
2212 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
2213 return gfc_copy_expr (as
->lower
[d
-1]);
2218 /* Then, we need to know the extent of the given dimension. */
2222 if (l
->expr_type
!= EXPR_CONSTANT
|| u
->expr_type
!= EXPR_CONSTANT
)
2225 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
2226 gfc_default_integer_kind
);
2228 return &gfc_bad_expr
;
2230 result
= gfc_constant_result (BT_INTEGER
, k
, &array
->where
);
2232 if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
2236 mpz_set_si (result
->value
.integer
, 0);
2238 mpz_set_si (result
->value
.integer
, 1);
2242 /* Nonzero extent. */
2244 mpz_set (result
->value
.integer
, u
->value
.integer
);
2246 mpz_set (result
->value
.integer
, l
->value
.integer
);
2249 return range_check (result
, upper
? "UBOUND" : "LBOUND");
2254 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
2260 if (array
->expr_type
!= EXPR_VARIABLE
)
2263 /* Follow any component references. */
2264 as
= array
->symtree
->n
.sym
->as
;
2265 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
2270 switch (ref
->u
.ar
.type
)
2277 /* We're done because 'as' has already been set in the
2278 previous iteration. */
2289 as
= ref
->u
.c
.component
->as
;
2301 if (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_SHAPE
)
2306 /* Multi-dimensional bounds. */
2307 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
2309 gfc_constructor
*head
, *tail
;
2312 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
2313 if (upper
&& as
->type
== AS_ASSUMED_SIZE
)
2315 /* An error message will be emitted in
2316 check_assumed_size_reference (resolve.c). */
2317 return &gfc_bad_expr
;
2320 /* Simplify the bounds for each dimension. */
2321 for (d
= 0; d
< array
->rank
; d
++)
2323 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
);
2324 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
2328 for (j
= 0; j
< d
; j
++)
2329 gfc_free_expr (bounds
[j
]);
2334 /* Allocate the result expression. */
2335 e
= gfc_get_expr ();
2336 e
->where
= array
->where
;
2337 e
->expr_type
= EXPR_ARRAY
;
2338 e
->ts
.type
= BT_INTEGER
;
2339 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
2340 gfc_default_integer_kind
);
2344 return &gfc_bad_expr
;
2348 /* The result is a rank 1 array; its size is the rank of the first
2349 argument to {L,U}BOUND. */
2351 e
->shape
= gfc_get_shape (1);
2352 mpz_init_set_ui (e
->shape
[0], array
->rank
);
2354 /* Create the constructor for this array. */
2356 for (d
= 0; d
< array
->rank
; d
++)
2358 /* Get a new constructor element. */
2360 head
= tail
= gfc_get_constructor ();
2363 tail
->next
= gfc_get_constructor ();
2367 tail
->where
= e
->where
;
2368 tail
->expr
= bounds
[d
];
2370 e
->value
.constructor
= head
;
2376 /* A DIM argument is specified. */
2377 if (dim
->expr_type
!= EXPR_CONSTANT
)
2380 d
= mpz_get_si (dim
->value
.integer
);
2382 if (d
< 1 || d
> as
->rank
2383 || (d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
2385 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
2386 return &gfc_bad_expr
;
2389 return simplify_bound_dim (array
, kind
, d
, upper
, as
);
2395 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
2397 return simplify_bound (array
, dim
, kind
, 0);
2402 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
2405 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
2408 return &gfc_bad_expr
;
2410 if (e
->expr_type
== EXPR_CONSTANT
)
2412 result
= gfc_constant_result (BT_INTEGER
, k
, &e
->where
);
2413 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
2414 return range_check (result
, "LEN");
2417 if (e
->ts
.cl
!= NULL
&& e
->ts
.cl
->length
!= NULL
2418 && e
->ts
.cl
->length
->expr_type
== EXPR_CONSTANT
2419 && e
->ts
.cl
->length
->ts
.type
== BT_INTEGER
)
2421 result
= gfc_constant_result (BT_INTEGER
, k
, &e
->where
);
2422 mpz_set (result
->value
.integer
, e
->ts
.cl
->length
->value
.integer
);
2423 return range_check (result
, "LEN");
2431 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
2434 int count
, len
, lentrim
, i
;
2435 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
2438 return &gfc_bad_expr
;
2440 if (e
->expr_type
!= EXPR_CONSTANT
)
2443 result
= gfc_constant_result (BT_INTEGER
, k
, &e
->where
);
2444 len
= e
->value
.character
.length
;
2446 for (count
= 0, i
= 1; i
<= len
; i
++)
2447 if (e
->value
.character
.string
[len
- i
] == ' ')
2452 lentrim
= len
- count
;
2454 mpz_set_si (result
->value
.integer
, lentrim
);
2455 return range_check (result
, "LEN_TRIM");
2459 gfc_simplify_lgamma (gfc_expr
*x ATTRIBUTE_UNUSED
)
2461 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
2465 if (x
->expr_type
!= EXPR_CONSTANT
)
2468 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2470 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
2472 return range_check (result
, "LGAMMA");
2480 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
2482 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
2485 return gfc_logical_expr (gfc_compare_string (a
, b
) >= 0, &a
->where
);
2490 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
2492 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
2495 return gfc_logical_expr (gfc_compare_string (a
, b
) > 0,
2501 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
2503 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
2506 return gfc_logical_expr (gfc_compare_string (a
, b
) <= 0, &a
->where
);
2511 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
2513 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
2516 return gfc_logical_expr (gfc_compare_string (a
, b
) < 0, &a
->where
);
2521 gfc_simplify_log (gfc_expr
*x
)
2526 if (x
->expr_type
!= EXPR_CONSTANT
)
2529 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2535 if (mpfr_sgn (x
->value
.real
) <= 0)
2537 gfc_error ("Argument of LOG at %L cannot be less than or equal "
2538 "to zero", &x
->where
);
2539 gfc_free_expr (result
);
2540 return &gfc_bad_expr
;
2543 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2547 if ((mpfr_sgn (x
->value
.complex.r
) == 0)
2548 && (mpfr_sgn (x
->value
.complex.i
) == 0))
2550 gfc_error ("Complex argument of LOG at %L cannot be zero",
2552 gfc_free_expr (result
);
2553 return &gfc_bad_expr
;
2556 gfc_set_model_kind (x
->ts
.kind
);
2560 mpfr_atan2 (result
->value
.complex.i
, x
->value
.complex.i
,
2561 x
->value
.complex.r
, GFC_RND_MODE
);
2563 mpfr_mul (xr
, x
->value
.complex.r
, x
->value
.complex.r
, GFC_RND_MODE
);
2564 mpfr_mul (xi
, x
->value
.complex.i
, x
->value
.complex.i
, GFC_RND_MODE
);
2565 mpfr_add (xr
, xr
, xi
, GFC_RND_MODE
);
2566 mpfr_sqrt (xr
, xr
, GFC_RND_MODE
);
2567 mpfr_log (result
->value
.complex.r
, xr
, GFC_RND_MODE
);
2569 mpfr_clears (xr
, xi
, NULL
);
2574 gfc_internal_error ("gfc_simplify_log: bad type");
2577 return range_check (result
, "LOG");
2582 gfc_simplify_log10 (gfc_expr
*x
)
2586 if (x
->expr_type
!= EXPR_CONSTANT
)
2589 if (mpfr_sgn (x
->value
.real
) <= 0)
2591 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
2592 "to zero", &x
->where
);
2593 return &gfc_bad_expr
;
2596 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2598 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2600 return range_check (result
, "LOG10");
2605 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
2610 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
2612 return &gfc_bad_expr
;
2614 if (e
->expr_type
!= EXPR_CONSTANT
)
2617 result
= gfc_constant_result (BT_LOGICAL
, kind
, &e
->where
);
2619 result
->value
.logical
= e
->value
.logical
;
2625 /* This function is special since MAX() can take any number of
2626 arguments. The simplified expression is a rewritten version of the
2627 argument list containing at most one constant element. Other
2628 constant elements are deleted. Because the argument list has
2629 already been checked, this function always succeeds. sign is 1 for
2630 MAX(), -1 for MIN(). */
2633 simplify_min_max (gfc_expr
*expr
, int sign
)
2635 gfc_actual_arglist
*arg
, *last
, *extremum
;
2636 gfc_intrinsic_sym
* specific
;
2640 specific
= expr
->value
.function
.isym
;
2642 arg
= expr
->value
.function
.actual
;
2644 for (; arg
; last
= arg
, arg
= arg
->next
)
2646 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
2649 if (extremum
== NULL
)
2655 switch (arg
->expr
->ts
.type
)
2658 if (mpz_cmp (arg
->expr
->value
.integer
,
2659 extremum
->expr
->value
.integer
) * sign
> 0)
2660 mpz_set (extremum
->expr
->value
.integer
, arg
->expr
->value
.integer
);
2664 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
2666 mpfr_max (extremum
->expr
->value
.real
, extremum
->expr
->value
.real
,
2667 arg
->expr
->value
.real
, GFC_RND_MODE
);
2669 mpfr_min (extremum
->expr
->value
.real
, extremum
->expr
->value
.real
,
2670 arg
->expr
->value
.real
, GFC_RND_MODE
);
2674 #define LENGTH(x) ((x)->expr->value.character.length)
2675 #define STRING(x) ((x)->expr->value.character.string)
2676 if (LENGTH(extremum
) < LENGTH(arg
))
2678 gfc_char_t
*tmp
= STRING(extremum
);
2680 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
2681 memcpy (STRING(extremum
), tmp
,
2682 LENGTH(extremum
) * sizeof (gfc_char_t
));
2683 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
2684 LENGTH(arg
) - LENGTH(extremum
));
2685 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
2686 LENGTH(extremum
) = LENGTH(arg
);
2690 if (gfc_compare_string (arg
->expr
, extremum
->expr
) * sign
> 0)
2692 gfc_free (STRING(extremum
));
2693 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
2694 memcpy (STRING(extremum
), STRING(arg
),
2695 LENGTH(arg
) * sizeof (gfc_char_t
));
2696 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
2697 LENGTH(extremum
) - LENGTH(arg
));
2698 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
2706 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
2709 /* Delete the extra constant argument. */
2711 expr
->value
.function
.actual
= arg
->next
;
2713 last
->next
= arg
->next
;
2716 gfc_free_actual_arglist (arg
);
2720 /* If there is one value left, replace the function call with the
2722 if (expr
->value
.function
.actual
->next
!= NULL
)
2725 /* Convert to the correct type and kind. */
2726 if (expr
->ts
.type
!= BT_UNKNOWN
)
2727 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
2728 expr
->ts
.type
, expr
->ts
.kind
);
2730 if (specific
->ts
.type
!= BT_UNKNOWN
)
2731 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
2732 specific
->ts
.type
, specific
->ts
.kind
);
2734 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
2739 gfc_simplify_min (gfc_expr
*e
)
2741 return simplify_min_max (e
, -1);
2746 gfc_simplify_max (gfc_expr
*e
)
2748 return simplify_min_max (e
, 1);
2753 gfc_simplify_maxexponent (gfc_expr
*x
)
2758 i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
2760 result
= gfc_int_expr (gfc_real_kinds
[i
].max_exponent
);
2761 result
->where
= x
->where
;
2768 gfc_simplify_minexponent (gfc_expr
*x
)
2773 i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
2775 result
= gfc_int_expr (gfc_real_kinds
[i
].min_exponent
);
2776 result
->where
= x
->where
;
2783 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
2789 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
2792 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
2793 result
= gfc_constant_result (a
->ts
.type
, kind
, &a
->where
);
2798 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
2800 /* Result is processor-dependent. */
2801 gfc_error ("Second argument MOD at %L is zero", &a
->where
);
2802 gfc_free_expr (result
);
2803 return &gfc_bad_expr
;
2805 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
2809 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
2811 /* Result is processor-dependent. */
2812 gfc_error ("Second argument of MOD at %L is zero", &p
->where
);
2813 gfc_free_expr (result
);
2814 return &gfc_bad_expr
;
2817 gfc_set_model_kind (kind
);
2819 mpfr_div (tmp
, a
->value
.real
, p
->value
.real
, GFC_RND_MODE
);
2820 mpfr_trunc (tmp
, tmp
);
2821 mpfr_mul (tmp
, tmp
, p
->value
.real
, GFC_RND_MODE
);
2822 mpfr_sub (result
->value
.real
, a
->value
.real
, tmp
, GFC_RND_MODE
);
2827 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
2830 return range_check (result
, "MOD");
2835 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
2841 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
2844 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
2845 result
= gfc_constant_result (a
->ts
.type
, kind
, &a
->where
);
2850 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
2852 /* Result is processor-dependent. This processor just opts
2853 to not handle it at all. */
2854 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
2855 gfc_free_expr (result
);
2856 return &gfc_bad_expr
;
2858 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
2863 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
2865 /* Result is processor-dependent. */
2866 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
2867 gfc_free_expr (result
);
2868 return &gfc_bad_expr
;
2871 gfc_set_model_kind (kind
);
2873 mpfr_div (tmp
, a
->value
.real
, p
->value
.real
, GFC_RND_MODE
);
2874 mpfr_floor (tmp
, tmp
);
2875 mpfr_mul (tmp
, tmp
, p
->value
.real
, GFC_RND_MODE
);
2876 mpfr_sub (result
->value
.real
, a
->value
.real
, tmp
, GFC_RND_MODE
);
2881 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
2884 return range_check (result
, "MODULO");
2888 /* Exists for the sole purpose of consistency with other intrinsics. */
2890 gfc_simplify_mvbits (gfc_expr
*f ATTRIBUTE_UNUSED
,
2891 gfc_expr
*fp ATTRIBUTE_UNUSED
,
2892 gfc_expr
*l ATTRIBUTE_UNUSED
,
2893 gfc_expr
*to ATTRIBUTE_UNUSED
,
2894 gfc_expr
*tp ATTRIBUTE_UNUSED
)
2901 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
2904 mp_exp_t emin
, emax
;
2907 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
2910 if (mpfr_sgn (s
->value
.real
) == 0)
2912 gfc_error ("Second argument of NEAREST at %L shall not be zero",
2914 return &gfc_bad_expr
;
2917 result
= gfc_copy_expr (x
);
2919 /* Save current values of emin and emax. */
2920 emin
= mpfr_get_emin ();
2921 emax
= mpfr_get_emax ();
2923 /* Set emin and emax for the current model number. */
2924 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
2925 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
2926 mpfr_get_prec(result
->value
.real
) + 1);
2927 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
2929 if (mpfr_sgn (s
->value
.real
) > 0)
2931 mpfr_nextabove (result
->value
.real
);
2932 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
2936 mpfr_nextbelow (result
->value
.real
);
2937 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
2940 mpfr_set_emin (emin
);
2941 mpfr_set_emax (emax
);
2943 /* Only NaN can occur. Do not use range check as it gives an
2944 error for denormal numbers. */
2945 if (mpfr_nan_p (result
->value
.real
) && gfc_option
.flag_range_check
)
2947 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
2948 gfc_free_expr (result
);
2949 return &gfc_bad_expr
;
2957 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
2959 gfc_expr
*itrunc
, *result
;
2962 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
2964 return &gfc_bad_expr
;
2966 if (e
->expr_type
!= EXPR_CONSTANT
)
2969 result
= gfc_constant_result (BT_INTEGER
, kind
, &e
->where
);
2971 itrunc
= gfc_copy_expr (e
);
2973 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
2975 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
);
2977 gfc_free_expr (itrunc
);
2979 return range_check (result
, name
);
2984 gfc_simplify_new_line (gfc_expr
*e
)
2988 result
= gfc_constant_result (BT_CHARACTER
, e
->ts
.kind
, &e
->where
);
2989 result
->value
.character
.string
= gfc_get_wide_string (2);
2990 result
->value
.character
.length
= 1;
2991 result
->value
.character
.string
[0] = '\n';
2992 result
->value
.character
.string
[1] = '\0'; /* For debugger */
2998 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
3000 return simplify_nint ("NINT", e
, k
);
3005 gfc_simplify_idnint (gfc_expr
*e
)
3007 return simplify_nint ("IDNINT", e
, NULL
);
3012 gfc_simplify_not (gfc_expr
*e
)
3016 if (e
->expr_type
!= EXPR_CONSTANT
)
3019 result
= gfc_constant_result (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3021 mpz_com (result
->value
.integer
, e
->value
.integer
);
3023 return range_check (result
, "NOT");
3028 gfc_simplify_null (gfc_expr
*mold
)
3034 result
= gfc_get_expr ();
3035 result
->ts
.type
= BT_UNKNOWN
;
3038 result
= gfc_copy_expr (mold
);
3039 result
->expr_type
= EXPR_NULL
;
3046 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
3051 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3054 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
3055 if (x
->ts
.type
== BT_INTEGER
)
3057 result
= gfc_constant_result (BT_INTEGER
, kind
, &x
->where
);
3058 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3059 return range_check (result
, "OR");
3061 else /* BT_LOGICAL */
3063 result
= gfc_constant_result (BT_LOGICAL
, kind
, &x
->where
);
3064 result
->value
.logical
= x
->value
.logical
|| y
->value
.logical
;
3071 gfc_simplify_precision (gfc_expr
*e
)
3076 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3078 result
= gfc_int_expr (gfc_real_kinds
[i
].precision
);
3079 result
->where
= e
->where
;
3086 gfc_simplify_radix (gfc_expr
*e
)
3091 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3095 i
= gfc_integer_kinds
[i
].radix
;
3099 i
= gfc_real_kinds
[i
].radix
;
3106 result
= gfc_int_expr (i
);
3107 result
->where
= e
->where
;
3114 gfc_simplify_range (gfc_expr
*e
)
3120 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3125 j
= gfc_integer_kinds
[i
].range
;
3130 j
= gfc_real_kinds
[i
].range
;
3137 result
= gfc_int_expr (j
);
3138 result
->where
= e
->where
;
3145 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
3147 gfc_expr
*result
= NULL
;
3150 if (e
->ts
.type
== BT_COMPLEX
)
3151 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
3153 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
3156 return &gfc_bad_expr
;
3158 if (e
->expr_type
!= EXPR_CONSTANT
)
3165 result
= gfc_int2real (e
, kind
);
3169 result
= gfc_real2real (e
, kind
);
3173 result
= gfc_complex2real (e
, kind
);
3177 gfc_internal_error ("bad type in REAL");
3181 if (e
->ts
.type
== BT_INTEGER
&& e
->is_boz
)
3187 result
= gfc_copy_expr (e
);
3188 if (!gfc_convert_boz (result
, &ts
))
3190 gfc_free_expr (result
);
3191 return &gfc_bad_expr
;
3195 return range_check (result
, "REAL");
3200 gfc_simplify_realpart (gfc_expr
*e
)
3204 if (e
->expr_type
!= EXPR_CONSTANT
)
3207 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
3208 mpfr_set (result
->value
.real
, e
->value
.complex.r
, GFC_RND_MODE
);
3210 return range_check (result
, "REALPART");
3214 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
3217 int i
, j
, len
, ncop
, nlen
;
3219 bool have_length
= false;
3221 /* If NCOPIES isn't a constant, there's nothing we can do. */
3222 if (n
->expr_type
!= EXPR_CONSTANT
)
3225 /* If NCOPIES is negative, it's an error. */
3226 if (mpz_sgn (n
->value
.integer
) < 0)
3228 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
3230 return &gfc_bad_expr
;
3233 /* If we don't know the character length, we can do no more. */
3234 if (e
->ts
.cl
&& e
->ts
.cl
->length
3235 && e
->ts
.cl
->length
->expr_type
== EXPR_CONSTANT
)
3237 len
= mpz_get_si (e
->ts
.cl
->length
->value
.integer
);
3240 else if (e
->expr_type
== EXPR_CONSTANT
3241 && (e
->ts
.cl
== NULL
|| e
->ts
.cl
->length
== NULL
))
3243 len
= e
->value
.character
.length
;
3248 /* If the source length is 0, any value of NCOPIES is valid
3249 and everything behaves as if NCOPIES == 0. */
3252 mpz_set_ui (ncopies
, 0);
3254 mpz_set (ncopies
, n
->value
.integer
);
3256 /* Check that NCOPIES isn't too large. */
3262 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
3264 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
3268 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
3269 e
->ts
.cl
->length
->value
.integer
);
3273 mpz_init_set_si (mlen
, len
);
3274 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
3278 /* The check itself. */
3279 if (mpz_cmp (ncopies
, max
) > 0)
3282 mpz_clear (ncopies
);
3283 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
3285 return &gfc_bad_expr
;
3290 mpz_clear (ncopies
);
3292 /* For further simplification, we need the character string to be
3294 if (e
->expr_type
!= EXPR_CONSTANT
)
3298 (e
->ts
.cl
->length
&&
3299 mpz_sgn (e
->ts
.cl
->length
->value
.integer
)) != 0)
3301 const char *res
= gfc_extract_int (n
, &ncop
);
3302 gcc_assert (res
== NULL
);
3307 len
= e
->value
.character
.length
;
3310 result
= gfc_constant_result (BT_CHARACTER
, e
->ts
.kind
, &e
->where
);
3314 result
->value
.character
.string
= gfc_get_wide_string (1);
3315 result
->value
.character
.length
= 0;
3316 result
->value
.character
.string
[0] = '\0';
3320 result
->value
.character
.length
= nlen
;
3321 result
->value
.character
.string
= gfc_get_wide_string (nlen
+ 1);
3323 for (i
= 0; i
< ncop
; i
++)
3324 for (j
= 0; j
< len
; j
++)
3325 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
3327 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
3332 /* Test that the expression is an constant array. */
3335 is_constant_array_expr (gfc_expr
*e
)
3342 if (e
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (e
))
3345 if (e
->value
.constructor
== NULL
)
3348 for (c
= e
->value
.constructor
; c
; c
= c
->next
)
3349 if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
3356 /* This one is a bear, but mainly has to do with shuffling elements. */
3359 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
3360 gfc_expr
*pad
, gfc_expr
*order_exp
)
3362 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
3363 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
3364 gfc_constructor
*head
, *tail
;
3370 /* Check that argument expression types are OK. */
3371 if (!is_constant_array_expr (source
))
3374 if (!is_constant_array_expr (shape_exp
))
3377 if (!is_constant_array_expr (pad
))
3380 if (!is_constant_array_expr (order_exp
))
3383 /* Proceed with simplification, unpacking the array. */
3391 e
= gfc_get_array_element (shape_exp
, rank
);
3395 if (gfc_extract_int (e
, &shape
[rank
]) != NULL
)
3397 gfc_error ("Integer too large in shape specification at %L",
3403 if (rank
>= GFC_MAX_DIMENSIONS
)
3405 gfc_error ("Too many dimensions in shape specification for RESHAPE "
3406 "at %L", &e
->where
);
3411 if (shape
[rank
] < 0)
3413 gfc_error ("Shape specification at %L cannot be negative",
3425 gfc_error ("Shape specification at %L cannot be the null array",
3430 /* Now unpack the order array if present. */
3431 if (order_exp
== NULL
)
3433 for (i
= 0; i
< rank
; i
++)
3438 for (i
= 0; i
< rank
; i
++)
3441 for (i
= 0; i
< rank
; i
++)
3443 e
= gfc_get_array_element (order_exp
, i
);
3446 gfc_error ("ORDER parameter of RESHAPE at %L is not the same "
3447 "size as SHAPE parameter", &order_exp
->where
);
3451 if (gfc_extract_int (e
, &order
[i
]) != NULL
)
3453 gfc_error ("Error in ORDER parameter of RESHAPE at %L",
3459 if (order
[i
] < 1 || order
[i
] > rank
)
3461 gfc_error ("ORDER parameter of RESHAPE at %L is out of range",
3471 gfc_error ("Invalid permutation in ORDER parameter at %L",
3483 /* Count the elements in the source and padding arrays. */
3488 gfc_array_size (pad
, &size
);
3489 npad
= mpz_get_ui (size
);
3493 gfc_array_size (source
, &size
);
3494 nsource
= mpz_get_ui (size
);
3497 /* If it weren't for that pesky permutation we could just loop
3498 through the source and round out any shortage with pad elements.
3499 But no, someone just had to have the compiler do something the
3500 user should be doing. */
3502 for (i
= 0; i
< rank
; i
++)
3507 /* Figure out which element to extract. */
3508 mpz_set_ui (index
, 0);
3510 for (i
= rank
- 1; i
>= 0; i
--)
3512 mpz_add_ui (index
, index
, x
[order
[i
]]);
3514 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
3517 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
3518 gfc_internal_error ("Reshaped array too large at %C");
3520 j
= mpz_get_ui (index
);
3523 e
= gfc_get_array_element (source
, j
);
3530 gfc_error ("PAD parameter required for short SOURCE parameter "
3531 "at %L", &source
->where
);
3536 e
= gfc_get_array_element (pad
, j
);
3540 head
= tail
= gfc_get_constructor ();
3543 tail
->next
= gfc_get_constructor ();
3550 tail
->where
= e
->where
;
3553 /* Calculate the next element. */
3557 if (++x
[i
] < shape
[i
])
3568 e
= gfc_get_expr ();
3569 e
->where
= source
->where
;
3570 e
->expr_type
= EXPR_ARRAY
;
3571 e
->value
.constructor
= head
;
3572 e
->shape
= gfc_get_shape (rank
);
3574 for (i
= 0; i
< rank
; i
++)
3575 mpz_init_set_ui (e
->shape
[i
], shape
[i
]);
3583 gfc_free_constructor (head
);
3585 return &gfc_bad_expr
;
3590 gfc_simplify_rrspacing (gfc_expr
*x
)
3596 if (x
->expr_type
!= EXPR_CONSTANT
)
3599 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
3601 result
= gfc_constant_result (BT_REAL
, x
->ts
.kind
, &x
->where
);
3603 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3605 /* Special case x = -0 and 0. */
3606 if (mpfr_sgn (result
->value
.real
) == 0)
3608 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
3612 /* | x * 2**(-e) | * 2**p. */
3613 e
= - (long int) mpfr_get_exp (x
->value
.real
);
3614 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
3616 p
= (long int) gfc_real_kinds
[i
].digits
;
3617 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
3619 return range_check (result
, "RRSPACING");
3624 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
3626 int k
, neg_flag
, power
, exp_range
;
3627 mpfr_t scale
, radix
;
3630 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
3633 result
= gfc_constant_result (BT_REAL
, x
->ts
.kind
, &x
->where
);
3635 if (mpfr_sgn (x
->value
.real
) == 0)
3637 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
3641 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
3643 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
3645 /* This check filters out values of i that would overflow an int. */
3646 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
3647 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
3649 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
3650 gfc_free_expr (result
);
3651 return &gfc_bad_expr
;
3654 /* Compute scale = radix ** power. */
3655 power
= mpz_get_si (i
->value
.integer
);
3665 gfc_set_model_kind (x
->ts
.kind
);
3668 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
3669 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
3672 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
3674 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
3676 mpfr_clears (scale
, radix
, NULL
);
3678 return range_check (result
, "SCALE");
3682 /* Variants of strspn and strcspn that operate on wide characters. */
3685 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
3688 const gfc_char_t
*c
;
3692 for (c
= s2
; *c
; c
++)
3706 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
3709 const gfc_char_t
*c
;
3713 for (c
= s2
; *c
; c
++)
3728 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
3733 size_t indx
, len
, lenc
;
3734 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
3737 return &gfc_bad_expr
;
3739 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
)
3742 if (b
!= NULL
&& b
->value
.logical
!= 0)
3747 result
= gfc_constant_result (BT_INTEGER
, k
, &e
->where
);
3749 len
= e
->value
.character
.length
;
3750 lenc
= c
->value
.character
.length
;
3752 if (len
== 0 || lenc
== 0)
3760 indx
= wide_strcspn (e
->value
.character
.string
,
3761 c
->value
.character
.string
) + 1;
3768 for (indx
= len
; indx
> 0; indx
--)
3770 for (i
= 0; i
< lenc
; i
++)
3772 if (c
->value
.character
.string
[i
]
3773 == e
->value
.character
.string
[indx
- 1])
3781 mpz_set_ui (result
->value
.integer
, indx
);
3782 return range_check (result
, "SCAN");
3787 gfc_simplify_selected_char_kind (gfc_expr
*e
)
3792 if (e
->expr_type
!= EXPR_CONSTANT
)
3795 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
3796 || gfc_compare_with_Cstring (e
, "default", false) == 0)
3801 result
= gfc_int_expr (kind
);
3802 result
->where
= e
->where
;
3809 gfc_simplify_selected_int_kind (gfc_expr
*e
)
3814 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
) != NULL
)
3819 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
3820 if (gfc_integer_kinds
[i
].range
>= range
3821 && gfc_integer_kinds
[i
].kind
< kind
)
3822 kind
= gfc_integer_kinds
[i
].kind
;
3824 if (kind
== INT_MAX
)
3827 result
= gfc_int_expr (kind
);
3828 result
->where
= e
->where
;
3835 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
)
3837 int range
, precision
, i
, kind
, found_precision
, found_range
;
3844 if (p
->expr_type
!= EXPR_CONSTANT
3845 || gfc_extract_int (p
, &precision
) != NULL
)
3853 if (q
->expr_type
!= EXPR_CONSTANT
3854 || gfc_extract_int (q
, &range
) != NULL
)
3859 found_precision
= 0;
3862 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
3864 if (gfc_real_kinds
[i
].precision
>= precision
)
3865 found_precision
= 1;
3867 if (gfc_real_kinds
[i
].range
>= range
)
3870 if (gfc_real_kinds
[i
].precision
>= precision
3871 && gfc_real_kinds
[i
].range
>= range
&& gfc_real_kinds
[i
].kind
< kind
)
3872 kind
= gfc_real_kinds
[i
].kind
;
3875 if (kind
== INT_MAX
)
3879 if (!found_precision
)
3885 result
= gfc_int_expr (kind
);
3886 result
->where
= (p
!= NULL
) ? p
->where
: q
->where
;
3893 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
3896 mpfr_t exp
, absv
, log2
, pow2
, frac
;
3899 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
3902 result
= gfc_constant_result (BT_REAL
, x
->ts
.kind
, &x
->where
);
3904 if (mpfr_sgn (x
->value
.real
) == 0)
3906 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
3910 gfc_set_model_kind (x
->ts
.kind
);
3917 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
3918 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
3920 mpfr_trunc (log2
, log2
);
3921 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
3923 /* Old exponent value, and fraction. */
3924 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
3926 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
3929 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
3930 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
3932 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
3934 return range_check (result
, "SET_EXPONENT");
3939 gfc_simplify_shape (gfc_expr
*source
)
3941 mpz_t shape
[GFC_MAX_DIMENSIONS
];
3942 gfc_expr
*result
, *e
, *f
;
3947 if (source
->rank
== 0)
3948 return gfc_start_constructor (BT_INTEGER
, gfc_default_integer_kind
,
3951 if (source
->expr_type
!= EXPR_VARIABLE
)
3954 result
= gfc_start_constructor (BT_INTEGER
, gfc_default_integer_kind
,
3957 ar
= gfc_find_array_ref (source
);
3959 t
= gfc_array_ref_shape (ar
, shape
);
3961 for (n
= 0; n
< source
->rank
; n
++)
3963 e
= gfc_constant_result (BT_INTEGER
, gfc_default_integer_kind
,
3968 mpz_set (e
->value
.integer
, shape
[n
]);
3969 mpz_clear (shape
[n
]);
3973 mpz_set_ui (e
->value
.integer
, n
+ 1);
3975 f
= gfc_simplify_size (source
, e
, NULL
);
3979 gfc_free_expr (result
);
3988 gfc_append_constructor (result
, e
);
3996 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4001 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
4004 return &gfc_bad_expr
;
4008 if (gfc_array_size (array
, &size
) == FAILURE
)
4013 if (dim
->expr_type
!= EXPR_CONSTANT
)
4016 d
= mpz_get_ui (dim
->value
.integer
) - 1;
4017 if (gfc_array_dimen_size (array
, d
, &size
) == FAILURE
)
4021 result
= gfc_constant_result (BT_INTEGER
, k
, &array
->where
);
4022 mpz_set (result
->value
.integer
, size
);
4028 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
4032 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
4035 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4040 mpz_abs (result
->value
.integer
, x
->value
.integer
);
4041 if (mpz_sgn (y
->value
.integer
) < 0)
4042 mpz_neg (result
->value
.integer
, result
->value
.integer
);
4047 /* TODO: Handle -0.0 and +0.0 correctly on machines that support
4049 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4050 if (mpfr_sgn (y
->value
.real
) < 0)
4051 mpfr_neg (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
4056 gfc_internal_error ("Bad type in gfc_simplify_sign");
4064 gfc_simplify_sin (gfc_expr
*x
)
4069 if (x
->expr_type
!= EXPR_CONSTANT
)
4072 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4077 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4081 gfc_set_model (x
->value
.real
);
4085 mpfr_sin (xp
, x
->value
.complex.r
, GFC_RND_MODE
);
4086 mpfr_cosh (xq
, x
->value
.complex.i
, GFC_RND_MODE
);
4087 mpfr_mul (result
->value
.complex.r
, xp
, xq
, GFC_RND_MODE
);
4089 mpfr_cos (xp
, x
->value
.complex.r
, GFC_RND_MODE
);
4090 mpfr_sinh (xq
, x
->value
.complex.i
, GFC_RND_MODE
);
4091 mpfr_mul (result
->value
.complex.i
, xp
, xq
, GFC_RND_MODE
);
4093 mpfr_clears (xp
, xq
, NULL
);
4097 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
4100 return range_check (result
, "SIN");
4105 gfc_simplify_sinh (gfc_expr
*x
)
4109 if (x
->expr_type
!= EXPR_CONSTANT
)
4112 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4114 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4116 return range_check (result
, "SINH");
4120 /* The argument is always a double precision real that is converted to
4121 single precision. TODO: Rounding! */
4124 gfc_simplify_sngl (gfc_expr
*a
)
4128 if (a
->expr_type
!= EXPR_CONSTANT
)
4131 result
= gfc_real2real (a
, gfc_default_real_kind
);
4132 return range_check (result
, "SNGL");
4137 gfc_simplify_spacing (gfc_expr
*x
)
4143 if (x
->expr_type
!= EXPR_CONSTANT
)
4146 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
4148 result
= gfc_constant_result (BT_REAL
, x
->ts
.kind
, &x
->where
);
4150 /* Special case x = 0 and -0. */
4151 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4152 if (mpfr_sgn (result
->value
.real
) == 0)
4154 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
4158 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
4159 are the radix, exponent of x, and precision. This excludes the
4160 possibility of subnormal numbers. Fortran 2003 states the result is
4161 b**max(e - p, emin - 1). */
4163 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
4164 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
4165 en
= en
> ep
? en
: ep
;
4167 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
4168 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
4170 return range_check (result
, "SPACING");
4175 gfc_simplify_sqrt (gfc_expr
*e
)
4178 mpfr_t ac
, ad
, s
, t
, w
;
4180 if (e
->expr_type
!= EXPR_CONSTANT
)
4183 result
= gfc_constant_result (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4188 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
4190 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
4195 /* Formula taken from Numerical Recipes to avoid over- and
4198 gfc_set_model (e
->value
.real
);
4205 if (mpfr_cmp_ui (e
->value
.complex.r
, 0) == 0
4206 && mpfr_cmp_ui (e
->value
.complex.i
, 0) == 0)
4208 mpfr_set_ui (result
->value
.complex.r
, 0, GFC_RND_MODE
);
4209 mpfr_set_ui (result
->value
.complex.i
, 0, GFC_RND_MODE
);
4213 mpfr_abs (ac
, e
->value
.complex.r
, GFC_RND_MODE
);
4214 mpfr_abs (ad
, e
->value
.complex.i
, GFC_RND_MODE
);
4216 if (mpfr_cmp (ac
, ad
) >= 0)
4218 mpfr_div (t
, e
->value
.complex.i
, e
->value
.complex.r
, GFC_RND_MODE
);
4219 mpfr_mul (t
, t
, t
, GFC_RND_MODE
);
4220 mpfr_add_ui (t
, t
, 1, GFC_RND_MODE
);
4221 mpfr_sqrt (t
, t
, GFC_RND_MODE
);
4222 mpfr_add_ui (t
, t
, 1, GFC_RND_MODE
);
4223 mpfr_div_ui (t
, t
, 2, GFC_RND_MODE
);
4224 mpfr_sqrt (t
, t
, GFC_RND_MODE
);
4225 mpfr_sqrt (s
, ac
, GFC_RND_MODE
);
4226 mpfr_mul (w
, s
, t
, GFC_RND_MODE
);
4230 mpfr_div (s
, e
->value
.complex.r
, e
->value
.complex.i
, GFC_RND_MODE
);
4231 mpfr_mul (t
, s
, s
, GFC_RND_MODE
);
4232 mpfr_add_ui (t
, t
, 1, GFC_RND_MODE
);
4233 mpfr_sqrt (t
, t
, GFC_RND_MODE
);
4234 mpfr_abs (s
, s
, GFC_RND_MODE
);
4235 mpfr_add (t
, t
, s
, GFC_RND_MODE
);
4236 mpfr_div_ui (t
, t
, 2, GFC_RND_MODE
);
4237 mpfr_sqrt (t
, t
, GFC_RND_MODE
);
4238 mpfr_sqrt (s
, ad
, GFC_RND_MODE
);
4239 mpfr_mul (w
, s
, t
, GFC_RND_MODE
);
4242 if (mpfr_cmp_ui (w
, 0) != 0 && mpfr_cmp_ui (e
->value
.complex.r
, 0) >= 0)
4244 mpfr_mul_ui (t
, w
, 2, GFC_RND_MODE
);
4245 mpfr_div (result
->value
.complex.i
, e
->value
.complex.i
, t
, GFC_RND_MODE
);
4246 mpfr_set (result
->value
.complex.r
, w
, GFC_RND_MODE
);
4248 else if (mpfr_cmp_ui (w
, 0) != 0
4249 && mpfr_cmp_ui (e
->value
.complex.r
, 0) < 0
4250 && mpfr_cmp_ui (e
->value
.complex.i
, 0) >= 0)
4252 mpfr_mul_ui (t
, w
, 2, GFC_RND_MODE
);
4253 mpfr_div (result
->value
.complex.r
, e
->value
.complex.i
, t
, GFC_RND_MODE
);
4254 mpfr_set (result
->value
.complex.i
, w
, GFC_RND_MODE
);
4256 else if (mpfr_cmp_ui (w
, 0) != 0
4257 && mpfr_cmp_ui (e
->value
.complex.r
, 0) < 0
4258 && mpfr_cmp_ui (e
->value
.complex.i
, 0) < 0)
4260 mpfr_mul_ui (t
, w
, 2, GFC_RND_MODE
);
4261 mpfr_div (result
->value
.complex.r
, ad
, t
, GFC_RND_MODE
);
4262 mpfr_neg (w
, w
, GFC_RND_MODE
);
4263 mpfr_set (result
->value
.complex.i
, w
, GFC_RND_MODE
);
4266 gfc_internal_error ("invalid complex argument of SQRT at %L",
4269 mpfr_clears (s
, t
, ac
, ad
, w
, NULL
);
4274 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
4277 return range_check (result
, "SQRT");
4280 gfc_free_expr (result
);
4281 gfc_error ("Argument of SQRT at %L has a negative value", &e
->where
);
4282 return &gfc_bad_expr
;
4287 gfc_simplify_tan (gfc_expr
*x
)
4292 if (x
->expr_type
!= EXPR_CONSTANT
)
4295 i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4297 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4299 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4301 return range_check (result
, "TAN");
4306 gfc_simplify_tanh (gfc_expr
*x
)
4310 if (x
->expr_type
!= EXPR_CONSTANT
)
4313 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4315 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4317 return range_check (result
, "TANH");
4323 gfc_simplify_tiny (gfc_expr
*e
)
4328 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
4330 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
4331 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
4338 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
4341 gfc_expr
*mold_element
;
4344 size_t result_elt_size
;
4347 unsigned char *buffer
;
4349 if (!gfc_is_constant_expr (source
)
4350 || (gfc_init_expr
&& !gfc_is_constant_expr (mold
))
4351 || !gfc_is_constant_expr (size
))
4354 if (source
->expr_type
== EXPR_FUNCTION
)
4357 /* Calculate the size of the source. */
4358 if (source
->expr_type
== EXPR_ARRAY
4359 && gfc_array_size (source
, &tmp
) == FAILURE
)
4360 gfc_internal_error ("Failure getting length of a constant array.");
4362 source_size
= gfc_target_expr_size (source
);
4364 /* Create an empty new expression with the appropriate characteristics. */
4365 result
= gfc_constant_result (mold
->ts
.type
, mold
->ts
.kind
,
4367 result
->ts
= mold
->ts
;
4369 mold_element
= mold
->expr_type
== EXPR_ARRAY
4370 ? mold
->value
.constructor
->expr
4373 /* Set result character length, if needed. Note that this needs to be
4374 set even for array expressions, in order to pass this information into
4375 gfc_target_interpret_expr. */
4376 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
4377 result
->value
.character
.length
= mold_element
->value
.character
.length
;
4379 /* Set the number of elements in the result, and determine its size. */
4380 result_elt_size
= gfc_target_expr_size (mold_element
);
4381 if (result_elt_size
== 0)
4383 gfc_free_expr (result
);
4387 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
4391 result
->expr_type
= EXPR_ARRAY
;
4395 result_length
= (size_t)mpz_get_ui (size
->value
.integer
);
4398 result_length
= source_size
/ result_elt_size
;
4399 if (result_length
* result_elt_size
< source_size
)
4403 result
->shape
= gfc_get_shape (1);
4404 mpz_init_set_ui (result
->shape
[0], result_length
);
4406 result_size
= result_length
* result_elt_size
;
4411 result_size
= result_elt_size
;
4414 if (gfc_option
.warn_surprising
&& source_size
< result_size
)
4415 gfc_warning("Intrinsic TRANSFER at %L has partly undefined result: "
4416 "source size %ld < result size %ld", &source
->where
,
4417 (long) source_size
, (long) result_size
);
4419 /* Allocate the buffer to store the binary version of the source. */
4420 buffer_size
= MAX (source_size
, result_size
);
4421 buffer
= (unsigned char*)alloca (buffer_size
);
4423 /* Now write source to the buffer. */
4424 gfc_target_encode_expr (source
, buffer
, buffer_size
);
4426 /* And read the buffer back into the new expression. */
4427 gfc_target_interpret_expr (buffer
, buffer_size
, result
);
4434 gfc_simplify_trim (gfc_expr
*e
)
4437 int count
, i
, len
, lentrim
;
4439 if (e
->expr_type
!= EXPR_CONSTANT
)
4442 len
= e
->value
.character
.length
;
4444 result
= gfc_constant_result (BT_CHARACTER
, e
->ts
.kind
, &e
->where
);
4446 for (count
= 0, i
= 1; i
<= len
; ++i
)
4448 if (e
->value
.character
.string
[len
- i
] == ' ')
4454 lentrim
= len
- count
;
4456 result
->value
.character
.length
= lentrim
;
4457 result
->value
.character
.string
= gfc_get_wide_string (lentrim
+ 1);
4459 for (i
= 0; i
< lentrim
; i
++)
4460 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
4462 result
->value
.character
.string
[lentrim
] = '\0'; /* For debugger */
4469 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4471 return simplify_bound (array
, dim
, kind
, 1);
4476 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
4480 size_t index
, len
, lenset
;
4482 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
4485 return &gfc_bad_expr
;
4487 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
)
4490 if (b
!= NULL
&& b
->value
.logical
!= 0)
4495 result
= gfc_constant_result (BT_INTEGER
, k
, &s
->where
);
4497 len
= s
->value
.character
.length
;
4498 lenset
= set
->value
.character
.length
;
4502 mpz_set_ui (result
->value
.integer
, 0);
4510 mpz_set_ui (result
->value
.integer
, 1);
4514 index
= wide_strspn (s
->value
.character
.string
,
4515 set
->value
.character
.string
) + 1;
4524 mpz_set_ui (result
->value
.integer
, len
);
4527 for (index
= len
; index
> 0; index
--)
4529 for (i
= 0; i
< lenset
; i
++)
4531 if (s
->value
.character
.string
[index
- 1]
4532 == set
->value
.character
.string
[i
])
4540 mpz_set_ui (result
->value
.integer
, index
);
4546 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
4551 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
4554 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
4555 if (x
->ts
.type
== BT_INTEGER
)
4557 result
= gfc_constant_result (BT_INTEGER
, kind
, &x
->where
);
4558 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
4559 return range_check (result
, "XOR");
4561 else /* BT_LOGICAL */
4563 result
= gfc_constant_result (BT_LOGICAL
, kind
, &x
->where
);
4564 result
->value
.logical
= (x
->value
.logical
&& !y
->value
.logical
)
4565 || (!x
->value
.logical
&& y
->value
.logical
);
4572 /****************** Constant simplification *****************/
4574 /* Master function to convert one constant to another. While this is
4575 used as a simplification function, it requires the destination type
4576 and kind information which is supplied by a special case in
4580 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
4582 gfc_expr
*g
, *result
, *(*f
) (gfc_expr
*, int);
4583 gfc_constructor
*head
, *c
, *tail
= NULL
;
4597 f
= gfc_int2complex
;
4617 f
= gfc_real2complex
;
4628 f
= gfc_complex2int
;
4631 f
= gfc_complex2real
;
4634 f
= gfc_complex2complex
;
4660 f
= gfc_hollerith2int
;
4664 f
= gfc_hollerith2real
;
4668 f
= gfc_hollerith2complex
;
4672 f
= gfc_hollerith2character
;
4676 f
= gfc_hollerith2logical
;
4686 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
4691 switch (e
->expr_type
)
4694 result
= f (e
, kind
);
4696 return &gfc_bad_expr
;
4700 if (!gfc_is_constant_expr (e
))
4705 for (c
= e
->value
.constructor
; c
; c
= c
->next
)
4708 head
= tail
= gfc_get_constructor ();
4711 tail
->next
= gfc_get_constructor ();
4715 tail
->where
= c
->where
;
4717 if (c
->iterator
== NULL
)
4718 tail
->expr
= f (c
->expr
, kind
);
4721 g
= gfc_convert_constant (c
->expr
, type
, kind
);
4722 if (g
== &gfc_bad_expr
)
4727 if (tail
->expr
== NULL
)
4729 gfc_free_constructor (head
);
4734 result
= gfc_get_expr ();
4735 result
->ts
.type
= type
;
4736 result
->ts
.kind
= kind
;
4737 result
->expr_type
= EXPR_ARRAY
;
4738 result
->value
.constructor
= head
;
4739 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
4740 result
->where
= e
->where
;
4741 result
->rank
= e
->rank
;
4752 /* Function for converting character constants. */
4754 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
4759 if (!gfc_is_constant_expr (e
))
4762 if (e
->expr_type
== EXPR_CONSTANT
)
4764 /* Simple case of a scalar. */
4765 result
= gfc_constant_result (BT_CHARACTER
, kind
, &e
->where
);
4767 return &gfc_bad_expr
;
4769 result
->value
.character
.length
= e
->value
.character
.length
;
4770 result
->value
.character
.string
4771 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
4772 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
4773 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
4775 /* Check we only have values representable in the destination kind. */
4776 for (i
= 0; i
< result
->value
.character
.length
; i
++)
4777 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
4780 gfc_error ("Character '%s' in string at %L cannot be converted "
4781 "into character kind %d",
4782 gfc_print_wide_char (result
->value
.character
.string
[i
]),
4784 return &gfc_bad_expr
;
4789 else if (e
->expr_type
== EXPR_ARRAY
)
4791 /* For an array constructor, we convert each constructor element. */
4792 gfc_constructor
*head
= NULL
, *tail
= NULL
, *c
;
4794 for (c
= e
->value
.constructor
; c
; c
= c
->next
)
4797 head
= tail
= gfc_get_constructor ();
4800 tail
->next
= gfc_get_constructor ();
4804 tail
->where
= c
->where
;
4805 tail
->expr
= gfc_convert_char_constant (c
->expr
, type
, kind
);
4806 if (tail
->expr
== &gfc_bad_expr
)
4809 return &gfc_bad_expr
;
4812 if (tail
->expr
== NULL
)
4814 gfc_free_constructor (head
);
4819 result
= gfc_get_expr ();
4820 result
->ts
.type
= type
;
4821 result
->ts
.kind
= kind
;
4822 result
->expr_type
= EXPR_ARRAY
;
4823 result
->value
.constructor
= head
;
4824 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
4825 result
->where
= e
->where
;
4826 result
->rank
= e
->rank
;
4827 result
->ts
.cl
= e
->ts
.cl
;