1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
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 2, 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 COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
28 #include "intrinsic.h"
30 gfc_expr gfc_bad_expr;
33 /* Note that 'simplification' is not just transforming expressions.
34 For functions that are not simplified at compile time, range
35 checking is done if possible.
37 The return convention is that each simplification function returns:
39 A new expression node corresponding to the simplified arguments.
40 The original arguments are destroyed by the caller, and must not
41 be a part of the new expression.
43 NULL pointer indicating that no simplification was possible and
44 the original expression should remain intact. If the
45 simplification function sets the type and/or the function name
46 via the pointer gfc_simple_expression, then this type is
49 An expression pointer to gfc_bad_expr (a static placeholder)
50 indicating that some error has prevented simplification. For
51 example, sqrt(-1.0). The error is generated within the function
52 and should be propagated upwards
54 By the time a simplification function gets control, it has been
55 decided that the function call is really supposed to be the
56 intrinsic. No type checking is strictly necessary, since only
57 valid types will be passed on. On the other hand, a simplification
58 subroutine may have to look at the type of an argument as part of
61 Array arguments are never passed to these subroutines.
63 The functions in this file don't have much comment with them, but
64 everything is reasonably straight-forward. The Standard, chapter 13
65 is the best comment you'll find for this file anyway. */
67 /* Static table for converting non-ascii character sets to ascii.
68 The xascii_table[] is the inverse table. */
70 static int ascii_table[256] = {
71 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
72 '\b', '\t', '\n', '\v', '\0', '\r', '\0', '\0',
73 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
74 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
75 ' ', '!', '"', '#', '$', '%', '&', '\'',
76 '(', ')', '*', '+', ',', '-', '.', '/',
77 '0', '1', '2', '3', '4', '5', '6', '7',
78 '8', '9', ':', ';', '<', '=', '>', '?',
79 '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
80 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
81 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
82 'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
83 '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
84 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
85 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
86 'x', 'y', 'z', '{', '|', '}', '~', '\?'
89 static int xascii_table[256];
92 /* Range checks an expression node. If all goes well, returns the
93 node, otherwise returns &gfc_bad_expr and frees the node. */
96 range_check (gfc_expr * result, const char *name)
99 switch (gfc_range_check (result))
105 gfc_error ("Result of %s overflows its kind at %L", name, &result->where);
108 case ARITH_UNDERFLOW:
109 gfc_error ("Result of %s underflows its kind at %L", name, &result->where);
113 gfc_error ("Result of %s is NaN at %L", name, &result->where);
117 gfc_error ("Result of %s gives range error for its kind at %L", name, &result->where);
121 gfc_free_expr (result);
122 return &gfc_bad_expr;
126 /* A helper function that gets an optional and possibly missing
127 kind parameter. Returns the kind, -1 if something went wrong. */
130 get_kind (bt type, gfc_expr * k, const char *name, int default_kind)
137 if (k->expr_type != EXPR_CONSTANT)
139 gfc_error ("KIND parameter of %s at %L must be an initialization "
140 "expression", name, &k->where);
145 if (gfc_extract_int (k, &kind) != NULL
146 || gfc_validate_kind (type, kind, true) < 0)
149 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
157 /* Checks if X, which is assumed to represent a two's complement
158 integer of binary width BITSIZE, has the signbit set. If so, makes
159 X the corresponding negative number. */
162 twos_complement (mpz_t x, int bitsize)
166 if (mpz_tstbit (x, bitsize - 1) == 1)
168 mpz_init_set_ui(mask, 1);
169 mpz_mul_2exp(mask, mask, bitsize);
170 mpz_sub_ui(mask, mask, 1);
172 /* We negate the number by hand, zeroing the high bits, that is
173 make it the corresponding positive number, and then have it
174 negated by GMP, giving the correct representation of the
177 mpz_add_ui (x, x, 1);
178 mpz_and (x, x, mask);
187 /********************** Simplification functions *****************************/
190 gfc_simplify_abs (gfc_expr * e)
194 if (e->expr_type != EXPR_CONSTANT)
200 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
202 mpz_abs (result->value.integer, e->value.integer);
204 result = range_check (result, "IABS");
208 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
210 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
212 result = range_check (result, "ABS");
216 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
218 gfc_set_model_kind (e->ts.kind);
220 mpfr_hypot (result->value.real, e->value.complex.r,
221 e->value.complex.i, GFC_RND_MODE);
222 result = range_check (result, "CABS");
226 gfc_internal_error ("gfc_simplify_abs(): Bad type");
234 gfc_simplify_achar (gfc_expr * e)
239 if (e->expr_type != EXPR_CONSTANT)
242 /* We cannot assume that the native character set is ASCII in this
244 if (gfc_extract_int (e, &index) != NULL || index < 0 || index > 127)
246 gfc_error ("Extended ASCII not implemented: argument of ACHAR at %L "
247 "must be between 0 and 127", &e->where);
248 return &gfc_bad_expr;
251 result = gfc_constant_result (BT_CHARACTER, gfc_default_character_kind,
254 result->value.character.string = gfc_getmem (2);
256 result->value.character.length = 1;
257 result->value.character.string[0] = ascii_table[index];
258 result->value.character.string[1] = '\0'; /* For debugger */
264 gfc_simplify_acos (gfc_expr * x)
268 if (x->expr_type != EXPR_CONSTANT)
271 if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0)
273 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
275 return &gfc_bad_expr;
278 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
280 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
282 return range_check (result, "ACOS");
286 gfc_simplify_acosh (gfc_expr * x)
290 if (x->expr_type != EXPR_CONSTANT)
293 if (mpfr_cmp_si (x->value.real, 1) < 0)
295 gfc_error ("Argument of ACOSH at %L must not be less than 1",
297 return &gfc_bad_expr;
300 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
302 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
304 return range_check (result, "ACOSH");
308 gfc_simplify_adjustl (gfc_expr * e)
314 if (e->expr_type != EXPR_CONSTANT)
317 len = e->value.character.length;
319 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
321 result->value.character.length = len;
322 result->value.character.string = gfc_getmem (len + 1);
324 for (count = 0, i = 0; i < len; ++i)
326 ch = e->value.character.string[i];
332 for (i = 0; i < len - count; ++i)
334 result->value.character.string[i] =
335 e->value.character.string[count + i];
338 for (i = len - count; i < len; ++i)
340 result->value.character.string[i] = ' ';
343 result->value.character.string[len] = '\0'; /* For debugger */
350 gfc_simplify_adjustr (gfc_expr * e)
356 if (e->expr_type != EXPR_CONSTANT)
359 len = e->value.character.length;
361 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
363 result->value.character.length = len;
364 result->value.character.string = gfc_getmem (len + 1);
366 for (count = 0, i = len - 1; i >= 0; --i)
368 ch = e->value.character.string[i];
374 for (i = 0; i < count; ++i)
376 result->value.character.string[i] = ' ';
379 for (i = count; i < len; ++i)
381 result->value.character.string[i] =
382 e->value.character.string[i - count];
385 result->value.character.string[len] = '\0'; /* For debugger */
392 gfc_simplify_aimag (gfc_expr * e)
397 if (e->expr_type != EXPR_CONSTANT)
400 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
401 mpfr_set (result->value.real, e->value.complex.i, GFC_RND_MODE);
403 return range_check (result, "AIMAG");
408 gfc_simplify_aint (gfc_expr * e, gfc_expr * k)
410 gfc_expr *rtrunc, *result;
413 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
415 return &gfc_bad_expr;
417 if (e->expr_type != EXPR_CONSTANT)
420 rtrunc = gfc_copy_expr (e);
422 mpfr_trunc (rtrunc->value.real, e->value.real);
424 result = gfc_real2real (rtrunc, kind);
425 gfc_free_expr (rtrunc);
427 return range_check (result, "AINT");
432 gfc_simplify_dint (gfc_expr * e)
434 gfc_expr *rtrunc, *result;
436 if (e->expr_type != EXPR_CONSTANT)
439 rtrunc = gfc_copy_expr (e);
441 mpfr_trunc (rtrunc->value.real, e->value.real);
443 result = gfc_real2real (rtrunc, gfc_default_double_kind);
444 gfc_free_expr (rtrunc);
446 return range_check (result, "DINT");
451 gfc_simplify_anint (gfc_expr * e, gfc_expr * k)
456 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
458 return &gfc_bad_expr;
460 if (e->expr_type != EXPR_CONSTANT)
463 result = gfc_constant_result (e->ts.type, kind, &e->where);
465 mpfr_round (result->value.real, e->value.real);
467 return range_check (result, "ANINT");
472 gfc_simplify_and (gfc_expr * x, gfc_expr * y)
477 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
480 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
481 if (x->ts.type == BT_INTEGER)
483 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
484 mpz_and (result->value.integer, x->value.integer, y->value.integer);
486 else /* BT_LOGICAL */
488 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
489 result->value.logical = x->value.logical && y->value.logical;
492 return range_check (result, "AND");
497 gfc_simplify_dnint (gfc_expr * e)
501 if (e->expr_type != EXPR_CONSTANT)
504 result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &e->where);
506 mpfr_round (result->value.real, e->value.real);
508 return range_check (result, "DNINT");
513 gfc_simplify_asin (gfc_expr * x)
517 if (x->expr_type != EXPR_CONSTANT)
520 if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0)
522 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
524 return &gfc_bad_expr;
527 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
529 mpfr_asin(result->value.real, x->value.real, GFC_RND_MODE);
531 return range_check (result, "ASIN");
536 gfc_simplify_asinh (gfc_expr * x)
540 if (x->expr_type != EXPR_CONSTANT)
543 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
545 mpfr_asinh(result->value.real, x->value.real, GFC_RND_MODE);
547 return range_check (result, "ASINH");
552 gfc_simplify_atan (gfc_expr * x)
556 if (x->expr_type != EXPR_CONSTANT)
559 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
561 mpfr_atan(result->value.real, x->value.real, GFC_RND_MODE);
563 return range_check (result, "ATAN");
568 gfc_simplify_atanh (gfc_expr * x)
572 if (x->expr_type != EXPR_CONSTANT)
575 if (mpfr_cmp_si (x->value.real, 1) >= 0 ||
576 mpfr_cmp_si (x->value.real, -1) <= 0)
578 gfc_error ("Argument of ATANH at %L must be inside the range -1 to 1",
580 return &gfc_bad_expr;
583 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
585 mpfr_atanh(result->value.real, x->value.real, GFC_RND_MODE);
587 return range_check (result, "ATANH");
592 gfc_simplify_atan2 (gfc_expr * y, gfc_expr * x)
596 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
599 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
601 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
604 ("If first argument of ATAN2 %L is zero, then the second argument "
605 "must not be zero", &x->where);
606 gfc_free_expr (result);
607 return &gfc_bad_expr;
610 arctangent2 (y->value.real, x->value.real, result->value.real);
612 return range_check (result, "ATAN2");
617 gfc_simplify_bit_size (gfc_expr * e)
622 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
623 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
624 mpz_set_ui (result->value.integer, gfc_integer_kinds[i].bit_size);
631 gfc_simplify_btest (gfc_expr * e, gfc_expr * bit)
635 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
638 if (gfc_extract_int (bit, &b) != NULL || b < 0)
639 return gfc_logical_expr (0, &e->where);
641 return gfc_logical_expr (mpz_tstbit (e->value.integer, b), &e->where);
646 gfc_simplify_ceiling (gfc_expr * e, gfc_expr * k)
648 gfc_expr *ceil, *result;
651 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
653 return &gfc_bad_expr;
655 if (e->expr_type != EXPR_CONSTANT)
658 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
660 ceil = gfc_copy_expr (e);
662 mpfr_ceil (ceil->value.real, e->value.real);
663 gfc_mpfr_to_mpz(result->value.integer, ceil->value.real);
665 gfc_free_expr (ceil);
667 return range_check (result, "CEILING");
672 gfc_simplify_char (gfc_expr * e, gfc_expr * k)
677 kind = get_kind (BT_CHARACTER, k, "CHAR", gfc_default_character_kind);
679 return &gfc_bad_expr;
681 if (e->expr_type != EXPR_CONSTANT)
684 if (gfc_extract_int (e, &c) != NULL || c < 0 || c > UCHAR_MAX)
686 gfc_error ("Bad character in CHAR function at %L", &e->where);
687 return &gfc_bad_expr;
690 result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
692 result->value.character.length = 1;
693 result->value.character.string = gfc_getmem (2);
695 result->value.character.string[0] = c;
696 result->value.character.string[1] = '\0'; /* For debugger */
702 /* Common subroutine for simplifying CMPLX and DCMPLX. */
705 simplify_cmplx (const char *name, gfc_expr * x, gfc_expr * y, int kind)
709 result = gfc_constant_result (BT_COMPLEX, kind, &x->where);
711 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
716 mpfr_set_z (result->value.complex.r, x->value.integer, GFC_RND_MODE);
720 mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
724 mpfr_set (result->value.complex.r, x->value.complex.r, GFC_RND_MODE);
725 mpfr_set (result->value.complex.i, x->value.complex.i, GFC_RND_MODE);
729 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
737 mpfr_set_z (result->value.complex.i, y->value.integer, GFC_RND_MODE);
741 mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
745 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
749 return range_check (result, name);
754 gfc_simplify_cmplx (gfc_expr * x, gfc_expr * y, gfc_expr * k)
758 if (x->expr_type != EXPR_CONSTANT
759 || (y != NULL && y->expr_type != EXPR_CONSTANT))
762 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_real_kind);
764 return &gfc_bad_expr;
766 return simplify_cmplx ("CMPLX", x, y, kind);
771 gfc_simplify_complex (gfc_expr * x, gfc_expr * y)
775 if (x->expr_type != EXPR_CONSTANT
776 || (y != NULL && y->expr_type != EXPR_CONSTANT))
779 if (x->ts.type == BT_INTEGER)
781 if (y->ts.type == BT_INTEGER)
782 kind = gfc_default_real_kind;
788 if (y->ts.type == BT_REAL)
789 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
794 return simplify_cmplx ("COMPLEX", x, y, kind);
799 gfc_simplify_conjg (gfc_expr * e)
803 if (e->expr_type != EXPR_CONSTANT)
806 result = gfc_copy_expr (e);
807 mpfr_neg (result->value.complex.i, result->value.complex.i, GFC_RND_MODE);
809 return range_check (result, "CONJG");
814 gfc_simplify_cos (gfc_expr * x)
819 if (x->expr_type != EXPR_CONSTANT)
822 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
827 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
830 gfc_set_model_kind (x->ts.kind);
834 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
835 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
836 mpfr_mul(result->value.complex.r, xp, xq, GFC_RND_MODE);
838 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
839 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
840 mpfr_mul (xp, xp, xq, GFC_RND_MODE);
841 mpfr_neg (result->value.complex.i, xp, GFC_RND_MODE );
847 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
850 return range_check (result, "COS");
856 gfc_simplify_cosh (gfc_expr * x)
860 if (x->expr_type != EXPR_CONSTANT)
863 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
865 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
867 return range_check (result, "COSH");
872 gfc_simplify_dcmplx (gfc_expr * x, gfc_expr * y)
875 if (x->expr_type != EXPR_CONSTANT
876 || (y != NULL && y->expr_type != EXPR_CONSTANT))
879 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
884 gfc_simplify_dble (gfc_expr * e)
888 if (e->expr_type != EXPR_CONSTANT)
894 result = gfc_int2real (e, gfc_default_double_kind);
898 result = gfc_real2real (e, gfc_default_double_kind);
902 result = gfc_complex2real (e, gfc_default_double_kind);
906 gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e->where);
909 return range_check (result, "DBLE");
914 gfc_simplify_digits (gfc_expr * x)
918 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
922 digits = gfc_integer_kinds[i].digits;
927 digits = gfc_real_kinds[i].digits;
934 return gfc_int_expr (digits);
939 gfc_simplify_dim (gfc_expr * x, gfc_expr * y)
944 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
947 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
948 result = gfc_constant_result (x->ts.type, kind, &x->where);
953 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
954 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
956 mpz_set_ui (result->value.integer, 0);
961 if (mpfr_cmp (x->value.real, y->value.real) > 0)
962 mpfr_sub (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
964 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
969 gfc_internal_error ("gfc_simplify_dim(): Bad type");
972 return range_check (result, "DIM");
977 gfc_simplify_dprod (gfc_expr * x, gfc_expr * y)
979 gfc_expr *a1, *a2, *result;
981 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
985 gfc_constant_result (BT_REAL, gfc_default_double_kind, &x->where);
987 a1 = gfc_real2real (x, gfc_default_double_kind);
988 a2 = gfc_real2real (y, gfc_default_double_kind);
990 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
995 return range_check (result, "DPROD");
1000 gfc_simplify_epsilon (gfc_expr * e)
1005 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1007 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
1009 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
1011 return range_check (result, "EPSILON");
1016 gfc_simplify_exp (gfc_expr * x)
1021 if (x->expr_type != EXPR_CONSTANT)
1024 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1029 mpfr_exp(result->value.real, x->value.real, GFC_RND_MODE);
1033 gfc_set_model_kind (x->ts.kind);
1036 mpfr_exp (xq, x->value.complex.r, GFC_RND_MODE);
1037 mpfr_cos (xp, x->value.complex.i, GFC_RND_MODE);
1038 mpfr_mul (result->value.complex.r, xq, xp, GFC_RND_MODE);
1039 mpfr_sin (xp, x->value.complex.i, GFC_RND_MODE);
1040 mpfr_mul (result->value.complex.i, xq, xp, GFC_RND_MODE);
1046 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
1049 return range_check (result, "EXP");
1052 /* FIXME: MPFR should be able to do this better */
1054 gfc_simplify_exponent (gfc_expr * x)
1060 if (x->expr_type != EXPR_CONSTANT)
1063 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1066 gfc_set_model (x->value.real);
1068 if (mpfr_sgn (x->value.real) == 0)
1070 mpz_set_ui (result->value.integer, 0);
1076 mpfr_abs (tmp, x->value.real, GFC_RND_MODE);
1077 mpfr_log2 (tmp, tmp, GFC_RND_MODE);
1079 gfc_mpfr_to_mpz (result->value.integer, tmp);
1081 /* The model number for tiny(x) is b**(emin - 1) where b is the base and emin
1082 is the smallest exponent value. So, we need to add 1 if x is tiny(x). */
1083 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1084 if (mpfr_cmp (x->value.real, gfc_real_kinds[i].tiny) == 0)
1085 mpz_add_ui (result->value.integer,result->value.integer, 1);
1089 return range_check (result, "EXPONENT");
1094 gfc_simplify_float (gfc_expr * a)
1098 if (a->expr_type != EXPR_CONSTANT)
1101 result = gfc_int2real (a, gfc_default_real_kind);
1102 return range_check (result, "FLOAT");
1107 gfc_simplify_floor (gfc_expr * e, gfc_expr * k)
1113 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
1115 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
1117 if (e->expr_type != EXPR_CONSTANT)
1120 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1122 gfc_set_model_kind (kind);
1124 mpfr_floor (floor, e->value.real);
1126 gfc_mpfr_to_mpz (result->value.integer, floor);
1130 return range_check (result, "FLOOR");
1135 gfc_simplify_fraction (gfc_expr * x)
1138 mpfr_t absv, exp, pow2;
1140 if (x->expr_type != EXPR_CONSTANT)
1143 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
1145 gfc_set_model_kind (x->ts.kind);
1147 if (mpfr_sgn (x->value.real) == 0)
1149 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1157 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
1158 mpfr_log2 (exp, absv, GFC_RND_MODE);
1160 mpfr_trunc (exp, exp);
1161 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
1163 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
1165 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
1171 return range_check (result, "FRACTION");
1176 gfc_simplify_huge (gfc_expr * e)
1181 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1183 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1188 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
1192 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
1204 gfc_simplify_iachar (gfc_expr * e)
1209 if (e->expr_type != EXPR_CONSTANT)
1212 if (e->value.character.length != 1)
1214 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
1215 return &gfc_bad_expr;
1218 index = xascii_table[(int) e->value.character.string[0] & 0xFF];
1220 result = gfc_int_expr (index);
1221 result->where = e->where;
1223 return range_check (result, "IACHAR");
1228 gfc_simplify_iand (gfc_expr * x, gfc_expr * y)
1232 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1235 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1237 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1239 return range_check (result, "IAND");
1244 gfc_simplify_ibclr (gfc_expr * x, gfc_expr * y)
1249 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1252 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1254 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
1255 return &gfc_bad_expr;
1258 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1260 if (pos > gfc_integer_kinds[k].bit_size)
1262 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
1264 return &gfc_bad_expr;
1267 result = gfc_copy_expr (x);
1269 mpz_clrbit (result->value.integer, pos);
1270 return range_check (result, "IBCLR");
1275 gfc_simplify_ibits (gfc_expr * x, gfc_expr * y, gfc_expr * z)
1282 if (x->expr_type != EXPR_CONSTANT
1283 || y->expr_type != EXPR_CONSTANT
1284 || z->expr_type != EXPR_CONSTANT)
1287 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1289 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
1290 return &gfc_bad_expr;
1293 if (gfc_extract_int (z, &len) != NULL || len < 0)
1295 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
1296 return &gfc_bad_expr;
1299 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
1301 bitsize = gfc_integer_kinds[k].bit_size;
1303 if (pos + len > bitsize)
1306 ("Sum of second and third arguments of IBITS exceeds bit size "
1307 "at %L", &y->where);
1308 return &gfc_bad_expr;
1311 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1313 bits = gfc_getmem (bitsize * sizeof (int));
1315 for (i = 0; i < bitsize; i++)
1318 for (i = 0; i < len; i++)
1319 bits[i] = mpz_tstbit (x->value.integer, i + pos);
1321 for (i = 0; i < bitsize; i++)
1325 mpz_clrbit (result->value.integer, i);
1327 else if (bits[i] == 1)
1329 mpz_setbit (result->value.integer, i);
1333 gfc_internal_error ("IBITS: Bad bit");
1339 return range_check (result, "IBITS");
1344 gfc_simplify_ibset (gfc_expr * x, gfc_expr * y)
1349 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1352 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1354 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
1355 return &gfc_bad_expr;
1358 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1360 if (pos > gfc_integer_kinds[k].bit_size)
1362 gfc_error ("Second argument of IBSET exceeds bit size at %L",
1364 return &gfc_bad_expr;
1367 result = gfc_copy_expr (x);
1369 mpz_setbit (result->value.integer, pos);
1371 twos_complement (result->value.integer, gfc_integer_kinds[k].bit_size);
1373 return range_check (result, "IBSET");
1378 gfc_simplify_ichar (gfc_expr * e)
1383 if (e->expr_type != EXPR_CONSTANT)
1386 if (e->value.character.length != 1)
1388 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
1389 return &gfc_bad_expr;
1392 index = (unsigned char) e->value.character.string[0];
1394 if (index < 0 || index > UCHAR_MAX)
1396 gfc_error ("Argument of ICHAR at %L out of range of this processor",
1398 return &gfc_bad_expr;
1401 result = gfc_int_expr (index);
1402 result->where = e->where;
1403 return range_check (result, "ICHAR");
1408 gfc_simplify_ieor (gfc_expr * x, gfc_expr * y)
1412 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1415 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1417 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
1419 return range_check (result, "IEOR");
1424 gfc_simplify_index (gfc_expr * x, gfc_expr * y, gfc_expr * b)
1427 int back, len, lensub;
1428 int i, j, k, count, index = 0, start;
1430 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1433 if (b != NULL && b->value.logical != 0)
1438 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1441 len = x->value.character.length;
1442 lensub = y->value.character.length;
1446 mpz_set_si (result->value.integer, 0);
1455 mpz_set_si (result->value.integer, 1);
1458 else if (lensub == 1)
1460 for (i = 0; i < len; i++)
1462 for (j = 0; j < lensub; j++)
1464 if (y->value.character.string[j] ==
1465 x->value.character.string[i])
1475 for (i = 0; i < len; i++)
1477 for (j = 0; j < lensub; j++)
1479 if (y->value.character.string[j] ==
1480 x->value.character.string[i])
1485 for (k = 0; k < lensub; k++)
1487 if (y->value.character.string[k] ==
1488 x->value.character.string[k + start])
1492 if (count == lensub)
1508 mpz_set_si (result->value.integer, len + 1);
1511 else if (lensub == 1)
1513 for (i = 0; i < len; i++)
1515 for (j = 0; j < lensub; j++)
1517 if (y->value.character.string[j] ==
1518 x->value.character.string[len - i])
1520 index = len - i + 1;
1528 for (i = 0; i < len; i++)
1530 for (j = 0; j < lensub; j++)
1532 if (y->value.character.string[j] ==
1533 x->value.character.string[len - i])
1536 if (start <= len - lensub)
1539 for (k = 0; k < lensub; k++)
1540 if (y->value.character.string[k] ==
1541 x->value.character.string[k + start])
1544 if (count == lensub)
1561 mpz_set_si (result->value.integer, index);
1562 return range_check (result, "INDEX");
1567 gfc_simplify_int (gfc_expr * e, gfc_expr * k)
1569 gfc_expr *rpart, *rtrunc, *result;
1572 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
1574 return &gfc_bad_expr;
1576 if (e->expr_type != EXPR_CONSTANT)
1579 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1584 mpz_set (result->value.integer, e->value.integer);
1588 rtrunc = gfc_copy_expr (e);
1589 mpfr_trunc (rtrunc->value.real, e->value.real);
1590 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1591 gfc_free_expr (rtrunc);
1595 rpart = gfc_complex2real (e, kind);
1596 rtrunc = gfc_copy_expr (rpart);
1597 mpfr_trunc (rtrunc->value.real, rpart->value.real);
1598 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1599 gfc_free_expr (rpart);
1600 gfc_free_expr (rtrunc);
1604 gfc_error ("Argument of INT at %L is not a valid type", &e->where);
1605 gfc_free_expr (result);
1606 return &gfc_bad_expr;
1609 return range_check (result, "INT");
1614 gfc_simplify_intconv (gfc_expr * e, int kind, const char *name)
1616 gfc_expr *rpart, *rtrunc, *result;
1618 if (e->expr_type != EXPR_CONSTANT)
1621 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1626 mpz_set (result->value.integer, e->value.integer);
1630 rtrunc = gfc_copy_expr (e);
1631 mpfr_trunc (rtrunc->value.real, e->value.real);
1632 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1633 gfc_free_expr (rtrunc);
1637 rpart = gfc_complex2real (e, kind);
1638 rtrunc = gfc_copy_expr (rpart);
1639 mpfr_trunc (rtrunc->value.real, rpart->value.real);
1640 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1641 gfc_free_expr (rpart);
1642 gfc_free_expr (rtrunc);
1646 gfc_error ("Argument of %s at %L is not a valid type", name, &e->where);
1647 gfc_free_expr (result);
1648 return &gfc_bad_expr;
1651 return range_check (result, name);
1655 gfc_simplify_int2 (gfc_expr * e)
1657 return gfc_simplify_intconv (e, 2, "INT2");
1661 gfc_simplify_int8 (gfc_expr * e)
1663 return gfc_simplify_intconv (e, 8, "INT8");
1667 gfc_simplify_long (gfc_expr * e)
1669 return gfc_simplify_intconv (e, 4, "LONG");
1674 gfc_simplify_ifix (gfc_expr * e)
1676 gfc_expr *rtrunc, *result;
1678 if (e->expr_type != EXPR_CONSTANT)
1681 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1684 rtrunc = gfc_copy_expr (e);
1686 mpfr_trunc (rtrunc->value.real, e->value.real);
1687 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1689 gfc_free_expr (rtrunc);
1690 return range_check (result, "IFIX");
1695 gfc_simplify_idint (gfc_expr * e)
1697 gfc_expr *rtrunc, *result;
1699 if (e->expr_type != EXPR_CONSTANT)
1702 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1705 rtrunc = gfc_copy_expr (e);
1707 mpfr_trunc (rtrunc->value.real, e->value.real);
1708 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1710 gfc_free_expr (rtrunc);
1711 return range_check (result, "IDINT");
1716 gfc_simplify_ior (gfc_expr * x, gfc_expr * y)
1720 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1723 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1725 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
1726 return range_check (result, "IOR");
1731 gfc_simplify_ishft (gfc_expr * e, gfc_expr * s)
1734 int shift, ashift, isize, k, *bits, i;
1736 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1739 if (gfc_extract_int (s, &shift) != NULL)
1741 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
1742 return &gfc_bad_expr;
1745 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
1747 isize = gfc_integer_kinds[k].bit_size;
1757 ("Magnitude of second argument of ISHFT exceeds bit size at %L",
1759 return &gfc_bad_expr;
1762 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1766 mpz_set (result->value.integer, e->value.integer);
1767 return range_check (result, "ISHFT");
1770 bits = gfc_getmem (isize * sizeof (int));
1772 for (i = 0; i < isize; i++)
1773 bits[i] = mpz_tstbit (e->value.integer, i);
1777 for (i = 0; i < shift; i++)
1778 mpz_clrbit (result->value.integer, i);
1780 for (i = 0; i < isize - shift; i++)
1783 mpz_clrbit (result->value.integer, i + shift);
1785 mpz_setbit (result->value.integer, i + shift);
1790 for (i = isize - 1; i >= isize - ashift; i--)
1791 mpz_clrbit (result->value.integer, i);
1793 for (i = isize - 1; i >= ashift; i--)
1796 mpz_clrbit (result->value.integer, i - ashift);
1798 mpz_setbit (result->value.integer, i - ashift);
1802 twos_complement (result->value.integer, isize);
1810 gfc_simplify_ishftc (gfc_expr * e, gfc_expr * s, gfc_expr * sz)
1813 int shift, ashift, isize, delta, k;
1816 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1819 if (gfc_extract_int (s, &shift) != NULL)
1821 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
1822 return &gfc_bad_expr;
1825 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1829 if (gfc_extract_int (sz, &isize) != NULL || isize < 0)
1831 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
1832 return &gfc_bad_expr;
1836 isize = gfc_integer_kinds[k].bit_size;
1846 ("Magnitude of second argument of ISHFTC exceeds third argument "
1847 "at %L", &s->where);
1848 return &gfc_bad_expr;
1851 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1855 mpz_set (result->value.integer, e->value.integer);
1859 bits = gfc_getmem (isize * sizeof (int));
1861 for (i = 0; i < isize; i++)
1862 bits[i] = mpz_tstbit (e->value.integer, i);
1864 delta = isize - ashift;
1868 for (i = 0; i < delta; i++)
1871 mpz_clrbit (result->value.integer, i + shift);
1873 mpz_setbit (result->value.integer, i + shift);
1876 for (i = delta; i < isize; i++)
1879 mpz_clrbit (result->value.integer, i - delta);
1881 mpz_setbit (result->value.integer, i - delta);
1886 for (i = 0; i < ashift; i++)
1889 mpz_clrbit (result->value.integer, i + delta);
1891 mpz_setbit (result->value.integer, i + delta);
1894 for (i = ashift; i < isize; i++)
1897 mpz_clrbit (result->value.integer, i + shift);
1899 mpz_setbit (result->value.integer, i + shift);
1903 twos_complement (result->value.integer, isize);
1911 gfc_simplify_kind (gfc_expr * e)
1914 if (e->ts.type == BT_DERIVED)
1916 gfc_error ("Argument of KIND at %L is a DERIVED type", &e->where);
1917 return &gfc_bad_expr;
1920 return gfc_int_expr (e->ts.kind);
1925 simplify_bound (gfc_expr * array, gfc_expr * dim, int upper)
1932 if (array->expr_type != EXPR_VARIABLE)
1936 /* TODO: Simplify constant multi-dimensional bounds. */
1939 if (dim->expr_type != EXPR_CONSTANT)
1942 /* Follow any component references. */
1943 as = array->symtree->n.sym->as;
1944 for (ref = array->ref; ref; ref = ref->next)
1949 switch (ref->u.ar.type)
1956 /* We're done because 'as' has already been set in the
1957 previous iteration. */
1968 as = ref->u.c.component->as;
1979 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
1982 d = mpz_get_si (dim->value.integer);
1984 if (d < 1 || d > as->rank
1985 || (d == as->rank && as->type == AS_ASSUMED_SIZE && upper))
1987 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
1988 return &gfc_bad_expr;
1991 e = upper ? as->upper[d-1] : as->lower[d-1];
1993 if (e->expr_type != EXPR_CONSTANT)
1996 return gfc_copy_expr (e);
2001 gfc_simplify_lbound (gfc_expr * array, gfc_expr * dim)
2003 return simplify_bound (array, dim, 0);
2008 gfc_simplify_len (gfc_expr * e)
2012 if (e->expr_type == EXPR_CONSTANT)
2014 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
2016 mpz_set_si (result->value.integer, e->value.character.length);
2017 return range_check (result, "LEN");
2020 if (e->ts.cl != NULL && e->ts.cl->length != NULL
2021 && e->ts.cl->length->expr_type == EXPR_CONSTANT)
2023 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
2025 mpz_set (result->value.integer, e->ts.cl->length->value.integer);
2026 return range_check (result, "LEN");
2034 gfc_simplify_len_trim (gfc_expr * e)
2037 int count, len, lentrim, i;
2039 if (e->expr_type != EXPR_CONSTANT)
2042 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
2045 len = e->value.character.length;
2047 for (count = 0, i = 1; i <= len; i++)
2048 if (e->value.character.string[len - i] == ' ')
2053 lentrim = len - count;
2055 mpz_set_si (result->value.integer, lentrim);
2056 return range_check (result, "LEN_TRIM");
2061 gfc_simplify_lge (gfc_expr * a, gfc_expr * b)
2064 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2067 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) >= 0,
2073 gfc_simplify_lgt (gfc_expr * a, gfc_expr * b)
2076 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2079 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) > 0,
2085 gfc_simplify_lle (gfc_expr * a, gfc_expr * b)
2088 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2091 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) <= 0,
2097 gfc_simplify_llt (gfc_expr * a, gfc_expr * b)
2100 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2103 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) < 0,
2109 gfc_simplify_log (gfc_expr * x)
2114 if (x->expr_type != EXPR_CONSTANT)
2117 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2119 gfc_set_model_kind (x->ts.kind);
2124 if (mpfr_sgn (x->value.real) <= 0)
2127 ("Argument of LOG at %L cannot be less than or equal to zero",
2129 gfc_free_expr (result);
2130 return &gfc_bad_expr;
2133 mpfr_log(result->value.real, x->value.real, GFC_RND_MODE);
2137 if ((mpfr_sgn (x->value.complex.r) == 0)
2138 && (mpfr_sgn (x->value.complex.i) == 0))
2140 gfc_error ("Complex argument of LOG at %L cannot be zero",
2142 gfc_free_expr (result);
2143 return &gfc_bad_expr;
2149 arctangent2 (x->value.complex.i, x->value.complex.r,
2150 result->value.complex.i);
2152 mpfr_mul (xr, x->value.complex.r, x->value.complex.r, GFC_RND_MODE);
2153 mpfr_mul (xi, x->value.complex.i, x->value.complex.i, GFC_RND_MODE);
2154 mpfr_add (xr, xr, xi, GFC_RND_MODE);
2155 mpfr_sqrt (xr, xr, GFC_RND_MODE);
2156 mpfr_log (result->value.complex.r, xr, GFC_RND_MODE);
2164 gfc_internal_error ("gfc_simplify_log: bad type");
2167 return range_check (result, "LOG");
2172 gfc_simplify_log10 (gfc_expr * x)
2176 if (x->expr_type != EXPR_CONSTANT)
2179 gfc_set_model_kind (x->ts.kind);
2181 if (mpfr_sgn (x->value.real) <= 0)
2184 ("Argument of LOG10 at %L cannot be less than or equal to zero",
2186 return &gfc_bad_expr;
2189 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2191 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
2193 return range_check (result, "LOG10");
2198 gfc_simplify_logical (gfc_expr * e, gfc_expr * k)
2203 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
2205 return &gfc_bad_expr;
2207 if (e->expr_type != EXPR_CONSTANT)
2210 result = gfc_constant_result (BT_LOGICAL, kind, &e->where);
2212 result->value.logical = e->value.logical;
2218 /* This function is special since MAX() can take any number of
2219 arguments. The simplified expression is a rewritten version of the
2220 argument list containing at most one constant element. Other
2221 constant elements are deleted. Because the argument list has
2222 already been checked, this function always succeeds. sign is 1 for
2223 MAX(), -1 for MIN(). */
2226 simplify_min_max (gfc_expr * expr, int sign)
2228 gfc_actual_arglist *arg, *last, *extremum;
2229 gfc_intrinsic_sym * specific;
2233 specific = expr->value.function.isym;
2235 arg = expr->value.function.actual;
2237 for (; arg; last = arg, arg = arg->next)
2239 if (arg->expr->expr_type != EXPR_CONSTANT)
2242 if (extremum == NULL)
2248 switch (arg->expr->ts.type)
2251 if (mpz_cmp (arg->expr->value.integer,
2252 extremum->expr->value.integer) * sign > 0)
2253 mpz_set (extremum->expr->value.integer, arg->expr->value.integer);
2258 if (mpfr_cmp (arg->expr->value.real, extremum->expr->value.real) *
2260 mpfr_set (extremum->expr->value.real, arg->expr->value.real,
2266 gfc_internal_error ("gfc_simplify_max(): Bad type in arglist");
2269 /* Delete the extra constant argument. */
2271 expr->value.function.actual = arg->next;
2273 last->next = arg->next;
2276 gfc_free_actual_arglist (arg);
2280 /* If there is one value left, replace the function call with the
2282 if (expr->value.function.actual->next != NULL)
2285 /* Convert to the correct type and kind. */
2286 if (expr->ts.type != BT_UNKNOWN)
2287 return gfc_convert_constant (expr->value.function.actual->expr,
2288 expr->ts.type, expr->ts.kind);
2290 if (specific->ts.type != BT_UNKNOWN)
2291 return gfc_convert_constant (expr->value.function.actual->expr,
2292 specific->ts.type, specific->ts.kind);
2294 return gfc_copy_expr (expr->value.function.actual->expr);
2299 gfc_simplify_min (gfc_expr * e)
2301 return simplify_min_max (e, -1);
2306 gfc_simplify_max (gfc_expr * e)
2308 return simplify_min_max (e, 1);
2313 gfc_simplify_maxexponent (gfc_expr * x)
2318 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2320 result = gfc_int_expr (gfc_real_kinds[i].max_exponent);
2321 result->where = x->where;
2328 gfc_simplify_minexponent (gfc_expr * x)
2333 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2335 result = gfc_int_expr (gfc_real_kinds[i].min_exponent);
2336 result->where = x->where;
2343 gfc_simplify_mod (gfc_expr * a, gfc_expr * p)
2346 mpfr_t quot, iquot, term;
2349 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2352 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2353 result = gfc_constant_result (a->ts.type, kind, &a->where);
2358 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2360 /* Result is processor-dependent. */
2361 gfc_error ("Second argument MOD at %L is zero", &a->where);
2362 gfc_free_expr (result);
2363 return &gfc_bad_expr;
2365 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
2369 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2371 /* Result is processor-dependent. */
2372 gfc_error ("Second argument of MOD at %L is zero", &p->where);
2373 gfc_free_expr (result);
2374 return &gfc_bad_expr;
2377 gfc_set_model_kind (kind);
2382 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2383 mpfr_trunc (iquot, quot);
2384 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2385 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2393 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
2396 return range_check (result, "MOD");
2401 gfc_simplify_modulo (gfc_expr * a, gfc_expr * p)
2404 mpfr_t quot, iquot, term;
2407 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2410 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2411 result = gfc_constant_result (a->ts.type, kind, &a->where);
2416 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2418 /* Result is processor-dependent. This processor just opts
2419 to not handle it at all. */
2420 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
2421 gfc_free_expr (result);
2422 return &gfc_bad_expr;
2424 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
2429 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2431 /* Result is processor-dependent. */
2432 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
2433 gfc_free_expr (result);
2434 return &gfc_bad_expr;
2437 gfc_set_model_kind (kind);
2442 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2443 mpfr_floor (iquot, quot);
2444 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2445 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2453 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
2456 return range_check (result, "MODULO");
2460 /* Exists for the sole purpose of consistency with other intrinsics. */
2462 gfc_simplify_mvbits (gfc_expr * f ATTRIBUTE_UNUSED,
2463 gfc_expr * fp ATTRIBUTE_UNUSED,
2464 gfc_expr * l ATTRIBUTE_UNUSED,
2465 gfc_expr * to ATTRIBUTE_UNUSED,
2466 gfc_expr * tp ATTRIBUTE_UNUSED)
2473 gfc_simplify_nearest (gfc_expr * x, gfc_expr * s)
2479 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2482 gfc_set_model_kind (x->ts.kind);
2483 result = gfc_copy_expr (x);
2485 direction = mpfr_sgn (s->value.real);
2489 gfc_error ("Second argument of NEAREST at %L may not be zero",
2492 return &gfc_bad_expr;
2495 /* TODO: Use mpfr_nextabove and mpfr_nextbelow once we move to a
2496 newer version of mpfr. */
2498 sgn = mpfr_sgn (x->value.real);
2502 int k = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
2505 mpfr_add (result->value.real,
2506 x->value.real, gfc_real_kinds[k].subnormal, GFC_RND_MODE);
2508 mpfr_sub (result->value.real,
2509 x->value.real, gfc_real_kinds[k].subnormal, GFC_RND_MODE);
2515 direction = -direction;
2516 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
2520 mpfr_add_one_ulp (result->value.real, GFC_RND_MODE);
2523 /* In this case the exponent can shrink, which makes us skip
2524 over one number because we subtract one ulp with the
2525 larger exponent. Thus we need to compensate for this. */
2526 mpfr_init_set (tmp, result->value.real, GFC_RND_MODE);
2528 mpfr_sub_one_ulp (result->value.real, GFC_RND_MODE);
2529 mpfr_add_one_ulp (result->value.real, GFC_RND_MODE);
2531 /* If we're back to where we started, the spacing is one
2532 ulp, and we get the correct result by subtracting. */
2533 if (mpfr_cmp (tmp, result->value.real) == 0)
2534 mpfr_sub_one_ulp (result->value.real, GFC_RND_MODE);
2540 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
2543 return range_check (result, "NEAREST");
2548 simplify_nint (const char *name, gfc_expr * e, gfc_expr * k)
2550 gfc_expr *itrunc, *result;
2553 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
2555 return &gfc_bad_expr;
2557 if (e->expr_type != EXPR_CONSTANT)
2560 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
2562 itrunc = gfc_copy_expr (e);
2564 mpfr_round(itrunc->value.real, e->value.real);
2566 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real);
2568 gfc_free_expr (itrunc);
2570 return range_check (result, name);
2575 gfc_simplify_nint (gfc_expr * e, gfc_expr * k)
2577 return simplify_nint ("NINT", e, k);
2582 gfc_simplify_idnint (gfc_expr * e)
2584 return simplify_nint ("IDNINT", e, NULL);
2589 gfc_simplify_not (gfc_expr * e)
2594 if (e->expr_type != EXPR_CONSTANT)
2597 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2599 mpz_com (result->value.integer, e->value.integer);
2601 /* Because of how GMP handles numbers, the result must be ANDed with
2602 the max_int mask. For radices <> 2, this will require change. */
2604 i = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2606 mpz_and (result->value.integer, result->value.integer,
2607 gfc_integer_kinds[i].max_int);
2609 twos_complement (result->value.integer, gfc_integer_kinds[i].bit_size);
2611 return range_check (result, "NOT");
2616 gfc_simplify_null (gfc_expr * mold)
2622 result = gfc_get_expr ();
2623 result->ts.type = BT_UNKNOWN;
2626 result = gfc_copy_expr (mold);
2627 result->expr_type = EXPR_NULL;
2634 gfc_simplify_or (gfc_expr * x, gfc_expr * y)
2639 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2642 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
2643 if (x->ts.type == BT_INTEGER)
2645 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
2646 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2648 else /* BT_LOGICAL */
2650 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
2651 result->value.logical = x->value.logical || y->value.logical;
2654 return range_check (result, "OR");
2659 gfc_simplify_precision (gfc_expr * e)
2664 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2666 result = gfc_int_expr (gfc_real_kinds[i].precision);
2667 result->where = e->where;
2674 gfc_simplify_radix (gfc_expr * e)
2679 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2683 i = gfc_integer_kinds[i].radix;
2687 i = gfc_real_kinds[i].radix;
2694 result = gfc_int_expr (i);
2695 result->where = e->where;
2702 gfc_simplify_range (gfc_expr * e)
2708 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2713 j = gfc_integer_kinds[i].range;
2718 j = gfc_real_kinds[i].range;
2725 result = gfc_int_expr (j);
2726 result->where = e->where;
2733 gfc_simplify_real (gfc_expr * e, gfc_expr * k)
2738 if (e->ts.type == BT_COMPLEX)
2739 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
2741 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
2744 return &gfc_bad_expr;
2746 if (e->expr_type != EXPR_CONSTANT)
2752 result = gfc_int2real (e, kind);
2756 result = gfc_real2real (e, kind);
2760 result = gfc_complex2real (e, kind);
2764 gfc_internal_error ("bad type in REAL");
2768 return range_check (result, "REAL");
2773 gfc_simplify_realpart (gfc_expr * e)
2777 if (e->expr_type != EXPR_CONSTANT)
2780 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
2781 mpfr_set (result->value.real, e->value.complex.r, GFC_RND_MODE);
2783 return range_check (result, "REALPART");
2787 gfc_simplify_repeat (gfc_expr * e, gfc_expr * n)
2790 int i, j, len, ncopies, nlen;
2792 if (e->expr_type != EXPR_CONSTANT || n->expr_type != EXPR_CONSTANT)
2795 if (n != NULL && (gfc_extract_int (n, &ncopies) != NULL || ncopies < 0))
2797 gfc_error ("Invalid second argument of REPEAT at %L", &n->where);
2798 return &gfc_bad_expr;
2801 len = e->value.character.length;
2802 nlen = ncopies * len;
2804 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
2808 result->value.character.string = gfc_getmem (1);
2809 result->value.character.length = 0;
2810 result->value.character.string[0] = '\0';
2814 result->value.character.length = nlen;
2815 result->value.character.string = gfc_getmem (nlen + 1);
2817 for (i = 0; i < ncopies; i++)
2818 for (j = 0; j < len; j++)
2819 result->value.character.string[j + i * len] =
2820 e->value.character.string[j];
2822 result->value.character.string[nlen] = '\0'; /* For debugger */
2827 /* This one is a bear, but mainly has to do with shuffling elements. */
2830 gfc_simplify_reshape (gfc_expr * source, gfc_expr * shape_exp,
2831 gfc_expr * pad, gfc_expr * order_exp)
2834 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
2835 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
2836 gfc_constructor *head, *tail;
2842 /* Unpack the shape array. */
2843 if (source->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (source))
2846 if (shape_exp->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (shape_exp))
2850 && (pad->expr_type != EXPR_ARRAY
2851 || !gfc_is_constant_expr (pad)))
2854 if (order_exp != NULL
2855 && (order_exp->expr_type != EXPR_ARRAY
2856 || !gfc_is_constant_expr (order_exp)))
2865 e = gfc_get_array_element (shape_exp, rank);
2869 if (gfc_extract_int (e, &shape[rank]) != NULL)
2871 gfc_error ("Integer too large in shape specification at %L",
2879 if (rank >= GFC_MAX_DIMENSIONS)
2881 gfc_error ("Too many dimensions in shape specification for RESHAPE "
2882 "at %L", &e->where);
2887 if (shape[rank] < 0)
2889 gfc_error ("Shape specification at %L cannot be negative",
2899 gfc_error ("Shape specification at %L cannot be the null array",
2904 /* Now unpack the order array if present. */
2905 if (order_exp == NULL)
2907 for (i = 0; i < rank; i++)
2914 for (i = 0; i < rank; i++)
2917 for (i = 0; i < rank; i++)
2919 e = gfc_get_array_element (order_exp, i);
2923 ("ORDER parameter of RESHAPE at %L is not the same size "
2924 "as SHAPE parameter", &order_exp->where);
2928 if (gfc_extract_int (e, &order[i]) != NULL)
2930 gfc_error ("Error in ORDER parameter of RESHAPE at %L",
2938 if (order[i] < 1 || order[i] > rank)
2940 gfc_error ("ORDER parameter of RESHAPE at %L is out of range",
2949 gfc_error ("Invalid permutation in ORDER parameter at %L",
2958 /* Count the elements in the source and padding arrays. */
2963 gfc_array_size (pad, &size);
2964 npad = mpz_get_ui (size);
2968 gfc_array_size (source, &size);
2969 nsource = mpz_get_ui (size);
2972 /* If it weren't for that pesky permutation we could just loop
2973 through the source and round out any shortage with pad elements.
2974 But no, someone just had to have the compiler do something the
2975 user should be doing. */
2977 for (i = 0; i < rank; i++)
2982 /* Figure out which element to extract. */
2983 mpz_set_ui (index, 0);
2985 for (i = rank - 1; i >= 0; i--)
2987 mpz_add_ui (index, index, x[order[i]]);
2989 mpz_mul_ui (index, index, shape[order[i - 1]]);
2992 if (mpz_cmp_ui (index, INT_MAX) > 0)
2993 gfc_internal_error ("Reshaped array too large at %L", &e->where);
2995 j = mpz_get_ui (index);
2998 e = gfc_get_array_element (source, j);
3006 ("PAD parameter required for short SOURCE parameter at %L",
3012 e = gfc_get_array_element (pad, j);
3016 head = tail = gfc_get_constructor ();
3019 tail->next = gfc_get_constructor ();
3026 tail->where = e->where;
3029 /* Calculate the next element. */
3033 if (++x[i] < shape[i])
3044 e = gfc_get_expr ();
3045 e->where = source->where;
3046 e->expr_type = EXPR_ARRAY;
3047 e->value.constructor = head;
3048 e->shape = gfc_get_shape (rank);
3050 for (i = 0; i < rank; i++)
3051 mpz_init_set_ui (e->shape[i], shape[i]);
3059 gfc_free_constructor (head);
3061 return &gfc_bad_expr;
3066 gfc_simplify_rrspacing (gfc_expr * x)
3069 mpfr_t absv, log2, exp, frac, pow2;
3072 if (x->expr_type != EXPR_CONSTANT)
3075 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3077 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3079 p = gfc_real_kinds[i].digits;
3081 gfc_set_model_kind (x->ts.kind);
3083 if (mpfr_sgn (x->value.real) == 0)
3085 mpfr_ui_div (result->value.real, 1, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3095 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3096 mpfr_log2 (log2, absv, GFC_RND_MODE);
3098 mpfr_trunc (log2, log2);
3099 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3101 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3102 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3104 mpfr_mul_2exp (result->value.real, frac, (unsigned long)p, GFC_RND_MODE);
3112 return range_check (result, "RRSPACING");
3117 gfc_simplify_scale (gfc_expr * x, gfc_expr * i)
3119 int k, neg_flag, power, exp_range;
3120 mpfr_t scale, radix;
3123 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3126 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3128 if (mpfr_sgn (x->value.real) == 0)
3130 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3134 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3136 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
3138 /* This check filters out values of i that would overflow an int. */
3139 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
3140 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
3142 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
3143 return &gfc_bad_expr;
3146 /* Compute scale = radix ** power. */
3147 power = mpz_get_si (i->value.integer);
3157 gfc_set_model_kind (x->ts.kind);
3160 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
3161 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
3164 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
3166 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
3171 return range_check (result, "SCALE");
3176 gfc_simplify_scan (gfc_expr * e, gfc_expr * c, gfc_expr * b)
3181 size_t indx, len, lenc;
3183 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
3186 if (b != NULL && b->value.logical != 0)
3191 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3194 len = e->value.character.length;
3195 lenc = c->value.character.length;
3197 if (len == 0 || lenc == 0)
3206 strcspn (e->value.character.string, c->value.character.string) + 1;
3213 for (indx = len; indx > 0; indx--)
3215 for (i = 0; i < lenc; i++)
3217 if (c->value.character.string[i]
3218 == e->value.character.string[indx - 1])
3226 mpz_set_ui (result->value.integer, indx);
3227 return range_check (result, "SCAN");
3232 gfc_simplify_selected_int_kind (gfc_expr * e)
3237 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
3242 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3243 if (gfc_integer_kinds[i].range >= range
3244 && gfc_integer_kinds[i].kind < kind)
3245 kind = gfc_integer_kinds[i].kind;
3247 if (kind == INT_MAX)
3250 result = gfc_int_expr (kind);
3251 result->where = e->where;
3258 gfc_simplify_selected_real_kind (gfc_expr * p, gfc_expr * q)
3260 int range, precision, i, kind, found_precision, found_range;
3267 if (p->expr_type != EXPR_CONSTANT
3268 || gfc_extract_int (p, &precision) != NULL)
3276 if (q->expr_type != EXPR_CONSTANT
3277 || gfc_extract_int (q, &range) != NULL)
3282 found_precision = 0;
3285 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3287 if (gfc_real_kinds[i].precision >= precision)
3288 found_precision = 1;
3290 if (gfc_real_kinds[i].range >= range)
3293 if (gfc_real_kinds[i].precision >= precision
3294 && gfc_real_kinds[i].range >= range && gfc_real_kinds[i].kind < kind)
3295 kind = gfc_real_kinds[i].kind;
3298 if (kind == INT_MAX)
3302 if (!found_precision)
3308 result = gfc_int_expr (kind);
3309 result->where = (p != NULL) ? p->where : q->where;
3316 gfc_simplify_set_exponent (gfc_expr * x, gfc_expr * i)
3319 mpfr_t exp, absv, log2, pow2, frac;
3322 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3325 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3327 gfc_set_model_kind (x->ts.kind);
3329 if (mpfr_sgn (x->value.real) == 0)
3331 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3341 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3342 mpfr_log2 (log2, absv, GFC_RND_MODE);
3344 mpfr_trunc (log2, log2);
3345 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3347 /* Old exponent value, and fraction. */
3348 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3350 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3353 exp2 = (unsigned long) mpz_get_d (i->value.integer);
3354 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
3361 return range_check (result, "SET_EXPONENT");
3366 gfc_simplify_shape (gfc_expr * source)
3368 mpz_t shape[GFC_MAX_DIMENSIONS];
3369 gfc_expr *result, *e, *f;
3374 if (source->rank == 0 || source->expr_type != EXPR_VARIABLE)
3377 result = gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3380 ar = gfc_find_array_ref (source);
3382 t = gfc_array_ref_shape (ar, shape);
3384 for (n = 0; n < source->rank; n++)
3386 e = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3391 mpz_set (e->value.integer, shape[n]);
3392 mpz_clear (shape[n]);
3396 mpz_set_ui (e->value.integer, n + 1);
3398 f = gfc_simplify_size (source, e);
3402 gfc_free_expr (result);
3411 gfc_append_constructor (result, e);
3419 gfc_simplify_size (gfc_expr * array, gfc_expr * dim)
3427 if (gfc_array_size (array, &size) == FAILURE)
3432 if (dim->expr_type != EXPR_CONSTANT)
3435 d = mpz_get_ui (dim->value.integer) - 1;
3436 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
3440 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3443 mpz_set (result->value.integer, size);
3450 gfc_simplify_sign (gfc_expr * x, gfc_expr * y)
3454 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3457 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3462 mpz_abs (result->value.integer, x->value.integer);
3463 if (mpz_sgn (y->value.integer) < 0)
3464 mpz_neg (result->value.integer, result->value.integer);
3469 /* TODO: Handle -0.0 and +0.0 correctly on machines that support
3471 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3472 if (mpfr_sgn (y->value.real) < 0)
3473 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
3478 gfc_internal_error ("Bad type in gfc_simplify_sign");
3486 gfc_simplify_sin (gfc_expr * x)
3491 if (x->expr_type != EXPR_CONSTANT)
3494 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3499 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
3503 gfc_set_model (x->value.real);
3507 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
3508 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
3509 mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
3511 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
3512 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
3513 mpfr_mul (result->value.complex.i, xp, xq, GFC_RND_MODE);
3520 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
3523 return range_check (result, "SIN");
3528 gfc_simplify_sinh (gfc_expr * x)
3532 if (x->expr_type != EXPR_CONSTANT)
3535 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3537 mpfr_sinh(result->value.real, x->value.real, GFC_RND_MODE);
3539 return range_check (result, "SINH");
3543 /* The argument is always a double precision real that is converted to
3544 single precision. TODO: Rounding! */
3547 gfc_simplify_sngl (gfc_expr * a)
3551 if (a->expr_type != EXPR_CONSTANT)
3554 result = gfc_real2real (a, gfc_default_real_kind);
3555 return range_check (result, "SNGL");
3560 gfc_simplify_spacing (gfc_expr * x)
3567 if (x->expr_type != EXPR_CONSTANT)
3570 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3572 p = gfc_real_kinds[i].digits;
3574 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3576 gfc_set_model_kind (x->ts.kind);
3578 if (mpfr_sgn (x->value.real) == 0)
3580 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3587 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3588 mpfr_log2 (log2, absv, GFC_RND_MODE);
3589 mpfr_trunc (log2, log2);
3591 mpfr_add_ui (log2, log2, 1, GFC_RND_MODE);
3593 /* FIXME: We should be using mpfr_get_si here, but this function is
3594 not available with the version of mpfr distributed with gmp (as of
3595 2004-09-17). Replace once mpfr has been imported into the gcc cvs
3597 diff = (long)mpfr_get_d (log2, GFC_RND_MODE) - (long)p;
3598 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
3599 mpfr_mul_2si (result->value.real, result->value.real, diff, GFC_RND_MODE);
3604 if (mpfr_cmp (result->value.real, gfc_real_kinds[i].tiny) < 0)
3605 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3607 return range_check (result, "SPACING");
3612 gfc_simplify_sqrt (gfc_expr * e)
3615 mpfr_t ac, ad, s, t, w;
3617 if (e->expr_type != EXPR_CONSTANT)
3620 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
3625 if (mpfr_cmp_si (e->value.real, 0) < 0)
3627 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
3632 /* Formula taken from Numerical Recipes to avoid over- and
3635 gfc_set_model (e->value.real);
3642 if (mpfr_cmp_ui (e->value.complex.r, 0) == 0
3643 && mpfr_cmp_ui (e->value.complex.i, 0) == 0)
3646 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
3647 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
3651 mpfr_abs (ac, e->value.complex.r, GFC_RND_MODE);
3652 mpfr_abs (ad, e->value.complex.i, GFC_RND_MODE);
3654 if (mpfr_cmp (ac, ad) >= 0)
3656 mpfr_div (t, e->value.complex.i, e->value.complex.r, GFC_RND_MODE);
3657 mpfr_mul (t, t, t, GFC_RND_MODE);
3658 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3659 mpfr_sqrt (t, t, GFC_RND_MODE);
3660 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3661 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3662 mpfr_sqrt (t, t, GFC_RND_MODE);
3663 mpfr_sqrt (s, ac, GFC_RND_MODE);
3664 mpfr_mul (w, s, t, GFC_RND_MODE);
3668 mpfr_div (s, e->value.complex.r, e->value.complex.i, GFC_RND_MODE);
3669 mpfr_mul (t, s, s, GFC_RND_MODE);
3670 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3671 mpfr_sqrt (t, t, GFC_RND_MODE);
3672 mpfr_abs (s, s, GFC_RND_MODE);
3673 mpfr_add (t, t, s, GFC_RND_MODE);
3674 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3675 mpfr_sqrt (t, t, GFC_RND_MODE);
3676 mpfr_sqrt (s, ad, GFC_RND_MODE);
3677 mpfr_mul (w, s, t, GFC_RND_MODE);
3680 if (mpfr_cmp_ui (w, 0) != 0 && mpfr_cmp_ui (e->value.complex.r, 0) >= 0)
3682 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3683 mpfr_div (result->value.complex.i, e->value.complex.i, t, GFC_RND_MODE);
3684 mpfr_set (result->value.complex.r, w, GFC_RND_MODE);
3686 else if (mpfr_cmp_ui (w, 0) != 0
3687 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3688 && mpfr_cmp_ui (e->value.complex.i, 0) >= 0)
3690 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3691 mpfr_div (result->value.complex.r, e->value.complex.i, t, GFC_RND_MODE);
3692 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3694 else if (mpfr_cmp_ui (w, 0) != 0
3695 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3696 && mpfr_cmp_ui (e->value.complex.i, 0) < 0)
3698 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3699 mpfr_div (result->value.complex.r, ad, t, GFC_RND_MODE);
3700 mpfr_neg (w, w, GFC_RND_MODE);
3701 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3704 gfc_internal_error ("invalid complex argument of SQRT at %L",
3716 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
3719 return range_check (result, "SQRT");
3722 gfc_free_expr (result);
3723 gfc_error ("Argument of SQRT at %L has a negative value", &e->where);
3724 return &gfc_bad_expr;
3729 gfc_simplify_tan (gfc_expr * x)
3734 if (x->expr_type != EXPR_CONSTANT)
3737 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3739 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3741 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
3743 return range_check (result, "TAN");
3748 gfc_simplify_tanh (gfc_expr * x)
3752 if (x->expr_type != EXPR_CONSTANT)
3755 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3757 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
3759 return range_check (result, "TANH");
3765 gfc_simplify_tiny (gfc_expr * e)
3770 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
3772 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
3773 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3780 gfc_simplify_transfer (gfc_expr * source, gfc_expr *mold, gfc_expr * size)
3783 /* Reference mold and size to suppress warning. */
3784 if (gfc_init_expr && (mold || size))
3785 gfc_error ("TRANSFER intrinsic not implemented for initialization at %L",
3793 gfc_simplify_trim (gfc_expr * e)
3796 int count, i, len, lentrim;
3798 if (e->expr_type != EXPR_CONSTANT)
3801 len = e->value.character.length;
3803 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3805 for (count = 0, i = 1; i <= len; ++i)
3807 if (e->value.character.string[len - i] == ' ')
3813 lentrim = len - count;
3815 result->value.character.length = lentrim;
3816 result->value.character.string = gfc_getmem (lentrim + 1);
3818 for (i = 0; i < lentrim; i++)
3819 result->value.character.string[i] = e->value.character.string[i];
3821 result->value.character.string[lentrim] = '\0'; /* For debugger */
3828 gfc_simplify_ubound (gfc_expr * array, gfc_expr * dim)
3830 return simplify_bound (array, dim, 1);
3835 gfc_simplify_verify (gfc_expr * s, gfc_expr * set, gfc_expr * b)
3839 size_t index, len, lenset;
3842 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
3845 if (b != NULL && b->value.logical != 0)
3850 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3853 len = s->value.character.length;
3854 lenset = set->value.character.length;
3858 mpz_set_ui (result->value.integer, 0);
3866 mpz_set_ui (result->value.integer, 1);
3871 strspn (s->value.character.string, set->value.character.string) + 1;
3880 mpz_set_ui (result->value.integer, len);
3883 for (index = len; index > 0; index --)
3885 for (i = 0; i < lenset; i++)
3887 if (s->value.character.string[index - 1]
3888 == set->value.character.string[i])
3896 mpz_set_ui (result->value.integer, index);
3902 gfc_simplify_xor (gfc_expr * x, gfc_expr * y)
3907 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3910 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
3911 if (x->ts.type == BT_INTEGER)
3913 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
3914 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
3916 else /* BT_LOGICAL */
3918 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
3919 result->value.logical = (x->value.logical && ! y->value.logical)
3920 || (! x->value.logical && y->value.logical);
3923 return range_check (result, "XOR");
3928 /****************** Constant simplification *****************/
3930 /* Master function to convert one constant to another. While this is
3931 used as a simplification function, it requires the destination type
3932 and kind information which is supplied by a special case in
3936 gfc_convert_constant (gfc_expr * e, bt type, int kind)
3938 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
3939 gfc_constructor *head, *c, *tail = NULL;
3953 f = gfc_int2complex;
3973 f = gfc_real2complex;
3984 f = gfc_complex2int;
3987 f = gfc_complex2real;
3990 f = gfc_complex2complex;
4016 f = gfc_hollerith2int;
4020 f = gfc_hollerith2real;
4024 f = gfc_hollerith2complex;
4028 f = gfc_hollerith2character;
4032 f = gfc_hollerith2logical;
4042 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
4047 switch (e->expr_type)
4050 result = f (e, kind);
4052 return &gfc_bad_expr;
4056 if (!gfc_is_constant_expr (e))
4061 for (c = e->value.constructor; c; c = c->next)
4064 head = tail = gfc_get_constructor ();
4067 tail->next = gfc_get_constructor ();
4071 tail->where = c->where;
4073 if (c->iterator == NULL)
4074 tail->expr = f (c->expr, kind);
4077 g = gfc_convert_constant (c->expr, type, kind);
4078 if (g == &gfc_bad_expr)
4083 if (tail->expr == NULL)
4085 gfc_free_constructor (head);
4090 result = gfc_get_expr ();
4091 result->ts.type = type;
4092 result->ts.kind = kind;
4093 result->expr_type = EXPR_ARRAY;
4094 result->value.constructor = head;
4095 result->shape = gfc_copy_shape (e->shape, e->rank);
4096 result->where = e->where;
4097 result->rank = e->rank;
4108 /****************** Helper functions ***********************/
4110 /* Given a collating table, create the inverse table. */
4113 invert_table (const int *table, int *xtable)
4117 for (i = 0; i < 256; i++)
4120 for (i = 0; i < 256; i++)
4121 xtable[table[i]] = i;
4126 gfc_simplify_init_1 (void)
4129 invert_table (ascii_table, xascii_table);