1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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 /* Savely advance an array constructor by 'n' elements.
31 Mainly used by simplifiers of transformational intrinsics. */
32 #define ADVANCE(ctor, n) do { int i; for (i = 0; i < n && ctor; ++i) ctor = ctor->next; } while (0)
34 gfc_expr gfc_bad_expr
;
37 /* Note that 'simplification' is not just transforming expressions.
38 For functions that are not simplified at compile time, range
39 checking is done if possible.
41 The return convention is that each simplification function returns:
43 A new expression node corresponding to the simplified arguments.
44 The original arguments are destroyed by the caller, and must not
45 be a part of the new expression.
47 NULL pointer indicating that no simplification was possible and
48 the original expression should remain intact. If the
49 simplification function sets the type and/or the function name
50 via the pointer gfc_simple_expression, then this type is
53 An expression pointer to gfc_bad_expr (a static placeholder)
54 indicating that some error has prevented simplification. For
55 example, sqrt(-1.0). The error is generated within the function
56 and should be propagated upwards
58 By the time a simplification function gets control, it has been
59 decided that the function call is really supposed to be the
60 intrinsic. No type checking is strictly necessary, since only
61 valid types will be passed on. On the other hand, a simplification
62 subroutine may have to look at the type of an argument as part of
65 Array arguments are never passed to these subroutines.
67 The functions in this file don't have much comment with them, but
68 everything is reasonably straight-forward. The Standard, chapter 13
69 is the best comment you'll find for this file anyway. */
71 /* Range checks an expression node. If all goes well, returns the
72 node, otherwise returns &gfc_bad_expr and frees the node. */
75 range_check (gfc_expr
*result
, const char *name
)
80 switch (gfc_range_check (result
))
86 gfc_error ("Result of %s overflows its kind at %L", name
,
91 gfc_error ("Result of %s underflows its kind at %L", name
,
96 gfc_error ("Result of %s is NaN at %L", name
, &result
->where
);
100 gfc_error ("Result of %s gives range error for its kind at %L", name
,
105 gfc_free_expr (result
);
106 return &gfc_bad_expr
;
110 /* A helper function that gets an optional and possibly missing
111 kind parameter. Returns the kind, -1 if something went wrong. */
114 get_kind (bt type
, gfc_expr
*k
, const char *name
, int default_kind
)
121 if (k
->expr_type
!= EXPR_CONSTANT
)
123 gfc_error ("KIND parameter of %s at %L must be an initialization "
124 "expression", name
, &k
->where
);
128 if (gfc_extract_int (k
, &kind
) != NULL
129 || gfc_validate_kind (type
, kind
, true) < 0)
131 gfc_error ("Invalid KIND parameter of %s at %L", name
, &k
->where
);
139 /* Helper function to get an integer constant with a kind number given
140 by an integer constant expression. */
142 int_expr_with_kind (int i
, gfc_expr
*kind
, const char *name
)
144 gfc_expr
*res
= gfc_int_expr (i
);
145 res
->ts
.kind
= get_kind (BT_INTEGER
, kind
, name
, gfc_default_integer_kind
);
146 if (res
->ts
.kind
== -1)
153 /* Converts an mpz_t signed variable into an unsigned one, assuming
154 two's complement representations and a binary width of bitsize.
155 The conversion is a no-op unless x is negative; otherwise, it can
156 be accomplished by masking out the high bits. */
159 convert_mpz_to_unsigned (mpz_t x
, int bitsize
)
165 /* Confirm that no bits above the signed range are unset. */
166 gcc_assert (mpz_scan0 (x
, bitsize
-1) == ULONG_MAX
);
168 mpz_init_set_ui (mask
, 1);
169 mpz_mul_2exp (mask
, mask
, bitsize
);
170 mpz_sub_ui (mask
, mask
, 1);
172 mpz_and (x
, x
, mask
);
178 /* Confirm that no bits above the signed range are set. */
179 gcc_assert (mpz_scan1 (x
, bitsize
-1) == ULONG_MAX
);
184 /* Converts an mpz_t unsigned variable into a signed one, assuming
185 two's complement representations and a binary width of bitsize.
186 If the bitsize-1 bit is set, this is taken as a sign bit and
187 the number is converted to the corresponding negative number. */
190 convert_mpz_to_signed (mpz_t x
, int bitsize
)
194 /* Confirm that no bits above the unsigned range are set. */
195 gcc_assert (mpz_scan1 (x
, bitsize
) == ULONG_MAX
);
197 if (mpz_tstbit (x
, bitsize
- 1) == 1)
199 mpz_init_set_ui (mask
, 1);
200 mpz_mul_2exp (mask
, mask
, bitsize
);
201 mpz_sub_ui (mask
, mask
, 1);
203 /* We negate the number by hand, zeroing the high bits, that is
204 make it the corresponding positive number, and then have it
205 negated by GMP, giving the correct representation of the
208 mpz_add_ui (x
, x
, 1);
209 mpz_and (x
, x
, mask
);
217 /* Test that the expression is an constant array. */
220 is_constant_array_expr (gfc_expr
*e
)
227 if (e
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (e
))
230 for (c
= e
->value
.constructor
; c
; c
= c
->next
)
231 if (c
->expr
->expr_type
!= EXPR_CONSTANT
)
238 /* Initialize a transformational result expression with a given value. */
241 init_result_expr (gfc_expr
*e
, int init
, gfc_expr
*array
)
243 if (e
&& e
->expr_type
== EXPR_ARRAY
)
245 gfc_constructor
*ctor
= e
->value
.constructor
;
248 init_result_expr (ctor
->expr
, init
, array
);
252 else if (e
&& e
->expr_type
== EXPR_CONSTANT
)
254 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
261 e
->value
.logical
= (init
? 1 : 0);
266 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].min_int
);
267 else if (init
== INT_MAX
)
268 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].huge
);
270 mpz_set_si (e
->value
.integer
, init
);
276 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
277 mpfr_neg (e
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
279 else if (init
== INT_MAX
)
280 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
282 mpfr_set_si (e
->value
.real
, init
, GFC_RND_MODE
);
286 mpc_set_si (e
->value
.complex, init
, GFC_MPC_RND_MODE
);
292 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
293 gfc_extract_int (len
, &length
);
294 string
= gfc_get_wide_string (length
+ 1);
295 gfc_wide_memset (string
, 0, length
);
297 else if (init
== INT_MAX
)
299 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
300 gfc_extract_int (len
, &length
);
301 string
= gfc_get_wide_string (length
+ 1);
302 gfc_wide_memset (string
, 255, length
);
307 string
= gfc_get_wide_string (1);
310 string
[length
] = '\0';
311 e
->value
.character
.length
= length
;
312 e
->value
.character
.string
= string
;
324 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul. */
327 compute_dot_product (gfc_constructor
*ctor_a
, int stride_a
,
328 gfc_constructor
*ctor_b
, int stride_b
)
331 gfc_expr
*a
= ctor_a
->expr
, *b
= ctor_b
->expr
;
333 gcc_assert (gfc_compare_types (&a
->ts
, &b
->ts
));
335 result
= gfc_constant_result (a
->ts
.type
, a
->ts
.kind
, &a
->where
);
336 init_result_expr (result
, 0, NULL
);
338 while (ctor_a
&& ctor_b
)
340 /* Copying of expressions is required as operands are free'd
341 by the gfc_arith routines. */
342 switch (result
->ts
.type
)
345 result
= gfc_or (result
,
346 gfc_and (gfc_copy_expr (ctor_a
->expr
),
347 gfc_copy_expr (ctor_b
->expr
)));
353 result
= gfc_add (result
,
354 gfc_multiply (gfc_copy_expr (ctor_a
->expr
),
355 gfc_copy_expr (ctor_b
->expr
)));
362 ADVANCE (ctor_a
, stride_a
);
363 ADVANCE (ctor_b
, stride_b
);
370 /* Build a result expression for transformational intrinsics,
374 transformational_result (gfc_expr
*array
, gfc_expr
*dim
, bt type
,
375 int kind
, locus
* where
)
380 if (!dim
|| array
->rank
== 1)
381 return gfc_constant_result (type
, kind
, where
);
383 result
= gfc_start_constructor (type
, kind
, where
);
384 result
->shape
= gfc_copy_shape_excluding (array
->shape
, array
->rank
, dim
);
385 result
->rank
= array
->rank
- 1;
387 /* gfc_array_size() would count the number of elements in the constructor,
388 we have not built those yet. */
390 for (i
= 0; i
< result
->rank
; ++i
)
391 nelem
*= mpz_get_ui (result
->shape
[i
]);
393 for (i
= 0; i
< nelem
; ++i
)
395 gfc_expr
*e
= gfc_constant_result (type
, kind
, where
);
396 gfc_append_constructor (result
, e
);
403 typedef gfc_expr
* (*transformational_op
)(gfc_expr
*, gfc_expr
*);
405 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
406 of COUNT intrinsic is .TRUE..
408 Interface and implimentation mimics arith functions as
409 gfc_add, gfc_multiply, etc. */
411 static gfc_expr
* gfc_count (gfc_expr
*op1
, gfc_expr
*op2
)
415 gcc_assert (op1
->ts
.type
== BT_INTEGER
);
416 gcc_assert (op2
->ts
.type
== BT_LOGICAL
);
417 gcc_assert (op2
->value
.logical
);
419 result
= gfc_copy_expr (op1
);
420 mpz_add_ui (result
->value
.integer
, result
->value
.integer
, 1);
428 /* Transforms an ARRAY with operation OP, according to MASK, to a
429 scalar RESULT. E.g. called if
431 REAL, PARAMETER :: array(n, m) = ...
432 REAL, PARAMETER :: s = SUM(array)
434 where OP == gfc_add(). */
437 simplify_transformation_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
438 transformational_op op
)
441 gfc_constructor
*array_ctor
, *mask_ctor
;
443 /* Shortcut for constant .FALSE. MASK. */
445 && mask
->expr_type
== EXPR_CONSTANT
446 && !mask
->value
.logical
)
449 array_ctor
= array
->value
.constructor
;
451 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
452 mask_ctor
= mask
->value
.constructor
;
456 a
= array_ctor
->expr
;
457 array_ctor
= array_ctor
->next
;
459 /* A constant MASK equals .TRUE. here and can be ignored. */
463 mask_ctor
= mask_ctor
->next
;
464 if (!m
->value
.logical
)
468 result
= op (result
, gfc_copy_expr (a
));
474 /* Transforms an ARRAY with operation OP, according to MASK, to an
475 array RESULT. E.g. called if
477 REAL, PARAMETER :: array(n, m) = ...
478 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
480 where OP == gfc_multiply(). */
483 simplify_transformation_to_array (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*dim
,
484 gfc_expr
*mask
, transformational_op op
)
487 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
488 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
489 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
491 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
492 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
493 tmpstride
[GFC_MAX_DIMENSIONS
];
495 /* Shortcut for constant .FALSE. MASK. */
497 && mask
->expr_type
== EXPR_CONSTANT
498 && !mask
->value
.logical
)
501 /* Build an indexed table for array element expressions to minimize
502 linked-list traversal. Masked elements are set to NULL. */
503 gfc_array_size (array
, &size
);
504 arraysize
= mpz_get_ui (size
);
506 arrayvec
= (gfc_expr
**) gfc_getmem (sizeof (gfc_expr
*) * arraysize
);
508 array_ctor
= array
->value
.constructor
;
510 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
511 mask_ctor
= mask
->value
.constructor
;
513 for (i
= 0; i
< arraysize
; ++i
)
515 arrayvec
[i
] = array_ctor
->expr
;
516 array_ctor
= array_ctor
->next
;
520 if (!mask_ctor
->expr
->value
.logical
)
523 mask_ctor
= mask_ctor
->next
;
527 /* Same for the result expression. */
528 gfc_array_size (result
, &size
);
529 resultsize
= mpz_get_ui (size
);
532 resultvec
= (gfc_expr
**) gfc_getmem (sizeof (gfc_expr
*) * resultsize
);
533 result_ctor
= result
->value
.constructor
;
534 for (i
= 0; i
< resultsize
; ++i
)
536 resultvec
[i
] = result_ctor
->expr
;
537 result_ctor
= result_ctor
->next
;
540 gfc_extract_int (dim
, &dim_index
);
541 dim_index
-= 1; /* zero-base index */
545 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
548 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
551 dim_extent
= mpz_get_si (array
->shape
[i
]);
552 dim_stride
= tmpstride
[i
];
556 extent
[n
] = mpz_get_si (array
->shape
[i
]);
557 sstride
[n
] = tmpstride
[i
];
558 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
567 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
569 *dest
= op (*dest
, gfc_copy_expr (*src
));
576 while (!done
&& count
[n
] == extent
[n
])
579 base
-= sstride
[n
] * extent
[n
];
580 dest
-= dstride
[n
] * extent
[n
];
583 if (n
< result
->rank
)
594 /* Place updated expression in result constructor. */
595 result_ctor
= result
->value
.constructor
;
596 for (i
= 0; i
< resultsize
; ++i
)
598 result_ctor
->expr
= resultvec
[i
];
599 result_ctor
= result_ctor
->next
;
603 gfc_free (resultvec
);
609 /********************** Simplification functions *****************************/
612 gfc_simplify_abs (gfc_expr
*e
)
616 if (e
->expr_type
!= EXPR_CONSTANT
)
622 result
= gfc_constant_result (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
624 mpz_abs (result
->value
.integer
, e
->value
.integer
);
626 result
= range_check (result
, "IABS");
630 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
632 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
634 result
= range_check (result
, "ABS");
638 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
640 gfc_set_model_kind (e
->ts
.kind
);
642 mpc_abs (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
643 result
= range_check (result
, "CABS");
647 gfc_internal_error ("gfc_simplify_abs(): Bad type");
655 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
659 bool too_large
= false;
661 if (e
->expr_type
!= EXPR_CONSTANT
)
664 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
666 return &gfc_bad_expr
;
668 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
670 gfc_error ("Argument of %s function at %L is negative", name
,
672 return &gfc_bad_expr
;
675 if (ascii
&& gfc_option
.warn_surprising
676 && mpz_cmp_si (e
->value
.integer
, 127) > 0)
677 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
680 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
685 mpz_init_set_ui (t
, 2);
686 mpz_pow_ui (t
, t
, 32);
687 mpz_sub_ui (t
, t
, 1);
688 if (mpz_cmp (e
->value
.integer
, t
) > 0)
695 gfc_error ("Argument of %s function at %L is too large for the "
696 "collating sequence of kind %d", name
, &e
->where
, kind
);
697 return &gfc_bad_expr
;
700 result
= gfc_constant_result (BT_CHARACTER
, kind
, &e
->where
);
701 result
->value
.character
.string
= gfc_get_wide_string (2);
702 result
->value
.character
.length
= 1;
703 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
704 result
->value
.character
.string
[1] = '\0'; /* For debugger */
710 /* We use the processor's collating sequence, because all
711 systems that gfortran currently works on are ASCII. */
714 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
716 return simplify_achar_char (e
, k
, "ACHAR", true);
721 gfc_simplify_acos (gfc_expr
*x
)
725 if (x
->expr_type
!= EXPR_CONSTANT
)
731 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
732 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
734 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
736 return &gfc_bad_expr
;
738 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
739 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
742 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
743 mpc_acos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
746 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
750 return range_check (result
, "ACOS");
754 gfc_simplify_acosh (gfc_expr
*x
)
758 if (x
->expr_type
!= EXPR_CONSTANT
)
764 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
766 gfc_error ("Argument of ACOSH at %L must not be less than 1",
768 return &gfc_bad_expr
;
771 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
772 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
775 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
776 mpc_acosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
779 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
782 return range_check (result
, "ACOSH");
786 gfc_simplify_adjustl (gfc_expr
*e
)
792 if (e
->expr_type
!= EXPR_CONSTANT
)
795 len
= e
->value
.character
.length
;
797 result
= gfc_constant_result (BT_CHARACTER
, e
->ts
.kind
, &e
->where
);
799 result
->value
.character
.length
= len
;
800 result
->value
.character
.string
= gfc_get_wide_string (len
+ 1);
802 for (count
= 0, i
= 0; i
< len
; ++i
)
804 ch
= e
->value
.character
.string
[i
];
810 for (i
= 0; i
< len
- count
; ++i
)
811 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
813 for (i
= len
- count
; i
< len
; ++i
)
814 result
->value
.character
.string
[i
] = ' ';
816 result
->value
.character
.string
[len
] = '\0'; /* For debugger */
823 gfc_simplify_adjustr (gfc_expr
*e
)
829 if (e
->expr_type
!= EXPR_CONSTANT
)
832 len
= e
->value
.character
.length
;
834 result
= gfc_constant_result (BT_CHARACTER
, e
->ts
.kind
, &e
->where
);
836 result
->value
.character
.length
= len
;
837 result
->value
.character
.string
= gfc_get_wide_string (len
+ 1);
839 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
841 ch
= e
->value
.character
.string
[i
];
847 for (i
= 0; i
< count
; ++i
)
848 result
->value
.character
.string
[i
] = ' ';
850 for (i
= count
; i
< len
; ++i
)
851 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
853 result
->value
.character
.string
[len
] = '\0'; /* For debugger */
860 gfc_simplify_aimag (gfc_expr
*e
)
864 if (e
->expr_type
!= EXPR_CONSTANT
)
867 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
868 mpfr_set (result
->value
.real
, mpc_imagref (e
->value
.complex), GFC_RND_MODE
);
870 return range_check (result
, "AIMAG");
875 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
877 gfc_expr
*rtrunc
, *result
;
880 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
882 return &gfc_bad_expr
;
884 if (e
->expr_type
!= EXPR_CONSTANT
)
887 rtrunc
= gfc_copy_expr (e
);
889 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
891 result
= gfc_real2real (rtrunc
, kind
);
892 gfc_free_expr (rtrunc
);
894 return range_check (result
, "AINT");
899 gfc_simplify_all (gfc_expr
*mask
, gfc_expr
*dim
)
903 if (!is_constant_array_expr (mask
)
904 || !gfc_is_constant_expr (dim
))
907 result
= transformational_result (mask
, dim
, mask
->ts
.type
,
908 mask
->ts
.kind
, &mask
->where
);
909 init_result_expr (result
, true, NULL
);
911 return !dim
|| mask
->rank
== 1 ?
912 simplify_transformation_to_scalar (result
, mask
, NULL
, gfc_and
) :
913 simplify_transformation_to_array (result
, mask
, dim
, NULL
, gfc_and
);
918 gfc_simplify_dint (gfc_expr
*e
)
920 gfc_expr
*rtrunc
, *result
;
922 if (e
->expr_type
!= EXPR_CONSTANT
)
925 rtrunc
= gfc_copy_expr (e
);
927 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
929 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
930 gfc_free_expr (rtrunc
);
932 return range_check (result
, "DINT");
937 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
942 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
944 return &gfc_bad_expr
;
946 if (e
->expr_type
!= EXPR_CONSTANT
)
949 result
= gfc_constant_result (e
->ts
.type
, kind
, &e
->where
);
951 mpfr_round (result
->value
.real
, e
->value
.real
);
953 return range_check (result
, "ANINT");
958 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
963 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
966 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
967 if (x
->ts
.type
== BT_INTEGER
)
969 result
= gfc_constant_result (BT_INTEGER
, kind
, &x
->where
);
970 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
971 return range_check (result
, "AND");
973 else /* BT_LOGICAL */
975 result
= gfc_constant_result (BT_LOGICAL
, kind
, &x
->where
);
976 result
->value
.logical
= x
->value
.logical
&& y
->value
.logical
;
983 gfc_simplify_any (gfc_expr
*mask
, gfc_expr
*dim
)
987 if (!is_constant_array_expr (mask
)
988 || !gfc_is_constant_expr (dim
))
991 result
= transformational_result (mask
, dim
, mask
->ts
.type
,
992 mask
->ts
.kind
, &mask
->where
);
993 init_result_expr (result
, false, NULL
);
995 return !dim
|| mask
->rank
== 1 ?
996 simplify_transformation_to_scalar (result
, mask
, NULL
, gfc_or
) :
997 simplify_transformation_to_array (result
, mask
, dim
, NULL
, gfc_or
);
1002 gfc_simplify_dnint (gfc_expr
*e
)
1006 if (e
->expr_type
!= EXPR_CONSTANT
)
1009 result
= gfc_constant_result (BT_REAL
, gfc_default_double_kind
, &e
->where
);
1011 mpfr_round (result
->value
.real
, e
->value
.real
);
1013 return range_check (result
, "DNINT");
1018 gfc_simplify_asin (gfc_expr
*x
)
1022 if (x
->expr_type
!= EXPR_CONSTANT
)
1028 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1029 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1031 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1033 return &gfc_bad_expr
;
1035 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1036 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1039 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1040 mpc_asin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1043 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1046 return range_check (result
, "ASIN");
1051 gfc_simplify_asinh (gfc_expr
*x
)
1055 if (x
->expr_type
!= EXPR_CONSTANT
)
1061 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1062 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1065 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1066 mpc_asinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1069 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1072 return range_check (result
, "ASINH");
1077 gfc_simplify_atan (gfc_expr
*x
)
1081 if (x
->expr_type
!= EXPR_CONSTANT
)
1087 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1088 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1091 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1092 mpc_atan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1095 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1098 return range_check (result
, "ATAN");
1103 gfc_simplify_atanh (gfc_expr
*x
)
1107 if (x
->expr_type
!= EXPR_CONSTANT
)
1113 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
1114 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
1116 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1118 return &gfc_bad_expr
;
1121 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1122 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1125 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1126 mpc_atanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1129 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1132 return range_check (result
, "ATANH");
1137 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
1141 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1144 if (mpfr_sgn (y
->value
.real
) == 0 && mpfr_sgn (x
->value
.real
) == 0)
1146 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1147 "second argument must not be zero", &x
->where
);
1148 return &gfc_bad_expr
;
1151 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1153 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1155 return range_check (result
, "ATAN2");
1160 gfc_simplify_bessel_j0 (gfc_expr
*x ATTRIBUTE_UNUSED
)
1164 if (x
->expr_type
!= EXPR_CONSTANT
)
1167 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1168 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1170 return range_check (result
, "BESSEL_J0");
1175 gfc_simplify_bessel_j1 (gfc_expr
*x ATTRIBUTE_UNUSED
)
1179 if (x
->expr_type
!= EXPR_CONSTANT
)
1182 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1183 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1185 return range_check (result
, "BESSEL_J1");
1190 gfc_simplify_bessel_jn (gfc_expr
*order ATTRIBUTE_UNUSED
,
1191 gfc_expr
*x ATTRIBUTE_UNUSED
)
1196 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1199 n
= mpz_get_si (order
->value
.integer
);
1200 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1201 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1203 return range_check (result
, "BESSEL_JN");
1208 gfc_simplify_bessel_y0 (gfc_expr
*x ATTRIBUTE_UNUSED
)
1212 if (x
->expr_type
!= EXPR_CONSTANT
)
1215 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1216 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1218 return range_check (result
, "BESSEL_Y0");
1223 gfc_simplify_bessel_y1 (gfc_expr
*x ATTRIBUTE_UNUSED
)
1227 if (x
->expr_type
!= EXPR_CONSTANT
)
1230 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1231 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1233 return range_check (result
, "BESSEL_Y1");
1238 gfc_simplify_bessel_yn (gfc_expr
*order ATTRIBUTE_UNUSED
,
1239 gfc_expr
*x ATTRIBUTE_UNUSED
)
1244 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1247 n
= mpz_get_si (order
->value
.integer
);
1248 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1249 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1251 return range_check (result
, "BESSEL_YN");
1256 gfc_simplify_bit_size (gfc_expr
*e
)
1261 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1262 result
= gfc_constant_result (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
1263 mpz_set_ui (result
->value
.integer
, gfc_integer_kinds
[i
].bit_size
);
1270 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
1274 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
1277 if (gfc_extract_int (bit
, &b
) != NULL
|| b
< 0)
1278 return gfc_logical_expr (0, &e
->where
);
1280 return gfc_logical_expr (mpz_tstbit (e
->value
.integer
, b
), &e
->where
);
1285 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
1287 gfc_expr
*ceil
, *result
;
1290 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
1292 return &gfc_bad_expr
;
1294 if (e
->expr_type
!= EXPR_CONSTANT
)
1297 result
= gfc_constant_result (BT_INTEGER
, kind
, &e
->where
);
1299 ceil
= gfc_copy_expr (e
);
1301 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
1302 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
, &e
->where
);
1304 gfc_free_expr (ceil
);
1306 return range_check (result
, "CEILING");
1311 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
1313 return simplify_achar_char (e
, k
, "CHAR", false);
1317 /* Common subroutine for simplifying CMPLX and DCMPLX. */
1320 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
1324 result
= gfc_constant_result (BT_COMPLEX
, kind
, &x
->where
);
1330 mpc_set_z (result
->value
.complex, x
->value
.integer
, GFC_MPC_RND_MODE
);
1334 mpc_set_fr (result
->value
.complex, x
->value
.real
, GFC_RND_MODE
);
1338 mpc_set (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1342 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1351 mpfr_set_z (mpc_imagref (result
->value
.complex),
1352 y
->value
.integer
, GFC_RND_MODE
);
1356 mpfr_set (mpc_imagref (result
->value
.complex),
1357 y
->value
.real
, GFC_RND_MODE
);
1361 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1370 ts
.kind
= result
->ts
.kind
;
1372 if (!gfc_convert_boz (x
, &ts
))
1373 return &gfc_bad_expr
;
1374 mpfr_set (mpc_realref (result
->value
.complex),
1375 x
->value
.real
, GFC_RND_MODE
);
1382 ts
.kind
= result
->ts
.kind
;
1384 if (!gfc_convert_boz (y
, &ts
))
1385 return &gfc_bad_expr
;
1386 mpfr_set (mpc_imagref (result
->value
.complex),
1387 y
->value
.real
, GFC_RND_MODE
);
1390 return range_check (result
, name
);
1394 /* Function called when we won't simplify an expression like CMPLX (or
1395 COMPLEX or DCMPLX) but still want to convert BOZ arguments. */
1398 only_convert_cmplx_boz (gfc_expr
*x
, gfc_expr
*y
, int kind
)
1405 if (x
->is_boz
&& !gfc_convert_boz (x
, &ts
))
1406 return &gfc_bad_expr
;
1408 if (y
&& y
->is_boz
&& !gfc_convert_boz (y
, &ts
))
1409 return &gfc_bad_expr
;
1416 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
1420 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_real_kind
);
1422 return &gfc_bad_expr
;
1424 if (x
->expr_type
!= EXPR_CONSTANT
1425 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1426 return only_convert_cmplx_boz (x
, y
, kind
);
1428 return simplify_cmplx ("CMPLX", x
, y
, kind
);
1433 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
1437 if (x
->ts
.type
== BT_INTEGER
)
1439 if (y
->ts
.type
== BT_INTEGER
)
1440 kind
= gfc_default_real_kind
;
1446 if (y
->ts
.type
== BT_REAL
)
1447 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
1452 if (x
->expr_type
!= EXPR_CONSTANT
1453 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1454 return only_convert_cmplx_boz (x
, y
, kind
);
1456 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
1461 gfc_simplify_conjg (gfc_expr
*e
)
1465 if (e
->expr_type
!= EXPR_CONSTANT
)
1468 result
= gfc_copy_expr (e
);
1469 mpc_conj (result
->value
.complex, result
->value
.complex, GFC_MPC_RND_MODE
);
1470 return range_check (result
, "CONJG");
1475 gfc_simplify_cos (gfc_expr
*x
)
1479 if (x
->expr_type
!= EXPR_CONSTANT
)
1482 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1487 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1490 gfc_set_model_kind (x
->ts
.kind
);
1491 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1494 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1497 return range_check (result
, "COS");
1503 gfc_simplify_cosh (gfc_expr
*x
)
1507 if (x
->expr_type
!= EXPR_CONSTANT
)
1510 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1512 if (x
->ts
.type
== BT_REAL
)
1513 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1514 else if (x
->ts
.type
== BT_COMPLEX
)
1515 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1519 return range_check (result
, "COSH");
1524 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
1528 if (!is_constant_array_expr (mask
)
1529 || !gfc_is_constant_expr (dim
)
1530 || !gfc_is_constant_expr (kind
))
1533 result
= transformational_result (mask
, dim
,
1535 get_kind (BT_INTEGER
, kind
, "COUNT",
1536 gfc_default_integer_kind
),
1539 init_result_expr (result
, 0, NULL
);
1541 /* Passing MASK twice, once as data array, once as mask.
1542 Whenever gfc_count is called, '1' is added to the result. */
1543 return !dim
|| mask
->rank
== 1 ?
1544 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
1545 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
);
1550 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
1553 if (x
->expr_type
!= EXPR_CONSTANT
1554 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1555 return only_convert_cmplx_boz (x
, y
, gfc_default_double_kind
);
1557 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
1562 gfc_simplify_dble (gfc_expr
*e
)
1564 gfc_expr
*result
= NULL
;
1566 if (e
->expr_type
!= EXPR_CONSTANT
)
1573 result
= gfc_int2real (e
, gfc_default_double_kind
);
1577 result
= gfc_real2real (e
, gfc_default_double_kind
);
1581 result
= gfc_complex2real (e
, gfc_default_double_kind
);
1585 gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e
->where
);
1588 if (e
->ts
.type
== BT_INTEGER
&& e
->is_boz
)
1593 ts
.kind
= gfc_default_double_kind
;
1594 result
= gfc_copy_expr (e
);
1595 if (!gfc_convert_boz (result
, &ts
))
1597 gfc_free_expr (result
);
1598 return &gfc_bad_expr
;
1602 return range_check (result
, "DBLE");
1607 gfc_simplify_digits (gfc_expr
*x
)
1611 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
1615 digits
= gfc_integer_kinds
[i
].digits
;
1620 digits
= gfc_real_kinds
[i
].digits
;
1627 return gfc_int_expr (digits
);
1632 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
1637 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1640 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1641 result
= gfc_constant_result (x
->ts
.type
, kind
, &x
->where
);
1646 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
1647 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1649 mpz_set_ui (result
->value
.integer
, 0);
1654 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
1655 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
1658 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
1663 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1666 return range_check (result
, "DIM");
1671 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
1675 if (!is_constant_array_expr (vector_a
)
1676 || !is_constant_array_expr (vector_b
))
1679 gcc_assert (vector_a
->rank
== 1);
1680 gcc_assert (vector_b
->rank
== 1);
1681 gcc_assert (gfc_compare_types (&vector_a
->ts
, &vector_b
->ts
));
1683 if (vector_a
->value
.constructor
&& vector_b
->value
.constructor
)
1684 return compute_dot_product (vector_a
->value
.constructor
, 1,
1685 vector_b
->value
.constructor
, 1);
1687 /* Zero sized array ... */
1688 result
= gfc_constant_result (vector_a
->ts
.type
,
1691 init_result_expr (result
, 0, NULL
);
1697 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
1699 gfc_expr
*a1
, *a2
, *result
;
1701 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1704 result
= gfc_constant_result (BT_REAL
, gfc_default_double_kind
, &x
->where
);
1706 a1
= gfc_real2real (x
, gfc_default_double_kind
);
1707 a2
= gfc_real2real (y
, gfc_default_double_kind
);
1709 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
1714 return range_check (result
, "DPROD");
1719 gfc_simplify_erf (gfc_expr
*x
)
1723 if (x
->expr_type
!= EXPR_CONSTANT
)
1726 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1728 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1730 return range_check (result
, "ERF");
1735 gfc_simplify_erfc (gfc_expr
*x
)
1739 if (x
->expr_type
!= EXPR_CONSTANT
)
1742 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1744 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1746 return range_check (result
, "ERFC");
1750 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
1752 #define MAX_ITER 200
1753 #define ARG_LIMIT 12
1755 /* Calculate ERFC_SCALED directly by its definition:
1757 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
1759 using a large precision for intermediate results. This is used for all
1760 but large values of the argument. */
1762 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
1767 prec
= mpfr_get_default_prec ();
1768 mpfr_set_default_prec (10 * prec
);
1773 mpfr_set (a
, arg
, GFC_RND_MODE
);
1774 mpfr_sqr (b
, a
, GFC_RND_MODE
);
1775 mpfr_exp (b
, b
, GFC_RND_MODE
);
1776 mpfr_erfc (a
, a
, GFC_RND_MODE
);
1777 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
1779 mpfr_set (res
, a
, GFC_RND_MODE
);
1780 mpfr_set_default_prec (prec
);
1786 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
1788 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
1789 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
1792 This is used for large values of the argument. Intermediate calculations
1793 are performed with twice the precision. We don't do a fixed number of
1794 iterations of the sum, but stop when it has converged to the required
1797 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
1799 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
1804 prec
= mpfr_get_default_prec ();
1805 mpfr_set_default_prec (2 * prec
);
1815 mpfr_init (sumtrunc
);
1816 mpfr_set_prec (oldsum
, prec
);
1817 mpfr_set_prec (sumtrunc
, prec
);
1819 mpfr_set (x
, arg
, GFC_RND_MODE
);
1820 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
1821 mpz_set_ui (num
, 1);
1823 mpfr_set (u
, x
, GFC_RND_MODE
);
1824 mpfr_sqr (u
, u
, GFC_RND_MODE
);
1825 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
1826 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
1828 for (i
= 1; i
< MAX_ITER
; i
++)
1830 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
1832 mpz_mul_ui (num
, num
, 2 * i
- 1);
1835 mpfr_set (w
, u
, GFC_RND_MODE
);
1836 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
1838 mpfr_set_z (v
, num
, GFC_RND_MODE
);
1839 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
1841 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
1843 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
1844 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
1848 /* We should have converged by now; otherwise, ARG_LIMIT is probably
1850 gcc_assert (i
< MAX_ITER
);
1852 /* Divide by x * sqrt(Pi). */
1853 mpfr_const_pi (u
, GFC_RND_MODE
);
1854 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
1855 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
1856 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
1858 mpfr_set (res
, sum
, GFC_RND_MODE
);
1859 mpfr_set_default_prec (prec
);
1861 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
1867 gfc_simplify_erfc_scaled (gfc_expr
*x
)
1871 if (x
->expr_type
!= EXPR_CONSTANT
)
1874 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1875 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
1876 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
1878 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
1880 return range_check (result
, "ERFC_SCALED");
1888 gfc_simplify_epsilon (gfc_expr
*e
)
1893 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1895 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
1897 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
1899 return range_check (result
, "EPSILON");
1904 gfc_simplify_exp (gfc_expr
*x
)
1908 if (x
->expr_type
!= EXPR_CONSTANT
)
1911 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1916 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1920 gfc_set_model_kind (x
->ts
.kind
);
1921 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1925 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
1928 return range_check (result
, "EXP");
1932 gfc_simplify_exponent (gfc_expr
*x
)
1937 if (x
->expr_type
!= EXPR_CONSTANT
)
1940 result
= gfc_constant_result (BT_INTEGER
, gfc_default_integer_kind
,
1943 gfc_set_model (x
->value
.real
);
1945 if (mpfr_sgn (x
->value
.real
) == 0)
1947 mpz_set_ui (result
->value
.integer
, 0);
1951 i
= (int) mpfr_get_exp (x
->value
.real
);
1952 mpz_set_si (result
->value
.integer
, i
);
1954 return range_check (result
, "EXPONENT");
1959 gfc_simplify_float (gfc_expr
*a
)
1963 if (a
->expr_type
!= EXPR_CONSTANT
)
1972 ts
.kind
= gfc_default_real_kind
;
1974 result
= gfc_copy_expr (a
);
1975 if (!gfc_convert_boz (result
, &ts
))
1977 gfc_free_expr (result
);
1978 return &gfc_bad_expr
;
1982 result
= gfc_int2real (a
, gfc_default_real_kind
);
1983 return range_check (result
, "FLOAT");
1988 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
1994 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
1996 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
1998 if (e
->expr_type
!= EXPR_CONSTANT
)
2001 result
= gfc_constant_result (BT_INTEGER
, kind
, &e
->where
);
2003 gfc_set_model_kind (kind
);
2005 mpfr_floor (floor
, e
->value
.real
);
2007 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
2011 return range_check (result
, "FLOOR");
2016 gfc_simplify_fraction (gfc_expr
*x
)
2019 mpfr_t absv
, exp
, pow2
;
2021 if (x
->expr_type
!= EXPR_CONSTANT
)
2024 result
= gfc_constant_result (BT_REAL
, x
->ts
.kind
, &x
->where
);
2026 if (mpfr_sgn (x
->value
.real
) == 0)
2028 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2032 gfc_set_model_kind (x
->ts
.kind
);
2037 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
2038 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
2040 mpfr_trunc (exp
, exp
);
2041 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
2043 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
2045 mpfr_div (result
->value
.real
, absv
, pow2
, GFC_RND_MODE
);
2047 mpfr_clears (exp
, absv
, pow2
, NULL
);
2049 return range_check (result
, "FRACTION");
2054 gfc_simplify_gamma (gfc_expr
*x
)
2058 if (x
->expr_type
!= EXPR_CONSTANT
)
2061 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2063 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2065 return range_check (result
, "GAMMA");
2070 gfc_simplify_huge (gfc_expr
*e
)
2075 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2077 result
= gfc_constant_result (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2082 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2086 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
2098 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
2102 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2105 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2106 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
2107 return range_check (result
, "HYPOT");
2111 /* We use the processor's collating sequence, because all
2112 systems that gfortran currently works on are ASCII. */
2115 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
2120 if (e
->expr_type
!= EXPR_CONSTANT
)
2123 if (e
->value
.character
.length
!= 1)
2125 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
2126 return &gfc_bad_expr
;
2129 index
= e
->value
.character
.string
[0];
2131 if (gfc_option
.warn_surprising
&& index
> 127)
2132 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2135 if ((result
= int_expr_with_kind (index
, kind
, "IACHAR")) == NULL
)
2136 return &gfc_bad_expr
;
2138 result
->where
= e
->where
;
2140 return range_check (result
, "IACHAR");
2145 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
2149 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2152 result
= gfc_constant_result (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2154 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2156 return range_check (result
, "IAND");
2161 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
2166 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2169 if (gfc_extract_int (y
, &pos
) != NULL
|| pos
< 0)
2171 gfc_error ("Invalid second argument of IBCLR at %L", &y
->where
);
2172 return &gfc_bad_expr
;
2175 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2177 if (pos
>= gfc_integer_kinds
[k
].bit_size
)
2179 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
2181 return &gfc_bad_expr
;
2184 result
= gfc_copy_expr (x
);
2186 convert_mpz_to_unsigned (result
->value
.integer
,
2187 gfc_integer_kinds
[k
].bit_size
);
2189 mpz_clrbit (result
->value
.integer
, pos
);
2191 convert_mpz_to_signed (result
->value
.integer
,
2192 gfc_integer_kinds
[k
].bit_size
);
2199 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
2206 if (x
->expr_type
!= EXPR_CONSTANT
2207 || y
->expr_type
!= EXPR_CONSTANT
2208 || z
->expr_type
!= EXPR_CONSTANT
)
2211 if (gfc_extract_int (y
, &pos
) != NULL
|| pos
< 0)
2213 gfc_error ("Invalid second argument of IBITS at %L", &y
->where
);
2214 return &gfc_bad_expr
;
2217 if (gfc_extract_int (z
, &len
) != NULL
|| len
< 0)
2219 gfc_error ("Invalid third argument of IBITS at %L", &z
->where
);
2220 return &gfc_bad_expr
;
2223 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
2225 bitsize
= gfc_integer_kinds
[k
].bit_size
;
2227 if (pos
+ len
> bitsize
)
2229 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2230 "bit size at %L", &y
->where
);
2231 return &gfc_bad_expr
;
2234 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2235 convert_mpz_to_unsigned (result
->value
.integer
,
2236 gfc_integer_kinds
[k
].bit_size
);
2238 bits
= XCNEWVEC (int, bitsize
);
2240 for (i
= 0; i
< bitsize
; i
++)
2243 for (i
= 0; i
< len
; i
++)
2244 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
2246 for (i
= 0; i
< bitsize
; i
++)
2249 mpz_clrbit (result
->value
.integer
, i
);
2250 else if (bits
[i
] == 1)
2251 mpz_setbit (result
->value
.integer
, i
);
2253 gfc_internal_error ("IBITS: Bad bit");
2258 convert_mpz_to_signed (result
->value
.integer
,
2259 gfc_integer_kinds
[k
].bit_size
);
2266 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
2271 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2274 if (gfc_extract_int (y
, &pos
) != NULL
|| pos
< 0)
2276 gfc_error ("Invalid second argument of IBSET at %L", &y
->where
);
2277 return &gfc_bad_expr
;
2280 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2282 if (pos
>= gfc_integer_kinds
[k
].bit_size
)
2284 gfc_error ("Second argument of IBSET exceeds bit size at %L",
2286 return &gfc_bad_expr
;
2289 result
= gfc_copy_expr (x
);
2291 convert_mpz_to_unsigned (result
->value
.integer
,
2292 gfc_integer_kinds
[k
].bit_size
);
2294 mpz_setbit (result
->value
.integer
, pos
);
2296 convert_mpz_to_signed (result
->value
.integer
,
2297 gfc_integer_kinds
[k
].bit_size
);
2304 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
2309 if (e
->expr_type
!= EXPR_CONSTANT
)
2312 if (e
->value
.character
.length
!= 1)
2314 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
2315 return &gfc_bad_expr
;
2318 index
= e
->value
.character
.string
[0];
2320 if ((result
= int_expr_with_kind (index
, kind
, "ICHAR")) == NULL
)
2321 return &gfc_bad_expr
;
2323 result
->where
= e
->where
;
2324 return range_check (result
, "ICHAR");
2329 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
2333 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2336 result
= gfc_constant_result (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2338 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2340 return range_check (result
, "IEOR");
2345 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
2348 int back
, len
, lensub
;
2349 int i
, j
, k
, count
, index
= 0, start
;
2351 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
2352 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
2355 if (b
!= NULL
&& b
->value
.logical
!= 0)
2360 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
2362 return &gfc_bad_expr
;
2364 result
= gfc_constant_result (BT_INTEGER
, k
, &x
->where
);
2366 len
= x
->value
.character
.length
;
2367 lensub
= y
->value
.character
.length
;
2371 mpz_set_si (result
->value
.integer
, 0);
2379 mpz_set_si (result
->value
.integer
, 1);
2382 else if (lensub
== 1)
2384 for (i
= 0; i
< len
; i
++)
2386 for (j
= 0; j
< lensub
; j
++)
2388 if (y
->value
.character
.string
[j
]
2389 == x
->value
.character
.string
[i
])
2399 for (i
= 0; i
< len
; i
++)
2401 for (j
= 0; j
< lensub
; j
++)
2403 if (y
->value
.character
.string
[j
]
2404 == x
->value
.character
.string
[i
])
2409 for (k
= 0; k
< lensub
; k
++)
2411 if (y
->value
.character
.string
[k
]
2412 == x
->value
.character
.string
[k
+ start
])
2416 if (count
== lensub
)
2431 mpz_set_si (result
->value
.integer
, len
+ 1);
2434 else if (lensub
== 1)
2436 for (i
= 0; i
< len
; i
++)
2438 for (j
= 0; j
< lensub
; j
++)
2440 if (y
->value
.character
.string
[j
]
2441 == x
->value
.character
.string
[len
- i
])
2443 index
= len
- i
+ 1;
2451 for (i
= 0; i
< len
; i
++)
2453 for (j
= 0; j
< lensub
; j
++)
2455 if (y
->value
.character
.string
[j
]
2456 == x
->value
.character
.string
[len
- i
])
2459 if (start
<= len
- lensub
)
2462 for (k
= 0; k
< lensub
; k
++)
2463 if (y
->value
.character
.string
[k
]
2464 == x
->value
.character
.string
[k
+ start
])
2467 if (count
== lensub
)
2484 mpz_set_si (result
->value
.integer
, index
);
2485 return range_check (result
, "INDEX");
2490 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
2492 gfc_expr
*result
= NULL
;
2495 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
2497 return &gfc_bad_expr
;
2499 if (e
->expr_type
!= EXPR_CONSTANT
)
2505 result
= gfc_int2int (e
, kind
);
2509 result
= gfc_real2int (e
, kind
);
2513 result
= gfc_complex2int (e
, kind
);
2517 gfc_error ("Argument of INT at %L is not a valid type", &e
->where
);
2518 return &gfc_bad_expr
;
2521 return range_check (result
, "INT");
2526 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
2528 gfc_expr
*result
= NULL
;
2530 if (e
->expr_type
!= EXPR_CONSTANT
)
2536 result
= gfc_int2int (e
, kind
);
2540 result
= gfc_real2int (e
, kind
);
2544 result
= gfc_complex2int (e
, kind
);
2548 gfc_error ("Argument of %s at %L is not a valid type", name
, &e
->where
);
2549 return &gfc_bad_expr
;
2552 return range_check (result
, name
);
2557 gfc_simplify_int2 (gfc_expr
*e
)
2559 return simplify_intconv (e
, 2, "INT2");
2564 gfc_simplify_int8 (gfc_expr
*e
)
2566 return simplify_intconv (e
, 8, "INT8");
2571 gfc_simplify_long (gfc_expr
*e
)
2573 return simplify_intconv (e
, 4, "LONG");
2578 gfc_simplify_ifix (gfc_expr
*e
)
2580 gfc_expr
*rtrunc
, *result
;
2582 if (e
->expr_type
!= EXPR_CONSTANT
)
2585 result
= gfc_constant_result (BT_INTEGER
, gfc_default_integer_kind
,
2588 rtrunc
= gfc_copy_expr (e
);
2590 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
2591 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
2593 gfc_free_expr (rtrunc
);
2594 return range_check (result
, "IFIX");
2599 gfc_simplify_idint (gfc_expr
*e
)
2601 gfc_expr
*rtrunc
, *result
;
2603 if (e
->expr_type
!= EXPR_CONSTANT
)
2606 result
= gfc_constant_result (BT_INTEGER
, gfc_default_integer_kind
,
2609 rtrunc
= gfc_copy_expr (e
);
2611 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
2612 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
2614 gfc_free_expr (rtrunc
);
2615 return range_check (result
, "IDINT");
2620 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
2624 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2627 result
= gfc_constant_result (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2629 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2630 return range_check (result
, "IOR");
2635 gfc_simplify_is_iostat_end (gfc_expr
*x
)
2639 if (x
->expr_type
!= EXPR_CONSTANT
)
2642 result
= gfc_constant_result (BT_LOGICAL
, gfc_default_logical_kind
,
2644 result
->value
.logical
= (mpz_cmp_si (x
->value
.integer
, LIBERROR_END
) == 0);
2651 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
2655 if (x
->expr_type
!= EXPR_CONSTANT
)
2658 result
= gfc_constant_result (BT_LOGICAL
, gfc_default_logical_kind
,
2660 result
->value
.logical
= (mpz_cmp_si (x
->value
.integer
, LIBERROR_EOR
) == 0);
2667 gfc_simplify_isnan (gfc_expr
*x
)
2671 if (x
->expr_type
!= EXPR_CONSTANT
)
2674 result
= gfc_constant_result (BT_LOGICAL
, gfc_default_logical_kind
,
2676 result
->value
.logical
= mpfr_nan_p (x
->value
.real
);
2683 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
2686 int shift
, ashift
, isize
, k
, *bits
, i
;
2688 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
2691 if (gfc_extract_int (s
, &shift
) != NULL
)
2693 gfc_error ("Invalid second argument of ISHFT at %L", &s
->where
);
2694 return &gfc_bad_expr
;
2697 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
2699 isize
= gfc_integer_kinds
[k
].bit_size
;
2708 gfc_error ("Magnitude of second argument of ISHFT exceeds bit size "
2709 "at %L", &s
->where
);
2710 return &gfc_bad_expr
;
2713 result
= gfc_constant_result (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2717 mpz_set (result
->value
.integer
, e
->value
.integer
);
2718 return range_check (result
, "ISHFT");
2721 bits
= XCNEWVEC (int, isize
);
2723 for (i
= 0; i
< isize
; i
++)
2724 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
2728 for (i
= 0; i
< shift
; i
++)
2729 mpz_clrbit (result
->value
.integer
, i
);
2731 for (i
= 0; i
< isize
- shift
; i
++)
2734 mpz_clrbit (result
->value
.integer
, i
+ shift
);
2736 mpz_setbit (result
->value
.integer
, i
+ shift
);
2741 for (i
= isize
- 1; i
>= isize
- ashift
; i
--)
2742 mpz_clrbit (result
->value
.integer
, i
);
2744 for (i
= isize
- 1; i
>= ashift
; i
--)
2747 mpz_clrbit (result
->value
.integer
, i
- ashift
);
2749 mpz_setbit (result
->value
.integer
, i
- ashift
);
2753 convert_mpz_to_signed (result
->value
.integer
, isize
);
2761 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
2764 int shift
, ashift
, isize
, ssize
, delta
, k
;
2767 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
2770 if (gfc_extract_int (s
, &shift
) != NULL
)
2772 gfc_error ("Invalid second argument of ISHFTC at %L", &s
->where
);
2773 return &gfc_bad_expr
;
2776 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2777 isize
= gfc_integer_kinds
[k
].bit_size
;
2781 if (sz
->expr_type
!= EXPR_CONSTANT
)
2784 if (gfc_extract_int (sz
, &ssize
) != NULL
|| ssize
<= 0)
2786 gfc_error ("Invalid third argument of ISHFTC at %L", &sz
->where
);
2787 return &gfc_bad_expr
;
2792 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
2793 "BIT_SIZE of first argument at %L", &s
->where
);
2794 return &gfc_bad_expr
;
2808 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2809 "third argument at %L", &s
->where
);
2811 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2812 "BIT_SIZE of first argument at %L", &s
->where
);
2813 return &gfc_bad_expr
;
2816 result
= gfc_constant_result (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2818 mpz_set (result
->value
.integer
, e
->value
.integer
);
2823 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
2825 bits
= XCNEWVEC (int, ssize
);
2827 for (i
= 0; i
< ssize
; i
++)
2828 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
2830 delta
= ssize
- ashift
;
2834 for (i
= 0; i
< delta
; i
++)
2837 mpz_clrbit (result
->value
.integer
, i
+ shift
);
2839 mpz_setbit (result
->value
.integer
, i
+ shift
);
2842 for (i
= delta
; i
< ssize
; i
++)
2845 mpz_clrbit (result
->value
.integer
, i
- delta
);
2847 mpz_setbit (result
->value
.integer
, i
- delta
);
2852 for (i
= 0; i
< ashift
; i
++)
2855 mpz_clrbit (result
->value
.integer
, i
+ delta
);
2857 mpz_setbit (result
->value
.integer
, i
+ delta
);
2860 for (i
= ashift
; i
< ssize
; i
++)
2863 mpz_clrbit (result
->value
.integer
, i
+ shift
);
2865 mpz_setbit (result
->value
.integer
, i
+ shift
);
2869 convert_mpz_to_signed (result
->value
.integer
, isize
);
2877 gfc_simplify_kind (gfc_expr
*e
)
2880 if (e
->ts
.type
== BT_DERIVED
)
2882 gfc_error ("Argument of KIND at %L is a DERIVED type", &e
->where
);
2883 return &gfc_bad_expr
;
2886 return gfc_int_expr (e
->ts
.kind
);
2891 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
2892 gfc_array_spec
*as
, gfc_ref
*ref
)
2894 gfc_expr
*l
, *u
, *result
;
2897 /* The last dimension of an assumed-size array is special. */
2898 if (d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
2900 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
2901 return gfc_copy_expr (as
->lower
[d
-1]);
2906 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
2907 gfc_default_integer_kind
);
2909 return &gfc_bad_expr
;
2911 result
= gfc_constant_result (BT_INTEGER
, k
, &array
->where
);
2914 /* Then, we need to know the extent of the given dimension. */
2915 if (ref
->u
.ar
.type
== AR_FULL
)
2920 if (l
->expr_type
!= EXPR_CONSTANT
|| u
->expr_type
!= EXPR_CONSTANT
)
2923 if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
2927 mpz_set_si (result
->value
.integer
, 0);
2929 mpz_set_si (result
->value
.integer
, 1);
2933 /* Nonzero extent. */
2935 mpz_set (result
->value
.integer
, u
->value
.integer
);
2937 mpz_set (result
->value
.integer
, l
->value
.integer
);
2944 if (gfc_ref_dimen_size (&ref
->u
.ar
, d
-1, &result
->value
.integer
)
2949 mpz_set_si (result
->value
.integer
, (long int) 1);
2952 return range_check (result
, upper
? "UBOUND" : "LBOUND");
2957 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
2963 if (array
->expr_type
!= EXPR_VARIABLE
)
2966 /* Follow any component references. */
2967 as
= array
->symtree
->n
.sym
->as
;
2968 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
2973 switch (ref
->u
.ar
.type
)
2980 /* We're done because 'as' has already been set in the
2981 previous iteration. */
2998 as
= ref
->u
.c
.component
->as
;
3010 if (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_SHAPE
)
3015 /* Multi-dimensional bounds. */
3016 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3018 gfc_constructor
*head
, *tail
;
3021 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3022 if (upper
&& as
->type
== AS_ASSUMED_SIZE
)
3024 /* An error message will be emitted in
3025 check_assumed_size_reference (resolve.c). */
3026 return &gfc_bad_expr
;
3029 /* Simplify the bounds for each dimension. */
3030 for (d
= 0; d
< array
->rank
; d
++)
3032 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
, ref
);
3033 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3037 for (j
= 0; j
< d
; j
++)
3038 gfc_free_expr (bounds
[j
]);
3043 /* Allocate the result expression. */
3044 e
= gfc_get_expr ();
3045 e
->where
= array
->where
;
3046 e
->expr_type
= EXPR_ARRAY
;
3047 e
->ts
.type
= BT_INTEGER
;
3048 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3049 gfc_default_integer_kind
);
3053 return &gfc_bad_expr
;
3057 /* The result is a rank 1 array; its size is the rank of the first
3058 argument to {L,U}BOUND. */
3060 e
->shape
= gfc_get_shape (1);
3061 mpz_init_set_ui (e
->shape
[0], array
->rank
);
3063 /* Create the constructor for this array. */
3065 for (d
= 0; d
< array
->rank
; d
++)
3067 /* Get a new constructor element. */
3069 head
= tail
= gfc_get_constructor ();
3072 tail
->next
= gfc_get_constructor ();
3076 tail
->where
= e
->where
;
3077 tail
->expr
= bounds
[d
];
3079 e
->value
.constructor
= head
;
3085 /* A DIM argument is specified. */
3086 if (dim
->expr_type
!= EXPR_CONSTANT
)
3089 d
= mpz_get_si (dim
->value
.integer
);
3091 if (d
< 1 || d
> as
->rank
3092 || (d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
3094 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3095 return &gfc_bad_expr
;
3098 return simplify_bound_dim (array
, kind
, d
, upper
, as
, ref
);
3104 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
3106 return simplify_bound (array
, dim
, kind
, 0);
3111 gfc_simplify_leadz (gfc_expr
*e
)
3114 unsigned long lz
, bs
;
3117 if (e
->expr_type
!= EXPR_CONSTANT
)
3120 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3121 bs
= gfc_integer_kinds
[i
].bit_size
;
3122 if (mpz_cmp_si (e
->value
.integer
, 0) == 0)
3124 else if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
3127 lz
= bs
- mpz_sizeinbase (e
->value
.integer
, 2);
3129 result
= gfc_constant_result (BT_INTEGER
, gfc_default_integer_kind
,
3131 mpz_set_ui (result
->value
.integer
, lz
);
3138 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
3141 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
3144 return &gfc_bad_expr
;
3146 if (e
->expr_type
== EXPR_CONSTANT
)
3148 result
= gfc_constant_result (BT_INTEGER
, k
, &e
->where
);
3149 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
3150 if (gfc_range_check (result
) == ARITH_OK
)
3154 gfc_free_expr (result
);
3159 if (e
->ts
.u
.cl
!= NULL
&& e
->ts
.u
.cl
->length
!= NULL
3160 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
3161 && e
->ts
.u
.cl
->length
->ts
.type
== BT_INTEGER
)
3163 result
= gfc_constant_result (BT_INTEGER
, k
, &e
->where
);
3164 mpz_set (result
->value
.integer
, e
->ts
.u
.cl
->length
->value
.integer
);
3165 if (gfc_range_check (result
) == ARITH_OK
)
3169 gfc_free_expr (result
);
3179 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
3182 int count
, len
, lentrim
, i
;
3183 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
3186 return &gfc_bad_expr
;
3188 if (e
->expr_type
!= EXPR_CONSTANT
)
3191 result
= gfc_constant_result (BT_INTEGER
, k
, &e
->where
);
3192 len
= e
->value
.character
.length
;
3194 for (count
= 0, i
= 1; i
<= len
; i
++)
3195 if (e
->value
.character
.string
[len
- i
] == ' ')
3200 lentrim
= len
- count
;
3202 mpz_set_si (result
->value
.integer
, lentrim
);
3203 return range_check (result
, "LEN_TRIM");
3207 gfc_simplify_lgamma (gfc_expr
*x ATTRIBUTE_UNUSED
)
3212 if (x
->expr_type
!= EXPR_CONSTANT
)
3215 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3217 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
3219 return range_check (result
, "LGAMMA");
3224 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
3226 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3229 return gfc_logical_expr (gfc_compare_string (a
, b
) >= 0, &a
->where
);
3234 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
3236 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3239 return gfc_logical_expr (gfc_compare_string (a
, b
) > 0,
3245 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
3247 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3250 return gfc_logical_expr (gfc_compare_string (a
, b
) <= 0, &a
->where
);
3255 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
3257 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
3260 return gfc_logical_expr (gfc_compare_string (a
, b
) < 0, &a
->where
);
3265 gfc_simplify_log (gfc_expr
*x
)
3269 if (x
->expr_type
!= EXPR_CONSTANT
)
3272 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3278 if (mpfr_sgn (x
->value
.real
) <= 0)
3280 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3281 "to zero", &x
->where
);
3282 gfc_free_expr (result
);
3283 return &gfc_bad_expr
;
3286 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3290 if ((mpfr_sgn (mpc_realref (x
->value
.complex)) == 0)
3291 && (mpfr_sgn (mpc_imagref (x
->value
.complex)) == 0))
3293 gfc_error ("Complex argument of LOG at %L cannot be zero",
3295 gfc_free_expr (result
);
3296 return &gfc_bad_expr
;
3299 gfc_set_model_kind (x
->ts
.kind
);
3300 mpc_log (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
3304 gfc_internal_error ("gfc_simplify_log: bad type");
3307 return range_check (result
, "LOG");
3312 gfc_simplify_log10 (gfc_expr
*x
)
3316 if (x
->expr_type
!= EXPR_CONSTANT
)
3319 if (mpfr_sgn (x
->value
.real
) <= 0)
3321 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3322 "to zero", &x
->where
);
3323 return &gfc_bad_expr
;
3326 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3328 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3330 return range_check (result
, "LOG10");
3335 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
3340 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
3342 return &gfc_bad_expr
;
3344 if (e
->expr_type
!= EXPR_CONSTANT
)
3347 result
= gfc_constant_result (BT_LOGICAL
, kind
, &e
->where
);
3349 result
->value
.logical
= e
->value
.logical
;
3356 gfc_simplify_matmul (gfc_expr
*matrix_a
, gfc_expr
*matrix_b
)
3359 gfc_constructor
*ma_ctor
, *mb_ctor
;
3360 int row
, result_rows
, col
, result_columns
, stride_a
, stride_b
;
3362 if (!is_constant_array_expr (matrix_a
)
3363 || !is_constant_array_expr (matrix_b
))
3366 gcc_assert (gfc_compare_types (&matrix_a
->ts
, &matrix_b
->ts
));
3367 result
= gfc_start_constructor (matrix_a
->ts
.type
,
3371 if (matrix_a
->rank
== 1 && matrix_b
->rank
== 2)
3374 result_columns
= mpz_get_si (matrix_b
->shape
[0]);
3376 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
3379 result
->shape
= gfc_get_shape (result
->rank
);
3380 mpz_init_set_si (result
->shape
[0], result_columns
);
3382 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 1)
3384 result_rows
= mpz_get_si (matrix_b
->shape
[0]);
3386 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
3390 result
->shape
= gfc_get_shape (result
->rank
);
3391 mpz_init_set_si (result
->shape
[0], result_rows
);
3393 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 2)
3395 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
3396 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
3397 stride_a
= mpz_get_si (matrix_a
->shape
[1]);
3398 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
3401 result
->shape
= gfc_get_shape (result
->rank
);
3402 mpz_init_set_si (result
->shape
[0], result_rows
);
3403 mpz_init_set_si (result
->shape
[1], result_columns
);
3408 ma_ctor
= matrix_a
->value
.constructor
;
3409 mb_ctor
= matrix_b
->value
.constructor
;
3411 for (col
= 0; col
< result_columns
; ++col
)
3413 ma_ctor
= matrix_a
->value
.constructor
;
3415 for (row
= 0; row
< result_rows
; ++row
)
3418 e
= compute_dot_product (ma_ctor
, stride_a
,
3421 gfc_append_constructor (result
, e
);
3423 ADVANCE (ma_ctor
, 1);
3426 ADVANCE (mb_ctor
, stride_b
);
3434 gfc_simplify_merge (gfc_expr
*tsource
, gfc_expr
*fsource
, gfc_expr
*mask
)
3436 if (tsource
->expr_type
!= EXPR_CONSTANT
3437 || fsource
->expr_type
!= EXPR_CONSTANT
3438 || mask
->expr_type
!= EXPR_CONSTANT
)
3441 return gfc_copy_expr (mask
->value
.logical
? tsource
: fsource
);
3445 /* Selects bewteen current value and extremum for simplify_min_max
3446 and simplify_minval_maxval. */
3448 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
)
3450 switch (arg
->ts
.type
)
3453 if (mpz_cmp (arg
->value
.integer
,
3454 extremum
->value
.integer
) * sign
> 0)
3455 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
3459 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
3461 mpfr_max (extremum
->value
.real
, extremum
->value
.real
,
3462 arg
->value
.real
, GFC_RND_MODE
);
3464 mpfr_min (extremum
->value
.real
, extremum
->value
.real
,
3465 arg
->value
.real
, GFC_RND_MODE
);
3469 #define LENGTH(x) ((x)->value.character.length)
3470 #define STRING(x) ((x)->value.character.string)
3471 if (LENGTH(extremum
) < LENGTH(arg
))
3473 gfc_char_t
*tmp
= STRING(extremum
);
3475 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
3476 memcpy (STRING(extremum
), tmp
,
3477 LENGTH(extremum
) * sizeof (gfc_char_t
));
3478 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
3479 LENGTH(arg
) - LENGTH(extremum
));
3480 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
3481 LENGTH(extremum
) = LENGTH(arg
);
3485 if (gfc_compare_string (arg
, extremum
) * sign
> 0)
3487 gfc_free (STRING(extremum
));
3488 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
3489 memcpy (STRING(extremum
), STRING(arg
),
3490 LENGTH(arg
) * sizeof (gfc_char_t
));
3491 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
3492 LENGTH(extremum
) - LENGTH(arg
));
3493 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
3500 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
3505 /* This function is special since MAX() can take any number of
3506 arguments. The simplified expression is a rewritten version of the
3507 argument list containing at most one constant element. Other
3508 constant elements are deleted. Because the argument list has
3509 already been checked, this function always succeeds. sign is 1 for
3510 MAX(), -1 for MIN(). */
3513 simplify_min_max (gfc_expr
*expr
, int sign
)
3515 gfc_actual_arglist
*arg
, *last
, *extremum
;
3516 gfc_intrinsic_sym
* specific
;
3520 specific
= expr
->value
.function
.isym
;
3522 arg
= expr
->value
.function
.actual
;
3524 for (; arg
; last
= arg
, arg
= arg
->next
)
3526 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
3529 if (extremum
== NULL
)
3535 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
3537 /* Delete the extra constant argument. */
3539 expr
->value
.function
.actual
= arg
->next
;
3541 last
->next
= arg
->next
;
3544 gfc_free_actual_arglist (arg
);
3548 /* If there is one value left, replace the function call with the
3550 if (expr
->value
.function
.actual
->next
!= NULL
)
3553 /* Convert to the correct type and kind. */
3554 if (expr
->ts
.type
!= BT_UNKNOWN
)
3555 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
3556 expr
->ts
.type
, expr
->ts
.kind
);
3558 if (specific
->ts
.type
!= BT_UNKNOWN
)
3559 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
3560 specific
->ts
.type
, specific
->ts
.kind
);
3562 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
3567 gfc_simplify_min (gfc_expr
*e
)
3569 return simplify_min_max (e
, -1);
3574 gfc_simplify_max (gfc_expr
*e
)
3576 return simplify_min_max (e
, 1);
3580 /* This is a simplified version of simplify_min_max to provide
3581 simplification of minval and maxval for a vector. */
3584 simplify_minval_maxval (gfc_expr
*expr
, int sign
)
3586 gfc_constructor
*ctr
, *extremum
;
3587 gfc_intrinsic_sym
* specific
;
3590 specific
= expr
->value
.function
.isym
;
3592 ctr
= expr
->value
.constructor
;
3594 for (; ctr
; ctr
= ctr
->next
)
3596 if (ctr
->expr
->expr_type
!= EXPR_CONSTANT
)
3599 if (extremum
== NULL
)
3605 min_max_choose (ctr
->expr
, extremum
->expr
, sign
);
3608 if (extremum
== NULL
)
3611 /* Convert to the correct type and kind. */
3612 if (expr
->ts
.type
!= BT_UNKNOWN
)
3613 return gfc_convert_constant (extremum
->expr
,
3614 expr
->ts
.type
, expr
->ts
.kind
);
3616 if (specific
->ts
.type
!= BT_UNKNOWN
)
3617 return gfc_convert_constant (extremum
->expr
,
3618 specific
->ts
.type
, specific
->ts
.kind
);
3620 return gfc_copy_expr (extremum
->expr
);
3625 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
3627 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
3630 return simplify_minval_maxval (array
, -1);
3635 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
3637 if (array
->expr_type
!= EXPR_ARRAY
|| array
->rank
!= 1 || dim
|| mask
)
3639 return simplify_minval_maxval (array
, 1);
3644 gfc_simplify_maxexponent (gfc_expr
*x
)
3649 i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
3651 result
= gfc_int_expr (gfc_real_kinds
[i
].max_exponent
);
3652 result
->where
= x
->where
;
3659 gfc_simplify_minexponent (gfc_expr
*x
)
3664 i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
3666 result
= gfc_int_expr (gfc_real_kinds
[i
].min_exponent
);
3667 result
->where
= x
->where
;
3674 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
3680 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
3683 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
3684 result
= gfc_constant_result (a
->ts
.type
, kind
, &a
->where
);
3689 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
3691 /* Result is processor-dependent. */
3692 gfc_error ("Second argument MOD at %L is zero", &a
->where
);
3693 gfc_free_expr (result
);
3694 return &gfc_bad_expr
;
3696 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
3700 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
3702 /* Result is processor-dependent. */
3703 gfc_error ("Second argument of MOD at %L is zero", &p
->where
);
3704 gfc_free_expr (result
);
3705 return &gfc_bad_expr
;
3708 gfc_set_model_kind (kind
);
3710 mpfr_div (tmp
, a
->value
.real
, p
->value
.real
, GFC_RND_MODE
);
3711 mpfr_trunc (tmp
, tmp
);
3712 mpfr_mul (tmp
, tmp
, p
->value
.real
, GFC_RND_MODE
);
3713 mpfr_sub (result
->value
.real
, a
->value
.real
, tmp
, GFC_RND_MODE
);
3718 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
3721 return range_check (result
, "MOD");
3726 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
3732 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
3735 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
3736 result
= gfc_constant_result (a
->ts
.type
, kind
, &a
->where
);
3741 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
3743 /* Result is processor-dependent. This processor just opts
3744 to not handle it at all. */
3745 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
3746 gfc_free_expr (result
);
3747 return &gfc_bad_expr
;
3749 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
3754 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
3756 /* Result is processor-dependent. */
3757 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
3758 gfc_free_expr (result
);
3759 return &gfc_bad_expr
;
3762 gfc_set_model_kind (kind
);
3764 mpfr_div (tmp
, a
->value
.real
, p
->value
.real
, GFC_RND_MODE
);
3765 mpfr_floor (tmp
, tmp
);
3766 mpfr_mul (tmp
, tmp
, p
->value
.real
, GFC_RND_MODE
);
3767 mpfr_sub (result
->value
.real
, a
->value
.real
, tmp
, GFC_RND_MODE
);
3772 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
3775 return range_check (result
, "MODULO");
3779 /* Exists for the sole purpose of consistency with other intrinsics. */
3781 gfc_simplify_mvbits (gfc_expr
*f ATTRIBUTE_UNUSED
,
3782 gfc_expr
*fp ATTRIBUTE_UNUSED
,
3783 gfc_expr
*l ATTRIBUTE_UNUSED
,
3784 gfc_expr
*to ATTRIBUTE_UNUSED
,
3785 gfc_expr
*tp ATTRIBUTE_UNUSED
)
3792 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
3795 mp_exp_t emin
, emax
;
3798 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3801 if (mpfr_sgn (s
->value
.real
) == 0)
3803 gfc_error ("Second argument of NEAREST at %L shall not be zero",
3805 return &gfc_bad_expr
;
3808 result
= gfc_copy_expr (x
);
3810 /* Save current values of emin and emax. */
3811 emin
= mpfr_get_emin ();
3812 emax
= mpfr_get_emax ();
3814 /* Set emin and emax for the current model number. */
3815 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
3816 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
3817 mpfr_get_prec(result
->value
.real
) + 1);
3818 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
3819 mpfr_check_range (result
->value
.real
, 0, GMP_RNDU
);
3821 if (mpfr_sgn (s
->value
.real
) > 0)
3823 mpfr_nextabove (result
->value
.real
);
3824 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
3828 mpfr_nextbelow (result
->value
.real
);
3829 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
3832 mpfr_set_emin (emin
);
3833 mpfr_set_emax (emax
);
3835 /* Only NaN can occur. Do not use range check as it gives an
3836 error for denormal numbers. */
3837 if (mpfr_nan_p (result
->value
.real
) && gfc_option
.flag_range_check
)
3839 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
3840 gfc_free_expr (result
);
3841 return &gfc_bad_expr
;
3849 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
3851 gfc_expr
*itrunc
, *result
;
3854 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
3856 return &gfc_bad_expr
;
3858 if (e
->expr_type
!= EXPR_CONSTANT
)
3861 result
= gfc_constant_result (BT_INTEGER
, kind
, &e
->where
);
3863 itrunc
= gfc_copy_expr (e
);
3865 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
3867 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
3869 gfc_free_expr (itrunc
);
3871 return range_check (result
, name
);
3876 gfc_simplify_new_line (gfc_expr
*e
)
3880 result
= gfc_constant_result (BT_CHARACTER
, e
->ts
.kind
, &e
->where
);
3881 result
->value
.character
.string
= gfc_get_wide_string (2);
3882 result
->value
.character
.length
= 1;
3883 result
->value
.character
.string
[0] = '\n';
3884 result
->value
.character
.string
[1] = '\0'; /* For debugger */
3890 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
3892 return simplify_nint ("NINT", e
, k
);
3897 gfc_simplify_idnint (gfc_expr
*e
)
3899 return simplify_nint ("IDNINT", e
, NULL
);
3904 gfc_simplify_not (gfc_expr
*e
)
3908 if (e
->expr_type
!= EXPR_CONSTANT
)
3911 result
= gfc_constant_result (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3913 mpz_com (result
->value
.integer
, e
->value
.integer
);
3915 return range_check (result
, "NOT");
3920 gfc_simplify_null (gfc_expr
*mold
)
3926 result
= gfc_get_expr ();
3927 result
->ts
.type
= BT_UNKNOWN
;
3930 result
= gfc_copy_expr (mold
);
3931 result
->expr_type
= EXPR_NULL
;
3938 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
3943 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3946 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
3947 if (x
->ts
.type
== BT_INTEGER
)
3949 result
= gfc_constant_result (BT_INTEGER
, kind
, &x
->where
);
3950 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3951 return range_check (result
, "OR");
3953 else /* BT_LOGICAL */
3955 result
= gfc_constant_result (BT_LOGICAL
, kind
, &x
->where
);
3956 result
->value
.logical
= x
->value
.logical
|| y
->value
.logical
;
3963 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
3966 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
3968 if (!is_constant_array_expr(array
)
3969 || !is_constant_array_expr(vector
)
3970 || (!gfc_is_constant_expr (mask
)
3971 && !is_constant_array_expr(mask
)))
3974 result
= gfc_start_constructor (array
->ts
.type
,
3978 array_ctor
= array
->value
.constructor
;
3979 vector_ctor
= vector
? vector
->value
.constructor
: NULL
;
3981 if (mask
->expr_type
== EXPR_CONSTANT
3982 && mask
->value
.logical
)
3984 /* Copy all elements of ARRAY to RESULT. */
3987 gfc_append_constructor (result
,
3988 gfc_copy_expr (array_ctor
->expr
));
3990 ADVANCE (array_ctor
, 1);
3991 ADVANCE (vector_ctor
, 1);
3994 else if (mask
->expr_type
== EXPR_ARRAY
)
3996 /* Copy only those elements of ARRAY to RESULT whose
3997 MASK equals .TRUE.. */
3998 mask_ctor
= mask
->value
.constructor
;
4001 if (mask_ctor
->expr
->value
.logical
)
4003 gfc_append_constructor (result
,
4004 gfc_copy_expr (array_ctor
->expr
));
4005 ADVANCE (vector_ctor
, 1);
4008 ADVANCE (array_ctor
, 1);
4009 ADVANCE (mask_ctor
, 1);
4013 /* Append any left-over elements from VECTOR to RESULT. */
4016 gfc_append_constructor (result
,
4017 gfc_copy_expr (vector_ctor
->expr
));
4018 ADVANCE (vector_ctor
, 1);
4021 result
->shape
= gfc_get_shape (1);
4022 gfc_array_size (result
, &result
->shape
[0]);
4024 if (array
->ts
.type
== BT_CHARACTER
)
4025 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
4032 gfc_simplify_precision (gfc_expr
*e
)
4037 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4039 result
= gfc_int_expr (gfc_real_kinds
[i
].precision
);
4040 result
->where
= e
->where
;
4047 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
4051 if (!is_constant_array_expr (array
)
4052 || !gfc_is_constant_expr (dim
))
4056 && !is_constant_array_expr (mask
)
4057 && mask
->expr_type
!= EXPR_CONSTANT
)
4060 result
= transformational_result (array
, dim
, array
->ts
.type
,
4061 array
->ts
.kind
, &array
->where
);
4062 init_result_expr (result
, 1, NULL
);
4064 return !dim
|| array
->rank
== 1 ?
4065 simplify_transformation_to_scalar (result
, array
, mask
, gfc_multiply
) :
4066 simplify_transformation_to_array (result
, array
, dim
, mask
, gfc_multiply
);
4071 gfc_simplify_radix (gfc_expr
*e
)
4076 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4080 i
= gfc_integer_kinds
[i
].radix
;
4084 i
= gfc_real_kinds
[i
].radix
;
4091 result
= gfc_int_expr (i
);
4092 result
->where
= e
->where
;
4099 gfc_simplify_range (gfc_expr
*e
)
4105 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4110 j
= gfc_integer_kinds
[i
].range
;
4115 j
= gfc_real_kinds
[i
].range
;
4122 result
= gfc_int_expr (j
);
4123 result
->where
= e
->where
;
4130 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
4132 gfc_expr
*result
= NULL
;
4135 if (e
->ts
.type
== BT_COMPLEX
)
4136 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
4138 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
4141 return &gfc_bad_expr
;
4143 if (e
->expr_type
!= EXPR_CONSTANT
)
4150 result
= gfc_int2real (e
, kind
);
4154 result
= gfc_real2real (e
, kind
);
4158 result
= gfc_complex2real (e
, kind
);
4162 gfc_internal_error ("bad type in REAL");
4166 if (e
->ts
.type
== BT_INTEGER
&& e
->is_boz
)
4172 result
= gfc_copy_expr (e
);
4173 if (!gfc_convert_boz (result
, &ts
))
4175 gfc_free_expr (result
);
4176 return &gfc_bad_expr
;
4180 return range_check (result
, "REAL");
4185 gfc_simplify_realpart (gfc_expr
*e
)
4189 if (e
->expr_type
!= EXPR_CONSTANT
)
4192 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
4193 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
4194 return range_check (result
, "REALPART");
4198 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
4201 int i
, j
, len
, ncop
, nlen
;
4203 bool have_length
= false;
4205 /* If NCOPIES isn't a constant, there's nothing we can do. */
4206 if (n
->expr_type
!= EXPR_CONSTANT
)
4209 /* If NCOPIES is negative, it's an error. */
4210 if (mpz_sgn (n
->value
.integer
) < 0)
4212 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4214 return &gfc_bad_expr
;
4217 /* If we don't know the character length, we can do no more. */
4218 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
4219 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
4221 len
= mpz_get_si (e
->ts
.u
.cl
->length
->value
.integer
);
4224 else if (e
->expr_type
== EXPR_CONSTANT
4225 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
4227 len
= e
->value
.character
.length
;
4232 /* If the source length is 0, any value of NCOPIES is valid
4233 and everything behaves as if NCOPIES == 0. */
4236 mpz_set_ui (ncopies
, 0);
4238 mpz_set (ncopies
, n
->value
.integer
);
4240 /* Check that NCOPIES isn't too large. */
4246 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4248 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
4252 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
4253 e
->ts
.u
.cl
->length
->value
.integer
);
4257 mpz_init_set_si (mlen
, len
);
4258 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
4262 /* The check itself. */
4263 if (mpz_cmp (ncopies
, max
) > 0)
4266 mpz_clear (ncopies
);
4267 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4269 return &gfc_bad_expr
;
4274 mpz_clear (ncopies
);
4276 /* For further simplification, we need the character string to be
4278 if (e
->expr_type
!= EXPR_CONSTANT
)
4282 (e
->ts
.u
.cl
->length
&&
4283 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
)) != 0)
4285 const char *res
= gfc_extract_int (n
, &ncop
);
4286 gcc_assert (res
== NULL
);
4291 len
= e
->value
.character
.length
;
4294 result
= gfc_constant_result (BT_CHARACTER
, e
->ts
.kind
, &e
->where
);
4298 result
->value
.character
.string
= gfc_get_wide_string (1);
4299 result
->value
.character
.length
= 0;
4300 result
->value
.character
.string
[0] = '\0';
4304 result
->value
.character
.length
= nlen
;
4305 result
->value
.character
.string
= gfc_get_wide_string (nlen
+ 1);
4307 for (i
= 0; i
< ncop
; i
++)
4308 for (j
= 0; j
< len
; j
++)
4309 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
4311 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
4316 /* This one is a bear, but mainly has to do with shuffling elements. */
4319 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
4320 gfc_expr
*pad
, gfc_expr
*order_exp
)
4322 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
4323 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
4324 gfc_constructor
*head
, *tail
;
4330 /* Check that argument expression types are OK. */
4331 if (!is_constant_array_expr (source
)
4332 || !is_constant_array_expr (shape_exp
)
4333 || !is_constant_array_expr (pad
)
4334 || !is_constant_array_expr (order_exp
))
4337 /* Proceed with simplification, unpacking the array. */
4345 e
= gfc_get_array_element (shape_exp
, rank
);
4349 gfc_extract_int (e
, &shape
[rank
]);
4351 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
4352 gcc_assert (shape
[rank
] >= 0);
4358 gcc_assert (rank
> 0);
4360 /* Now unpack the order array if present. */
4361 if (order_exp
== NULL
)
4363 for (i
= 0; i
< rank
; i
++)
4368 for (i
= 0; i
< rank
; i
++)
4371 for (i
= 0; i
< rank
; i
++)
4373 e
= gfc_get_array_element (order_exp
, i
);
4376 gfc_extract_int (e
, &order
[i
]);
4379 gcc_assert (order
[i
] >= 1 && order
[i
] <= rank
);
4381 gcc_assert (x
[order
[i
]] == 0);
4386 /* Count the elements in the source and padding arrays. */
4391 gfc_array_size (pad
, &size
);
4392 npad
= mpz_get_ui (size
);
4396 gfc_array_size (source
, &size
);
4397 nsource
= mpz_get_ui (size
);
4400 /* If it weren't for that pesky permutation we could just loop
4401 through the source and round out any shortage with pad elements.
4402 But no, someone just had to have the compiler do something the
4403 user should be doing. */
4405 for (i
= 0; i
< rank
; i
++)
4408 while (nsource
> 0 || npad
> 0)
4410 /* Figure out which element to extract. */
4411 mpz_set_ui (index
, 0);
4413 for (i
= rank
- 1; i
>= 0; i
--)
4415 mpz_add_ui (index
, index
, x
[order
[i
]]);
4417 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
4420 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
4421 gfc_internal_error ("Reshaped array too large at %C");
4423 j
= mpz_get_ui (index
);
4426 e
= gfc_get_array_element (source
, j
);
4429 gcc_assert (npad
> 0);
4433 e
= gfc_get_array_element (pad
, j
);
4438 head
= tail
= gfc_get_constructor ();
4441 tail
->next
= gfc_get_constructor ();
4445 tail
->where
= e
->where
;
4448 /* Calculate the next element. */
4452 if (++x
[i
] < shape
[i
])
4463 e
= gfc_get_expr ();
4464 e
->where
= source
->where
;
4465 e
->expr_type
= EXPR_ARRAY
;
4466 e
->value
.constructor
= head
;
4467 e
->shape
= gfc_get_shape (rank
);
4469 for (i
= 0; i
< rank
; i
++)
4470 mpz_init_set_ui (e
->shape
[i
], shape
[i
]);
4480 gfc_simplify_rrspacing (gfc_expr
*x
)
4486 if (x
->expr_type
!= EXPR_CONSTANT
)
4489 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
4491 result
= gfc_constant_result (BT_REAL
, x
->ts
.kind
, &x
->where
);
4493 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4495 /* Special case x = -0 and 0. */
4496 if (mpfr_sgn (result
->value
.real
) == 0)
4498 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
4502 /* | x * 2**(-e) | * 2**p. */
4503 e
= - (long int) mpfr_get_exp (x
->value
.real
);
4504 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
4506 p
= (long int) gfc_real_kinds
[i
].digits
;
4507 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
4509 return range_check (result
, "RRSPACING");
4514 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
4516 int k
, neg_flag
, power
, exp_range
;
4517 mpfr_t scale
, radix
;
4520 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
4523 result
= gfc_constant_result (BT_REAL
, x
->ts
.kind
, &x
->where
);
4525 if (mpfr_sgn (x
->value
.real
) == 0)
4527 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
4531 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
4533 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
4535 /* This check filters out values of i that would overflow an int. */
4536 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
4537 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
4539 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
4540 gfc_free_expr (result
);
4541 return &gfc_bad_expr
;
4544 /* Compute scale = radix ** power. */
4545 power
= mpz_get_si (i
->value
.integer
);
4555 gfc_set_model_kind (x
->ts
.kind
);
4558 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
4559 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
4562 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
4564 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
4566 mpfr_clears (scale
, radix
, NULL
);
4568 return range_check (result
, "SCALE");
4572 /* Variants of strspn and strcspn that operate on wide characters. */
4575 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
4578 const gfc_char_t
*c
;
4582 for (c
= s2
; *c
; c
++)
4596 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
4599 const gfc_char_t
*c
;
4603 for (c
= s2
; *c
; c
++)
4618 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
4623 size_t indx
, len
, lenc
;
4624 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
4627 return &gfc_bad_expr
;
4629 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
)
4632 if (b
!= NULL
&& b
->value
.logical
!= 0)
4637 result
= gfc_constant_result (BT_INTEGER
, k
, &e
->where
);
4639 len
= e
->value
.character
.length
;
4640 lenc
= c
->value
.character
.length
;
4642 if (len
== 0 || lenc
== 0)
4650 indx
= wide_strcspn (e
->value
.character
.string
,
4651 c
->value
.character
.string
) + 1;
4658 for (indx
= len
; indx
> 0; indx
--)
4660 for (i
= 0; i
< lenc
; i
++)
4662 if (c
->value
.character
.string
[i
]
4663 == e
->value
.character
.string
[indx
- 1])
4671 mpz_set_ui (result
->value
.integer
, indx
);
4672 return range_check (result
, "SCAN");
4677 gfc_simplify_selected_char_kind (gfc_expr
*e
)
4682 if (e
->expr_type
!= EXPR_CONSTANT
)
4685 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
4686 || gfc_compare_with_Cstring (e
, "default", false) == 0)
4688 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
4693 result
= gfc_int_expr (kind
);
4694 result
->where
= e
->where
;
4701 gfc_simplify_selected_int_kind (gfc_expr
*e
)
4706 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
) != NULL
)
4711 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
4712 if (gfc_integer_kinds
[i
].range
>= range
4713 && gfc_integer_kinds
[i
].kind
< kind
)
4714 kind
= gfc_integer_kinds
[i
].kind
;
4716 if (kind
== INT_MAX
)
4719 result
= gfc_int_expr (kind
);
4720 result
->where
= e
->where
;
4727 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
)
4729 int range
, precision
, i
, kind
, found_precision
, found_range
;
4736 if (p
->expr_type
!= EXPR_CONSTANT
4737 || gfc_extract_int (p
, &precision
) != NULL
)
4745 if (q
->expr_type
!= EXPR_CONSTANT
4746 || gfc_extract_int (q
, &range
) != NULL
)
4751 found_precision
= 0;
4754 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
4756 if (gfc_real_kinds
[i
].precision
>= precision
)
4757 found_precision
= 1;
4759 if (gfc_real_kinds
[i
].range
>= range
)
4762 if (gfc_real_kinds
[i
].precision
>= precision
4763 && gfc_real_kinds
[i
].range
>= range
&& gfc_real_kinds
[i
].kind
< kind
)
4764 kind
= gfc_real_kinds
[i
].kind
;
4767 if (kind
== INT_MAX
)
4771 if (!found_precision
)
4777 result
= gfc_int_expr (kind
);
4778 result
->where
= (p
!= NULL
) ? p
->where
: q
->where
;
4785 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
4788 mpfr_t exp
, absv
, log2
, pow2
, frac
;
4791 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
4794 result
= gfc_constant_result (BT_REAL
, x
->ts
.kind
, &x
->where
);
4796 if (mpfr_sgn (x
->value
.real
) == 0)
4798 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
4802 gfc_set_model_kind (x
->ts
.kind
);
4809 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
4810 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
4812 mpfr_trunc (log2
, log2
);
4813 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
4815 /* Old exponent value, and fraction. */
4816 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
4818 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
4821 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
4822 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
4824 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
4826 return range_check (result
, "SET_EXPONENT");
4831 gfc_simplify_shape (gfc_expr
*source
)
4833 mpz_t shape
[GFC_MAX_DIMENSIONS
];
4834 gfc_expr
*result
, *e
, *f
;
4839 if (source
->rank
== 0)
4840 return gfc_start_constructor (BT_INTEGER
, gfc_default_integer_kind
,
4843 if (source
->expr_type
!= EXPR_VARIABLE
)
4846 result
= gfc_start_constructor (BT_INTEGER
, gfc_default_integer_kind
,
4849 ar
= gfc_find_array_ref (source
);
4851 t
= gfc_array_ref_shape (ar
, shape
);
4853 for (n
= 0; n
< source
->rank
; n
++)
4855 e
= gfc_constant_result (BT_INTEGER
, gfc_default_integer_kind
,
4860 mpz_set (e
->value
.integer
, shape
[n
]);
4861 mpz_clear (shape
[n
]);
4865 mpz_set_ui (e
->value
.integer
, n
+ 1);
4867 f
= gfc_simplify_size (source
, e
, NULL
);
4871 gfc_free_expr (result
);
4880 gfc_append_constructor (result
, e
);
4888 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4893 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
4896 return &gfc_bad_expr
;
4900 if (gfc_array_size (array
, &size
) == FAILURE
)
4905 if (dim
->expr_type
!= EXPR_CONSTANT
)
4908 d
= mpz_get_ui (dim
->value
.integer
) - 1;
4909 if (gfc_array_dimen_size (array
, d
, &size
) == FAILURE
)
4913 result
= gfc_constant_result (BT_INTEGER
, k
, &array
->where
);
4914 mpz_set (result
->value
.integer
, size
);
4920 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
4924 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
4927 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4932 mpz_abs (result
->value
.integer
, x
->value
.integer
);
4933 if (mpz_sgn (y
->value
.integer
) < 0)
4934 mpz_neg (result
->value
.integer
, result
->value
.integer
);
4938 if (gfc_option
.flag_sign_zero
)
4939 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
4942 mpfr_setsign (result
->value
.real
, x
->value
.real
,
4943 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
4947 gfc_internal_error ("Bad type in gfc_simplify_sign");
4955 gfc_simplify_sin (gfc_expr
*x
)
4959 if (x
->expr_type
!= EXPR_CONSTANT
)
4962 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4967 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4971 gfc_set_model (x
->value
.real
);
4972 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
4976 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
4979 return range_check (result
, "SIN");
4984 gfc_simplify_sinh (gfc_expr
*x
)
4988 if (x
->expr_type
!= EXPR_CONSTANT
)
4991 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4993 if (x
->ts
.type
== BT_REAL
)
4994 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4995 else if (x
->ts
.type
== BT_COMPLEX
)
4996 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5001 return range_check (result
, "SINH");
5005 /* The argument is always a double precision real that is converted to
5006 single precision. TODO: Rounding! */
5009 gfc_simplify_sngl (gfc_expr
*a
)
5013 if (a
->expr_type
!= EXPR_CONSTANT
)
5016 result
= gfc_real2real (a
, gfc_default_real_kind
);
5017 return range_check (result
, "SNGL");
5022 gfc_simplify_spacing (gfc_expr
*x
)
5028 if (x
->expr_type
!= EXPR_CONSTANT
)
5031 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
5033 result
= gfc_constant_result (BT_REAL
, x
->ts
.kind
, &x
->where
);
5035 /* Special case x = 0 and -0. */
5036 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5037 if (mpfr_sgn (result
->value
.real
) == 0)
5039 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
5043 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5044 are the radix, exponent of x, and precision. This excludes the
5045 possibility of subnormal numbers. Fortran 2003 states the result is
5046 b**max(e - p, emin - 1). */
5048 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
5049 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
5050 en
= en
> ep
? en
: ep
;
5052 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
5053 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
5055 return range_check (result
, "SPACING");
5060 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
5062 gfc_expr
*result
= 0L;
5063 int i
, j
, dim
, ncopies
;
5066 if ((!gfc_is_constant_expr (source
)
5067 && !is_constant_array_expr (source
))
5068 || !gfc_is_constant_expr (dim_expr
)
5069 || !gfc_is_constant_expr (ncopies_expr
))
5072 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
5073 gfc_extract_int (dim_expr
, &dim
);
5074 dim
-= 1; /* zero-base DIM */
5076 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
5077 gfc_extract_int (ncopies_expr
, &ncopies
);
5078 ncopies
= MAX (ncopies
, 0);
5080 /* Do not allow the array size to exceed the limit for an array
5082 if (source
->expr_type
== EXPR_ARRAY
)
5084 if (gfc_array_size (source
, &size
) == FAILURE
)
5085 gfc_internal_error ("Failure getting length of a constant array.");
5088 mpz_init_set_ui (size
, 1);
5090 if (mpz_get_si (size
)*ncopies
> gfc_option
.flag_max_array_constructor
)
5093 if (source
->expr_type
== EXPR_CONSTANT
)
5095 gcc_assert (dim
== 0);
5097 result
= gfc_start_constructor (source
->ts
.type
,
5101 result
->shape
= gfc_get_shape (result
->rank
);
5102 mpz_init_set_si (result
->shape
[0], ncopies
);
5104 for (i
= 0; i
< ncopies
; ++i
)
5105 gfc_append_constructor (result
, gfc_copy_expr (source
));
5107 else if (source
->expr_type
== EXPR_ARRAY
)
5109 int result_size
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
5110 gfc_constructor
*ctor
, *source_ctor
, *result_ctor
;
5112 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
5113 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
5115 result
= gfc_start_constructor (source
->ts
.type
,
5118 result
->rank
= source
->rank
+ 1;
5119 result
->shape
= gfc_get_shape (result
->rank
);
5122 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
5125 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
5127 mpz_init_set_si (result
->shape
[i
], ncopies
);
5129 extent
[i
] = mpz_get_si (result
->shape
[i
]);
5130 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
5131 result_size
*= extent
[i
];
5134 for (i
= 0; i
< result_size
; ++i
)
5135 gfc_append_constructor (result
, NULL
);
5137 source_ctor
= source
->value
.constructor
;
5138 result_ctor
= result
->value
.constructor
;
5143 for (i
= 0; i
< ncopies
; ++i
)
5145 ctor
->expr
= gfc_copy_expr (source_ctor
->expr
);
5146 ADVANCE (ctor
, rstride
[dim
]);
5149 ADVANCE (result_ctor
, (dim
== 0 ? ncopies
: 1));
5150 ADVANCE (source_ctor
, 1);
5154 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
5155 Replace NULL with gcc_unreachable() after implementing
5156 gfc_simplify_cshift(). */
5159 if (source
->ts
.type
== BT_CHARACTER
)
5160 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
5167 gfc_simplify_sqrt (gfc_expr
*e
)
5171 if (e
->expr_type
!= EXPR_CONSTANT
)
5174 result
= gfc_constant_result (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
5179 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
5181 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
5186 gfc_set_model (e
->value
.real
);
5187 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
5191 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
5194 return range_check (result
, "SQRT");
5197 gfc_free_expr (result
);
5198 gfc_error ("Argument of SQRT at %L has a negative value", &e
->where
);
5199 return &gfc_bad_expr
;
5204 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
5208 if (!is_constant_array_expr (array
)
5209 || !gfc_is_constant_expr (dim
))
5213 && !is_constant_array_expr (mask
)
5214 && mask
->expr_type
!= EXPR_CONSTANT
)
5217 result
= transformational_result (array
, dim
, array
->ts
.type
,
5218 array
->ts
.kind
, &array
->where
);
5219 init_result_expr (result
, 0, NULL
);
5221 return !dim
|| array
->rank
== 1 ?
5222 simplify_transformation_to_scalar (result
, array
, mask
, gfc_add
) :
5223 simplify_transformation_to_array (result
, array
, dim
, mask
, gfc_add
);
5228 gfc_simplify_tan (gfc_expr
*x
)
5232 if (x
->expr_type
!= EXPR_CONSTANT
)
5235 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5237 if (x
->ts
.type
== BT_REAL
)
5238 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5239 else if (x
->ts
.type
== BT_COMPLEX
)
5240 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5244 return range_check (result
, "TAN");
5249 gfc_simplify_tanh (gfc_expr
*x
)
5253 if (x
->expr_type
!= EXPR_CONSTANT
)
5256 result
= gfc_constant_result (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
5258 if (x
->ts
.type
== BT_REAL
)
5259 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
5260 else if (x
->ts
.type
== BT_COMPLEX
)
5261 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
5265 return range_check (result
, "TANH");
5271 gfc_simplify_tiny (gfc_expr
*e
)
5276 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
5278 result
= gfc_constant_result (BT_REAL
, e
->ts
.kind
, &e
->where
);
5279 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
5286 gfc_simplify_trailz (gfc_expr
*e
)
5289 unsigned long tz
, bs
;
5292 if (e
->expr_type
!= EXPR_CONSTANT
)
5295 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5296 bs
= gfc_integer_kinds
[i
].bit_size
;
5297 tz
= mpz_scan1 (e
->value
.integer
, 0);
5299 result
= gfc_constant_result (BT_INTEGER
, gfc_default_integer_kind
, &e
->where
);
5300 mpz_set_ui (result
->value
.integer
, MIN (tz
, bs
));
5307 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
5310 gfc_expr
*mold_element
;
5313 size_t result_elt_size
;
5316 unsigned char *buffer
;
5318 if (!gfc_is_constant_expr (source
)
5319 || (gfc_init_expr
&& !gfc_is_constant_expr (mold
))
5320 || !gfc_is_constant_expr (size
))
5323 if (source
->expr_type
== EXPR_FUNCTION
)
5326 /* Calculate the size of the source. */
5327 if (source
->expr_type
== EXPR_ARRAY
5328 && gfc_array_size (source
, &tmp
) == FAILURE
)
5329 gfc_internal_error ("Failure getting length of a constant array.");
5331 source_size
= gfc_target_expr_size (source
);
5333 /* Create an empty new expression with the appropriate characteristics. */
5334 result
= gfc_constant_result (mold
->ts
.type
, mold
->ts
.kind
,
5336 result
->ts
= mold
->ts
;
5338 mold_element
= mold
->expr_type
== EXPR_ARRAY
5339 ? mold
->value
.constructor
->expr
5342 /* Set result character length, if needed. Note that this needs to be
5343 set even for array expressions, in order to pass this information into
5344 gfc_target_interpret_expr. */
5345 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
5346 result
->value
.character
.length
= mold_element
->value
.character
.length
;
5348 /* Set the number of elements in the result, and determine its size. */
5349 result_elt_size
= gfc_target_expr_size (mold_element
);
5350 if (result_elt_size
== 0)
5352 gfc_free_expr (result
);
5356 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
5360 result
->expr_type
= EXPR_ARRAY
;
5364 result_length
= (size_t)mpz_get_ui (size
->value
.integer
);
5367 result_length
= source_size
/ result_elt_size
;
5368 if (result_length
* result_elt_size
< source_size
)
5372 result
->shape
= gfc_get_shape (1);
5373 mpz_init_set_ui (result
->shape
[0], result_length
);
5375 result_size
= result_length
* result_elt_size
;
5380 result_size
= result_elt_size
;
5383 if (gfc_option
.warn_surprising
&& source_size
< result_size
)
5384 gfc_warning("Intrinsic TRANSFER at %L has partly undefined result: "
5385 "source size %ld < result size %ld", &source
->where
,
5386 (long) source_size
, (long) result_size
);
5388 /* Allocate the buffer to store the binary version of the source. */
5389 buffer_size
= MAX (source_size
, result_size
);
5390 buffer
= (unsigned char*)alloca (buffer_size
);
5391 memset (buffer
, 0, buffer_size
);
5393 /* Now write source to the buffer. */
5394 gfc_target_encode_expr (source
, buffer
, buffer_size
);
5396 /* And read the buffer back into the new expression. */
5397 gfc_target_interpret_expr (buffer
, buffer_size
, result
);
5404 gfc_simplify_transpose (gfc_expr
*matrix
)
5408 gfc_constructor
*matrix_ctor
;
5410 if (!is_constant_array_expr (matrix
))
5413 gcc_assert (matrix
->rank
== 2);
5415 result
= gfc_start_constructor (matrix
->ts
.type
, matrix
->ts
.kind
, &matrix
->where
);
5417 result
->shape
= gfc_get_shape (result
->rank
);
5418 mpz_set (result
->shape
[0], matrix
->shape
[1]);
5419 mpz_set (result
->shape
[1], matrix
->shape
[0]);
5421 if (matrix
->ts
.type
== BT_CHARACTER
)
5422 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
5424 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
5425 matrix_ctor
= matrix
->value
.constructor
;
5426 for (i
= 0; i
< matrix_rows
; ++i
)
5428 gfc_constructor
*column_ctor
= matrix_ctor
;
5431 gfc_append_constructor (result
,
5432 gfc_copy_expr (column_ctor
->expr
));
5434 ADVANCE (column_ctor
, matrix_rows
);
5437 ADVANCE (matrix_ctor
, 1);
5445 gfc_simplify_trim (gfc_expr
*e
)
5448 int count
, i
, len
, lentrim
;
5450 if (e
->expr_type
!= EXPR_CONSTANT
)
5453 len
= e
->value
.character
.length
;
5455 result
= gfc_constant_result (BT_CHARACTER
, e
->ts
.kind
, &e
->where
);
5457 for (count
= 0, i
= 1; i
<= len
; ++i
)
5459 if (e
->value
.character
.string
[len
- i
] == ' ')
5465 lentrim
= len
- count
;
5467 result
->value
.character
.length
= lentrim
;
5468 result
->value
.character
.string
= gfc_get_wide_string (lentrim
+ 1);
5470 for (i
= 0; i
< lentrim
; i
++)
5471 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
5473 result
->value
.character
.string
[lentrim
] = '\0'; /* For debugger */
5480 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
5482 return simplify_bound (array
, dim
, kind
, 1);
5487 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
5489 gfc_expr
*result
, *e
;
5490 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
5492 if (!is_constant_array_expr (vector
)
5493 || !is_constant_array_expr (mask
)
5494 || (!gfc_is_constant_expr (field
)
5495 && !is_constant_array_expr(field
)))
5498 result
= gfc_start_constructor (vector
->ts
.type
,
5501 result
->rank
= mask
->rank
;
5502 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
5504 if (vector
->ts
.type
== BT_CHARACTER
)
5505 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
5507 vector_ctor
= vector
->value
.constructor
;
5508 mask_ctor
= mask
->value
.constructor
;
5509 field_ctor
= field
->expr_type
== EXPR_ARRAY
? field
->value
.constructor
: NULL
;
5513 if (mask_ctor
->expr
->value
.logical
)
5515 gcc_assert (vector_ctor
);
5516 e
= gfc_copy_expr (vector_ctor
->expr
);
5517 ADVANCE (vector_ctor
, 1);
5519 else if (field
->expr_type
== EXPR_ARRAY
)
5520 e
= gfc_copy_expr (field_ctor
->expr
);
5522 e
= gfc_copy_expr (field
);
5524 gfc_append_constructor (result
, e
);
5526 ADVANCE (mask_ctor
, 1);
5527 ADVANCE (field_ctor
, 1);
5535 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
5539 size_t index
, len
, lenset
;
5541 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
5544 return &gfc_bad_expr
;
5546 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
)
5549 if (b
!= NULL
&& b
->value
.logical
!= 0)
5554 result
= gfc_constant_result (BT_INTEGER
, k
, &s
->where
);
5556 len
= s
->value
.character
.length
;
5557 lenset
= set
->value
.character
.length
;
5561 mpz_set_ui (result
->value
.integer
, 0);
5569 mpz_set_ui (result
->value
.integer
, 1);
5573 index
= wide_strspn (s
->value
.character
.string
,
5574 set
->value
.character
.string
) + 1;
5583 mpz_set_ui (result
->value
.integer
, len
);
5586 for (index
= len
; index
> 0; index
--)
5588 for (i
= 0; i
< lenset
; i
++)
5590 if (s
->value
.character
.string
[index
- 1]
5591 == set
->value
.character
.string
[i
])
5599 mpz_set_ui (result
->value
.integer
, index
);
5605 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
5610 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
5613 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
5614 if (x
->ts
.type
== BT_INTEGER
)
5616 result
= gfc_constant_result (BT_INTEGER
, kind
, &x
->where
);
5617 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
5618 return range_check (result
, "XOR");
5620 else /* BT_LOGICAL */
5622 result
= gfc_constant_result (BT_LOGICAL
, kind
, &x
->where
);
5623 result
->value
.logical
= (x
->value
.logical
&& !y
->value
.logical
)
5624 || (!x
->value
.logical
&& y
->value
.logical
);
5631 /****************** Constant simplification *****************/
5633 /* Master function to convert one constant to another. While this is
5634 used as a simplification function, it requires the destination type
5635 and kind information which is supplied by a special case in
5639 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
5641 gfc_expr
*g
, *result
, *(*f
) (gfc_expr
*, int);
5642 gfc_constructor
*head
, *c
, *tail
= NULL
;
5656 f
= gfc_int2complex
;
5676 f
= gfc_real2complex
;
5687 f
= gfc_complex2int
;
5690 f
= gfc_complex2real
;
5693 f
= gfc_complex2complex
;
5719 f
= gfc_hollerith2int
;
5723 f
= gfc_hollerith2real
;
5727 f
= gfc_hollerith2complex
;
5731 f
= gfc_hollerith2character
;
5735 f
= gfc_hollerith2logical
;
5745 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
5750 switch (e
->expr_type
)
5753 result
= f (e
, kind
);
5755 return &gfc_bad_expr
;
5759 if (!gfc_is_constant_expr (e
))
5764 for (c
= e
->value
.constructor
; c
; c
= c
->next
)
5767 head
= tail
= gfc_get_constructor ();
5770 tail
->next
= gfc_get_constructor ();
5774 tail
->where
= c
->where
;
5776 if (c
->iterator
== NULL
)
5777 tail
->expr
= f (c
->expr
, kind
);
5780 g
= gfc_convert_constant (c
->expr
, type
, kind
);
5781 if (g
== &gfc_bad_expr
)
5786 if (tail
->expr
== NULL
)
5788 gfc_free_constructor (head
);
5793 result
= gfc_get_expr ();
5794 result
->ts
.type
= type
;
5795 result
->ts
.kind
= kind
;
5796 result
->expr_type
= EXPR_ARRAY
;
5797 result
->value
.constructor
= head
;
5798 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
5799 result
->where
= e
->where
;
5800 result
->rank
= e
->rank
;
5811 /* Function for converting character constants. */
5813 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
5818 if (!gfc_is_constant_expr (e
))
5821 if (e
->expr_type
== EXPR_CONSTANT
)
5823 /* Simple case of a scalar. */
5824 result
= gfc_constant_result (BT_CHARACTER
, kind
, &e
->where
);
5826 return &gfc_bad_expr
;
5828 result
->value
.character
.length
= e
->value
.character
.length
;
5829 result
->value
.character
.string
5830 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
5831 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
5832 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
5834 /* Check we only have values representable in the destination kind. */
5835 for (i
= 0; i
< result
->value
.character
.length
; i
++)
5836 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
5839 gfc_error ("Character '%s' in string at %L cannot be converted "
5840 "into character kind %d",
5841 gfc_print_wide_char (result
->value
.character
.string
[i
]),
5843 return &gfc_bad_expr
;
5848 else if (e
->expr_type
== EXPR_ARRAY
)
5850 /* For an array constructor, we convert each constructor element. */
5851 gfc_constructor
*head
= NULL
, *tail
= NULL
, *c
;
5853 for (c
= e
->value
.constructor
; c
; c
= c
->next
)
5856 head
= tail
= gfc_get_constructor ();
5859 tail
->next
= gfc_get_constructor ();
5863 tail
->where
= c
->where
;
5864 tail
->expr
= gfc_convert_char_constant (c
->expr
, type
, kind
);
5865 if (tail
->expr
== &gfc_bad_expr
)
5868 return &gfc_bad_expr
;
5871 if (tail
->expr
== NULL
)
5873 gfc_free_constructor (head
);
5878 result
= gfc_get_expr ();
5879 result
->ts
.type
= type
;
5880 result
->ts
.kind
= kind
;
5881 result
->expr_type
= EXPR_ARRAY
;
5882 result
->value
.constructor
= head
;
5883 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
5884 result
->where
= e
->where
;
5885 result
->rank
= e
->rank
;
5886 result
->ts
.u
.cl
= e
->ts
.u
.cl
;