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_ifix (gfc_expr * e)
1616 gfc_expr *rtrunc, *result;
1618 if (e->expr_type != EXPR_CONSTANT)
1621 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1624 rtrunc = gfc_copy_expr (e);
1626 mpfr_trunc (rtrunc->value.real, e->value.real);
1627 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1629 gfc_free_expr (rtrunc);
1630 return range_check (result, "IFIX");
1635 gfc_simplify_idint (gfc_expr * e)
1637 gfc_expr *rtrunc, *result;
1639 if (e->expr_type != EXPR_CONSTANT)
1642 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1645 rtrunc = gfc_copy_expr (e);
1647 mpfr_trunc (rtrunc->value.real, e->value.real);
1648 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1650 gfc_free_expr (rtrunc);
1651 return range_check (result, "IDINT");
1656 gfc_simplify_ior (gfc_expr * x, gfc_expr * y)
1660 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1663 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1665 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
1666 return range_check (result, "IOR");
1671 gfc_simplify_ishft (gfc_expr * e, gfc_expr * s)
1674 int shift, ashift, isize, k, *bits, i;
1676 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1679 if (gfc_extract_int (s, &shift) != NULL)
1681 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
1682 return &gfc_bad_expr;
1685 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
1687 isize = gfc_integer_kinds[k].bit_size;
1697 ("Magnitude of second argument of ISHFT exceeds bit size at %L",
1699 return &gfc_bad_expr;
1702 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1706 mpz_set (result->value.integer, e->value.integer);
1707 return range_check (result, "ISHFT");
1710 bits = gfc_getmem (isize * sizeof (int));
1712 for (i = 0; i < isize; i++)
1713 bits[i] = mpz_tstbit (e->value.integer, i);
1717 for (i = 0; i < shift; i++)
1718 mpz_clrbit (result->value.integer, i);
1720 for (i = 0; i < isize - shift; i++)
1723 mpz_clrbit (result->value.integer, i + shift);
1725 mpz_setbit (result->value.integer, i + shift);
1730 for (i = isize - 1; i >= isize - ashift; i--)
1731 mpz_clrbit (result->value.integer, i);
1733 for (i = isize - 1; i >= ashift; i--)
1736 mpz_clrbit (result->value.integer, i - ashift);
1738 mpz_setbit (result->value.integer, i - ashift);
1742 twos_complement (result->value.integer, isize);
1750 gfc_simplify_ishftc (gfc_expr * e, gfc_expr * s, gfc_expr * sz)
1753 int shift, ashift, isize, delta, k;
1756 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1759 if (gfc_extract_int (s, &shift) != NULL)
1761 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
1762 return &gfc_bad_expr;
1765 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1769 if (gfc_extract_int (sz, &isize) != NULL || isize < 0)
1771 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
1772 return &gfc_bad_expr;
1776 isize = gfc_integer_kinds[k].bit_size;
1786 ("Magnitude of second argument of ISHFTC exceeds third argument "
1787 "at %L", &s->where);
1788 return &gfc_bad_expr;
1791 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1795 mpz_set (result->value.integer, e->value.integer);
1799 bits = gfc_getmem (isize * sizeof (int));
1801 for (i = 0; i < isize; i++)
1802 bits[i] = mpz_tstbit (e->value.integer, i);
1804 delta = isize - ashift;
1808 for (i = 0; i < delta; i++)
1811 mpz_clrbit (result->value.integer, i + shift);
1813 mpz_setbit (result->value.integer, i + shift);
1816 for (i = delta; i < isize; i++)
1819 mpz_clrbit (result->value.integer, i - delta);
1821 mpz_setbit (result->value.integer, i - delta);
1826 for (i = 0; i < ashift; i++)
1829 mpz_clrbit (result->value.integer, i + delta);
1831 mpz_setbit (result->value.integer, i + delta);
1834 for (i = ashift; i < isize; i++)
1837 mpz_clrbit (result->value.integer, i + shift);
1839 mpz_setbit (result->value.integer, i + shift);
1843 twos_complement (result->value.integer, isize);
1851 gfc_simplify_kind (gfc_expr * e)
1854 if (e->ts.type == BT_DERIVED)
1856 gfc_error ("Argument of KIND at %L is a DERIVED type", &e->where);
1857 return &gfc_bad_expr;
1860 return gfc_int_expr (e->ts.kind);
1865 simplify_bound (gfc_expr * array, gfc_expr * dim, int upper)
1872 if (array->expr_type != EXPR_VARIABLE)
1876 /* TODO: Simplify constant multi-dimensional bounds. */
1879 if (dim->expr_type != EXPR_CONSTANT)
1882 /* Follow any component references. */
1883 as = array->symtree->n.sym->as;
1884 for (ref = array->ref; ref; ref = ref->next)
1889 switch (ref->u.ar.type)
1896 /* We're done because 'as' has already been set in the
1897 previous iteration. */
1908 as = ref->u.c.component->as;
1919 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
1922 d = mpz_get_si (dim->value.integer);
1924 if (d < 1 || d > as->rank
1925 || (d == as->rank && as->type == AS_ASSUMED_SIZE && upper))
1927 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
1928 return &gfc_bad_expr;
1931 e = upper ? as->upper[d-1] : as->lower[d-1];
1933 if (e->expr_type != EXPR_CONSTANT)
1936 return gfc_copy_expr (e);
1941 gfc_simplify_lbound (gfc_expr * array, gfc_expr * dim)
1943 return simplify_bound (array, dim, 0);
1948 gfc_simplify_len (gfc_expr * e)
1952 if (e->expr_type == EXPR_CONSTANT)
1954 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1956 mpz_set_si (result->value.integer, e->value.character.length);
1957 return range_check (result, "LEN");
1960 if (e->ts.cl != NULL && e->ts.cl->length != NULL
1961 && e->ts.cl->length->expr_type == EXPR_CONSTANT)
1963 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1965 mpz_set (result->value.integer, e->ts.cl->length->value.integer);
1966 return range_check (result, "LEN");
1974 gfc_simplify_len_trim (gfc_expr * e)
1977 int count, len, lentrim, i;
1979 if (e->expr_type != EXPR_CONSTANT)
1982 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1985 len = e->value.character.length;
1987 for (count = 0, i = 1; i <= len; i++)
1988 if (e->value.character.string[len - i] == ' ')
1993 lentrim = len - count;
1995 mpz_set_si (result->value.integer, lentrim);
1996 return range_check (result, "LEN_TRIM");
2001 gfc_simplify_lge (gfc_expr * a, gfc_expr * b)
2004 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2007 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) >= 0,
2013 gfc_simplify_lgt (gfc_expr * a, gfc_expr * b)
2016 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2019 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) > 0,
2025 gfc_simplify_lle (gfc_expr * a, gfc_expr * b)
2028 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2031 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) <= 0,
2037 gfc_simplify_llt (gfc_expr * a, gfc_expr * b)
2040 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2043 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) < 0,
2049 gfc_simplify_log (gfc_expr * x)
2054 if (x->expr_type != EXPR_CONSTANT)
2057 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2059 gfc_set_model_kind (x->ts.kind);
2064 if (mpfr_sgn (x->value.real) <= 0)
2067 ("Argument of LOG at %L cannot be less than or equal to zero",
2069 gfc_free_expr (result);
2070 return &gfc_bad_expr;
2073 mpfr_log(result->value.real, x->value.real, GFC_RND_MODE);
2077 if ((mpfr_sgn (x->value.complex.r) == 0)
2078 && (mpfr_sgn (x->value.complex.i) == 0))
2080 gfc_error ("Complex argument of LOG at %L cannot be zero",
2082 gfc_free_expr (result);
2083 return &gfc_bad_expr;
2089 arctangent2 (x->value.complex.i, x->value.complex.r,
2090 result->value.complex.i);
2092 mpfr_mul (xr, x->value.complex.r, x->value.complex.r, GFC_RND_MODE);
2093 mpfr_mul (xi, x->value.complex.i, x->value.complex.i, GFC_RND_MODE);
2094 mpfr_add (xr, xr, xi, GFC_RND_MODE);
2095 mpfr_sqrt (xr, xr, GFC_RND_MODE);
2096 mpfr_log (result->value.complex.r, xr, GFC_RND_MODE);
2104 gfc_internal_error ("gfc_simplify_log: bad type");
2107 return range_check (result, "LOG");
2112 gfc_simplify_log10 (gfc_expr * x)
2116 if (x->expr_type != EXPR_CONSTANT)
2119 gfc_set_model_kind (x->ts.kind);
2121 if (mpfr_sgn (x->value.real) <= 0)
2124 ("Argument of LOG10 at %L cannot be less than or equal to zero",
2126 return &gfc_bad_expr;
2129 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2131 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
2133 return range_check (result, "LOG10");
2138 gfc_simplify_logical (gfc_expr * e, gfc_expr * k)
2143 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
2145 return &gfc_bad_expr;
2147 if (e->expr_type != EXPR_CONSTANT)
2150 result = gfc_constant_result (BT_LOGICAL, kind, &e->where);
2152 result->value.logical = e->value.logical;
2158 /* This function is special since MAX() can take any number of
2159 arguments. The simplified expression is a rewritten version of the
2160 argument list containing at most one constant element. Other
2161 constant elements are deleted. Because the argument list has
2162 already been checked, this function always succeeds. sign is 1 for
2163 MAX(), -1 for MIN(). */
2166 simplify_min_max (gfc_expr * expr, int sign)
2168 gfc_actual_arglist *arg, *last, *extremum;
2169 gfc_intrinsic_sym * specific;
2173 specific = expr->value.function.isym;
2175 arg = expr->value.function.actual;
2177 for (; arg; last = arg, arg = arg->next)
2179 if (arg->expr->expr_type != EXPR_CONSTANT)
2182 if (extremum == NULL)
2188 switch (arg->expr->ts.type)
2191 if (mpz_cmp (arg->expr->value.integer,
2192 extremum->expr->value.integer) * sign > 0)
2193 mpz_set (extremum->expr->value.integer, arg->expr->value.integer);
2198 if (mpfr_cmp (arg->expr->value.real, extremum->expr->value.real) *
2200 mpfr_set (extremum->expr->value.real, arg->expr->value.real,
2206 gfc_internal_error ("gfc_simplify_max(): Bad type in arglist");
2209 /* Delete the extra constant argument. */
2211 expr->value.function.actual = arg->next;
2213 last->next = arg->next;
2216 gfc_free_actual_arglist (arg);
2220 /* If there is one value left, replace the function call with the
2222 if (expr->value.function.actual->next != NULL)
2225 /* Convert to the correct type and kind. */
2226 if (expr->ts.type != BT_UNKNOWN)
2227 return gfc_convert_constant (expr->value.function.actual->expr,
2228 expr->ts.type, expr->ts.kind);
2230 if (specific->ts.type != BT_UNKNOWN)
2231 return gfc_convert_constant (expr->value.function.actual->expr,
2232 specific->ts.type, specific->ts.kind);
2234 return gfc_copy_expr (expr->value.function.actual->expr);
2239 gfc_simplify_min (gfc_expr * e)
2241 return simplify_min_max (e, -1);
2246 gfc_simplify_max (gfc_expr * e)
2248 return simplify_min_max (e, 1);
2253 gfc_simplify_maxexponent (gfc_expr * x)
2258 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2260 result = gfc_int_expr (gfc_real_kinds[i].max_exponent);
2261 result->where = x->where;
2268 gfc_simplify_minexponent (gfc_expr * x)
2273 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2275 result = gfc_int_expr (gfc_real_kinds[i].min_exponent);
2276 result->where = x->where;
2283 gfc_simplify_mod (gfc_expr * a, gfc_expr * p)
2286 mpfr_t quot, iquot, term;
2289 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2292 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2293 result = gfc_constant_result (a->ts.type, kind, &a->where);
2298 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2300 /* Result is processor-dependent. */
2301 gfc_error ("Second argument MOD at %L is zero", &a->where);
2302 gfc_free_expr (result);
2303 return &gfc_bad_expr;
2305 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
2309 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2311 /* Result is processor-dependent. */
2312 gfc_error ("Second argument of MOD at %L is zero", &p->where);
2313 gfc_free_expr (result);
2314 return &gfc_bad_expr;
2317 gfc_set_model_kind (kind);
2322 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2323 mpfr_trunc (iquot, quot);
2324 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2325 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2333 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
2336 return range_check (result, "MOD");
2341 gfc_simplify_modulo (gfc_expr * a, gfc_expr * p)
2344 mpfr_t quot, iquot, term;
2347 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2350 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2351 result = gfc_constant_result (a->ts.type, kind, &a->where);
2356 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2358 /* Result is processor-dependent. This processor just opts
2359 to not handle it at all. */
2360 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
2361 gfc_free_expr (result);
2362 return &gfc_bad_expr;
2364 mpz_fdiv_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 MODULO 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_floor (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_modulo(): Bad arguments");
2396 return range_check (result, "MODULO");
2400 /* Exists for the sole purpose of consistency with other intrinsics. */
2402 gfc_simplify_mvbits (gfc_expr * f ATTRIBUTE_UNUSED,
2403 gfc_expr * fp ATTRIBUTE_UNUSED,
2404 gfc_expr * l ATTRIBUTE_UNUSED,
2405 gfc_expr * to ATTRIBUTE_UNUSED,
2406 gfc_expr * tp ATTRIBUTE_UNUSED)
2413 gfc_simplify_nearest (gfc_expr * x, gfc_expr * s)
2419 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2422 gfc_set_model_kind (x->ts.kind);
2423 result = gfc_copy_expr (x);
2425 direction = mpfr_sgn (s->value.real);
2429 gfc_error ("Second argument of NEAREST at %L may not be zero",
2432 return &gfc_bad_expr;
2435 /* TODO: Use mpfr_nextabove and mpfr_nextbelow once we move to a
2436 newer version of mpfr. */
2438 sgn = mpfr_sgn (x->value.real);
2442 int k = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
2445 mpfr_add (result->value.real,
2446 x->value.real, gfc_real_kinds[k].subnormal, GFC_RND_MODE);
2448 mpfr_sub (result->value.real,
2449 x->value.real, gfc_real_kinds[k].subnormal, GFC_RND_MODE);
2455 direction = -direction;
2456 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
2460 mpfr_add_one_ulp (result->value.real, GFC_RND_MODE);
2463 /* In this case the exponent can shrink, which makes us skip
2464 over one number because we subtract one ulp with the
2465 larger exponent. Thus we need to compensate for this. */
2466 mpfr_init_set (tmp, result->value.real, GFC_RND_MODE);
2468 mpfr_sub_one_ulp (result->value.real, GFC_RND_MODE);
2469 mpfr_add_one_ulp (result->value.real, GFC_RND_MODE);
2471 /* If we're back to where we started, the spacing is one
2472 ulp, and we get the correct result by subtracting. */
2473 if (mpfr_cmp (tmp, result->value.real) == 0)
2474 mpfr_sub_one_ulp (result->value.real, GFC_RND_MODE);
2480 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
2483 return range_check (result, "NEAREST");
2488 simplify_nint (const char *name, gfc_expr * e, gfc_expr * k)
2490 gfc_expr *itrunc, *result;
2493 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
2495 return &gfc_bad_expr;
2497 if (e->expr_type != EXPR_CONSTANT)
2500 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
2502 itrunc = gfc_copy_expr (e);
2504 mpfr_round(itrunc->value.real, e->value.real);
2506 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real);
2508 gfc_free_expr (itrunc);
2510 return range_check (result, name);
2515 gfc_simplify_nint (gfc_expr * e, gfc_expr * k)
2517 return simplify_nint ("NINT", e, k);
2522 gfc_simplify_idnint (gfc_expr * e)
2524 return simplify_nint ("IDNINT", e, NULL);
2529 gfc_simplify_not (gfc_expr * e)
2534 if (e->expr_type != EXPR_CONSTANT)
2537 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2539 mpz_com (result->value.integer, e->value.integer);
2541 /* Because of how GMP handles numbers, the result must be ANDed with
2542 the max_int mask. For radices <> 2, this will require change. */
2544 i = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2546 mpz_and (result->value.integer, result->value.integer,
2547 gfc_integer_kinds[i].max_int);
2549 twos_complement (result->value.integer, gfc_integer_kinds[i].bit_size);
2551 return range_check (result, "NOT");
2556 gfc_simplify_null (gfc_expr * mold)
2562 result = gfc_get_expr ();
2563 result->ts.type = BT_UNKNOWN;
2566 result = gfc_copy_expr (mold);
2567 result->expr_type = EXPR_NULL;
2574 gfc_simplify_or (gfc_expr * x, gfc_expr * y)
2579 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2582 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
2583 if (x->ts.type == BT_INTEGER)
2585 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
2586 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2588 else /* BT_LOGICAL */
2590 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
2591 result->value.logical = x->value.logical || y->value.logical;
2594 return range_check (result, "OR");
2599 gfc_simplify_precision (gfc_expr * e)
2604 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2606 result = gfc_int_expr (gfc_real_kinds[i].precision);
2607 result->where = e->where;
2614 gfc_simplify_radix (gfc_expr * e)
2619 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2623 i = gfc_integer_kinds[i].radix;
2627 i = gfc_real_kinds[i].radix;
2634 result = gfc_int_expr (i);
2635 result->where = e->where;
2642 gfc_simplify_range (gfc_expr * e)
2648 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2653 j = gfc_integer_kinds[i].range;
2658 j = gfc_real_kinds[i].range;
2665 result = gfc_int_expr (j);
2666 result->where = e->where;
2673 gfc_simplify_real (gfc_expr * e, gfc_expr * k)
2678 if (e->ts.type == BT_COMPLEX)
2679 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
2681 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
2684 return &gfc_bad_expr;
2686 if (e->expr_type != EXPR_CONSTANT)
2692 result = gfc_int2real (e, kind);
2696 result = gfc_real2real (e, kind);
2700 result = gfc_complex2real (e, kind);
2704 gfc_internal_error ("bad type in REAL");
2708 return range_check (result, "REAL");
2713 gfc_simplify_realpart (gfc_expr * e)
2717 if (e->expr_type != EXPR_CONSTANT)
2720 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
2721 mpfr_set (result->value.real, e->value.complex.r, GFC_RND_MODE);
2723 return range_check (result, "REALPART");
2727 gfc_simplify_repeat (gfc_expr * e, gfc_expr * n)
2730 int i, j, len, ncopies, nlen;
2732 if (e->expr_type != EXPR_CONSTANT || n->expr_type != EXPR_CONSTANT)
2735 if (n != NULL && (gfc_extract_int (n, &ncopies) != NULL || ncopies < 0))
2737 gfc_error ("Invalid second argument of REPEAT at %L", &n->where);
2738 return &gfc_bad_expr;
2741 len = e->value.character.length;
2742 nlen = ncopies * len;
2744 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
2748 result->value.character.string = gfc_getmem (1);
2749 result->value.character.length = 0;
2750 result->value.character.string[0] = '\0';
2754 result->value.character.length = nlen;
2755 result->value.character.string = gfc_getmem (nlen + 1);
2757 for (i = 0; i < ncopies; i++)
2758 for (j = 0; j < len; j++)
2759 result->value.character.string[j + i * len] =
2760 e->value.character.string[j];
2762 result->value.character.string[nlen] = '\0'; /* For debugger */
2767 /* This one is a bear, but mainly has to do with shuffling elements. */
2770 gfc_simplify_reshape (gfc_expr * source, gfc_expr * shape_exp,
2771 gfc_expr * pad, gfc_expr * order_exp)
2774 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
2775 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
2776 gfc_constructor *head, *tail;
2782 /* Unpack the shape array. */
2783 if (source->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (source))
2786 if (shape_exp->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (shape_exp))
2790 && (pad->expr_type != EXPR_ARRAY
2791 || !gfc_is_constant_expr (pad)))
2794 if (order_exp != NULL
2795 && (order_exp->expr_type != EXPR_ARRAY
2796 || !gfc_is_constant_expr (order_exp)))
2805 e = gfc_get_array_element (shape_exp, rank);
2809 if (gfc_extract_int (e, &shape[rank]) != NULL)
2811 gfc_error ("Integer too large in shape specification at %L",
2819 if (rank >= GFC_MAX_DIMENSIONS)
2821 gfc_error ("Too many dimensions in shape specification for RESHAPE "
2822 "at %L", &e->where);
2827 if (shape[rank] < 0)
2829 gfc_error ("Shape specification at %L cannot be negative",
2839 gfc_error ("Shape specification at %L cannot be the null array",
2844 /* Now unpack the order array if present. */
2845 if (order_exp == NULL)
2847 for (i = 0; i < rank; i++)
2854 for (i = 0; i < rank; i++)
2857 for (i = 0; i < rank; i++)
2859 e = gfc_get_array_element (order_exp, i);
2863 ("ORDER parameter of RESHAPE at %L is not the same size "
2864 "as SHAPE parameter", &order_exp->where);
2868 if (gfc_extract_int (e, &order[i]) != NULL)
2870 gfc_error ("Error in ORDER parameter of RESHAPE at %L",
2878 if (order[i] < 1 || order[i] > rank)
2880 gfc_error ("ORDER parameter of RESHAPE at %L is out of range",
2889 gfc_error ("Invalid permutation in ORDER parameter at %L",
2898 /* Count the elements in the source and padding arrays. */
2903 gfc_array_size (pad, &size);
2904 npad = mpz_get_ui (size);
2908 gfc_array_size (source, &size);
2909 nsource = mpz_get_ui (size);
2912 /* If it weren't for that pesky permutation we could just loop
2913 through the source and round out any shortage with pad elements.
2914 But no, someone just had to have the compiler do something the
2915 user should be doing. */
2917 for (i = 0; i < rank; i++)
2922 /* Figure out which element to extract. */
2923 mpz_set_ui (index, 0);
2925 for (i = rank - 1; i >= 0; i--)
2927 mpz_add_ui (index, index, x[order[i]]);
2929 mpz_mul_ui (index, index, shape[order[i - 1]]);
2932 if (mpz_cmp_ui (index, INT_MAX) > 0)
2933 gfc_internal_error ("Reshaped array too large at %L", &e->where);
2935 j = mpz_get_ui (index);
2938 e = gfc_get_array_element (source, j);
2946 ("PAD parameter required for short SOURCE parameter at %L",
2952 e = gfc_get_array_element (pad, j);
2956 head = tail = gfc_get_constructor ();
2959 tail->next = gfc_get_constructor ();
2966 tail->where = e->where;
2969 /* Calculate the next element. */
2973 if (++x[i] < shape[i])
2984 e = gfc_get_expr ();
2985 e->where = source->where;
2986 e->expr_type = EXPR_ARRAY;
2987 e->value.constructor = head;
2988 e->shape = gfc_get_shape (rank);
2990 for (i = 0; i < rank; i++)
2991 mpz_init_set_ui (e->shape[i], shape[i]);
2999 gfc_free_constructor (head);
3001 return &gfc_bad_expr;
3006 gfc_simplify_rrspacing (gfc_expr * x)
3009 mpfr_t absv, log2, exp, frac, pow2;
3012 if (x->expr_type != EXPR_CONSTANT)
3015 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3017 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3019 p = gfc_real_kinds[i].digits;
3021 gfc_set_model_kind (x->ts.kind);
3023 if (mpfr_sgn (x->value.real) == 0)
3025 mpfr_ui_div (result->value.real, 1, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3035 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3036 mpfr_log2 (log2, absv, GFC_RND_MODE);
3038 mpfr_trunc (log2, log2);
3039 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3041 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3042 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3044 mpfr_mul_2exp (result->value.real, frac, (unsigned long)p, GFC_RND_MODE);
3052 return range_check (result, "RRSPACING");
3057 gfc_simplify_scale (gfc_expr * x, gfc_expr * i)
3059 int k, neg_flag, power, exp_range;
3060 mpfr_t scale, radix;
3063 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3066 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3068 if (mpfr_sgn (x->value.real) == 0)
3070 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3074 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3076 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
3078 /* This check filters out values of i that would overflow an int. */
3079 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
3080 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
3082 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
3083 return &gfc_bad_expr;
3086 /* Compute scale = radix ** power. */
3087 power = mpz_get_si (i->value.integer);
3097 gfc_set_model_kind (x->ts.kind);
3100 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
3101 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
3104 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
3106 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
3111 return range_check (result, "SCALE");
3116 gfc_simplify_scan (gfc_expr * e, gfc_expr * c, gfc_expr * b)
3121 size_t indx, len, lenc;
3123 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
3126 if (b != NULL && b->value.logical != 0)
3131 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3134 len = e->value.character.length;
3135 lenc = c->value.character.length;
3137 if (len == 0 || lenc == 0)
3146 strcspn (e->value.character.string, c->value.character.string) + 1;
3153 for (indx = len; indx > 0; indx--)
3155 for (i = 0; i < lenc; i++)
3157 if (c->value.character.string[i]
3158 == e->value.character.string[indx - 1])
3166 mpz_set_ui (result->value.integer, indx);
3167 return range_check (result, "SCAN");
3172 gfc_simplify_selected_int_kind (gfc_expr * e)
3177 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
3182 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3183 if (gfc_integer_kinds[i].range >= range
3184 && gfc_integer_kinds[i].kind < kind)
3185 kind = gfc_integer_kinds[i].kind;
3187 if (kind == INT_MAX)
3190 result = gfc_int_expr (kind);
3191 result->where = e->where;
3198 gfc_simplify_selected_real_kind (gfc_expr * p, gfc_expr * q)
3200 int range, precision, i, kind, found_precision, found_range;
3207 if (p->expr_type != EXPR_CONSTANT
3208 || gfc_extract_int (p, &precision) != NULL)
3216 if (q->expr_type != EXPR_CONSTANT
3217 || gfc_extract_int (q, &range) != NULL)
3222 found_precision = 0;
3225 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3227 if (gfc_real_kinds[i].precision >= precision)
3228 found_precision = 1;
3230 if (gfc_real_kinds[i].range >= range)
3233 if (gfc_real_kinds[i].precision >= precision
3234 && gfc_real_kinds[i].range >= range && gfc_real_kinds[i].kind < kind)
3235 kind = gfc_real_kinds[i].kind;
3238 if (kind == INT_MAX)
3242 if (!found_precision)
3248 result = gfc_int_expr (kind);
3249 result->where = (p != NULL) ? p->where : q->where;
3256 gfc_simplify_set_exponent (gfc_expr * x, gfc_expr * i)
3259 mpfr_t exp, absv, log2, pow2, frac;
3262 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3265 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3267 gfc_set_model_kind (x->ts.kind);
3269 if (mpfr_sgn (x->value.real) == 0)
3271 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3281 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3282 mpfr_log2 (log2, absv, GFC_RND_MODE);
3284 mpfr_trunc (log2, log2);
3285 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3287 /* Old exponent value, and fraction. */
3288 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3290 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3293 exp2 = (unsigned long) mpz_get_d (i->value.integer);
3294 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
3301 return range_check (result, "SET_EXPONENT");
3306 gfc_simplify_shape (gfc_expr * source)
3308 mpz_t shape[GFC_MAX_DIMENSIONS];
3309 gfc_expr *result, *e, *f;
3314 if (source->rank == 0 || source->expr_type != EXPR_VARIABLE)
3317 result = gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3320 ar = gfc_find_array_ref (source);
3322 t = gfc_array_ref_shape (ar, shape);
3324 for (n = 0; n < source->rank; n++)
3326 e = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3331 mpz_set (e->value.integer, shape[n]);
3332 mpz_clear (shape[n]);
3336 mpz_set_ui (e->value.integer, n + 1);
3338 f = gfc_simplify_size (source, e);
3342 gfc_free_expr (result);
3351 gfc_append_constructor (result, e);
3359 gfc_simplify_size (gfc_expr * array, gfc_expr * dim)
3367 if (gfc_array_size (array, &size) == FAILURE)
3372 if (dim->expr_type != EXPR_CONSTANT)
3375 d = mpz_get_ui (dim->value.integer) - 1;
3376 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
3380 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3383 mpz_set (result->value.integer, size);
3390 gfc_simplify_sign (gfc_expr * x, gfc_expr * y)
3394 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3397 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3402 mpz_abs (result->value.integer, x->value.integer);
3403 if (mpz_sgn (y->value.integer) < 0)
3404 mpz_neg (result->value.integer, result->value.integer);
3409 /* TODO: Handle -0.0 and +0.0 correctly on machines that support
3411 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3412 if (mpfr_sgn (y->value.real) < 0)
3413 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
3418 gfc_internal_error ("Bad type in gfc_simplify_sign");
3426 gfc_simplify_sin (gfc_expr * x)
3431 if (x->expr_type != EXPR_CONSTANT)
3434 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3439 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
3443 gfc_set_model (x->value.real);
3447 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
3448 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
3449 mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
3451 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
3452 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
3453 mpfr_mul (result->value.complex.i, xp, xq, GFC_RND_MODE);
3460 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
3463 return range_check (result, "SIN");
3468 gfc_simplify_sinh (gfc_expr * x)
3472 if (x->expr_type != EXPR_CONSTANT)
3475 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3477 mpfr_sinh(result->value.real, x->value.real, GFC_RND_MODE);
3479 return range_check (result, "SINH");
3483 /* The argument is always a double precision real that is converted to
3484 single precision. TODO: Rounding! */
3487 gfc_simplify_sngl (gfc_expr * a)
3491 if (a->expr_type != EXPR_CONSTANT)
3494 result = gfc_real2real (a, gfc_default_real_kind);
3495 return range_check (result, "SNGL");
3500 gfc_simplify_spacing (gfc_expr * x)
3507 if (x->expr_type != EXPR_CONSTANT)
3510 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3512 p = gfc_real_kinds[i].digits;
3514 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3516 gfc_set_model_kind (x->ts.kind);
3518 if (mpfr_sgn (x->value.real) == 0)
3520 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3527 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3528 mpfr_log2 (log2, absv, GFC_RND_MODE);
3529 mpfr_trunc (log2, log2);
3531 mpfr_add_ui (log2, log2, 1, GFC_RND_MODE);
3533 /* FIXME: We should be using mpfr_get_si here, but this function is
3534 not available with the version of mpfr distributed with gmp (as of
3535 2004-09-17). Replace once mpfr has been imported into the gcc cvs
3537 diff = (long)mpfr_get_d (log2, GFC_RND_MODE) - (long)p;
3538 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
3539 mpfr_mul_2si (result->value.real, result->value.real, diff, GFC_RND_MODE);
3544 if (mpfr_cmp (result->value.real, gfc_real_kinds[i].tiny) < 0)
3545 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3547 return range_check (result, "SPACING");
3552 gfc_simplify_sqrt (gfc_expr * e)
3555 mpfr_t ac, ad, s, t, w;
3557 if (e->expr_type != EXPR_CONSTANT)
3560 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
3565 if (mpfr_cmp_si (e->value.real, 0) < 0)
3567 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
3572 /* Formula taken from Numerical Recipes to avoid over- and
3575 gfc_set_model (e->value.real);
3582 if (mpfr_cmp_ui (e->value.complex.r, 0) == 0
3583 && mpfr_cmp_ui (e->value.complex.i, 0) == 0)
3586 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
3587 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
3591 mpfr_abs (ac, e->value.complex.r, GFC_RND_MODE);
3592 mpfr_abs (ad, e->value.complex.i, GFC_RND_MODE);
3594 if (mpfr_cmp (ac, ad) >= 0)
3596 mpfr_div (t, e->value.complex.i, e->value.complex.r, GFC_RND_MODE);
3597 mpfr_mul (t, t, t, GFC_RND_MODE);
3598 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3599 mpfr_sqrt (t, t, GFC_RND_MODE);
3600 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3601 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3602 mpfr_sqrt (t, t, GFC_RND_MODE);
3603 mpfr_sqrt (s, ac, GFC_RND_MODE);
3604 mpfr_mul (w, s, t, GFC_RND_MODE);
3608 mpfr_div (s, e->value.complex.r, e->value.complex.i, GFC_RND_MODE);
3609 mpfr_mul (t, s, s, GFC_RND_MODE);
3610 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3611 mpfr_sqrt (t, t, GFC_RND_MODE);
3612 mpfr_abs (s, s, GFC_RND_MODE);
3613 mpfr_add (t, t, s, GFC_RND_MODE);
3614 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3615 mpfr_sqrt (t, t, GFC_RND_MODE);
3616 mpfr_sqrt (s, ad, GFC_RND_MODE);
3617 mpfr_mul (w, s, t, GFC_RND_MODE);
3620 if (mpfr_cmp_ui (w, 0) != 0 && mpfr_cmp_ui (e->value.complex.r, 0) >= 0)
3622 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3623 mpfr_div (result->value.complex.i, e->value.complex.i, t, GFC_RND_MODE);
3624 mpfr_set (result->value.complex.r, w, GFC_RND_MODE);
3626 else if (mpfr_cmp_ui (w, 0) != 0
3627 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3628 && mpfr_cmp_ui (e->value.complex.i, 0) >= 0)
3630 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3631 mpfr_div (result->value.complex.r, e->value.complex.i, t, GFC_RND_MODE);
3632 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3634 else if (mpfr_cmp_ui (w, 0) != 0
3635 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3636 && mpfr_cmp_ui (e->value.complex.i, 0) < 0)
3638 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3639 mpfr_div (result->value.complex.r, ad, t, GFC_RND_MODE);
3640 mpfr_neg (w, w, GFC_RND_MODE);
3641 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3644 gfc_internal_error ("invalid complex argument of SQRT at %L",
3656 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
3659 return range_check (result, "SQRT");
3662 gfc_free_expr (result);
3663 gfc_error ("Argument of SQRT at %L has a negative value", &e->where);
3664 return &gfc_bad_expr;
3669 gfc_simplify_tan (gfc_expr * x)
3674 if (x->expr_type != EXPR_CONSTANT)
3677 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3679 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3681 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
3683 return range_check (result, "TAN");
3688 gfc_simplify_tanh (gfc_expr * x)
3692 if (x->expr_type != EXPR_CONSTANT)
3695 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3697 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
3699 return range_check (result, "TANH");
3705 gfc_simplify_tiny (gfc_expr * e)
3710 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
3712 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
3713 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3720 gfc_simplify_transfer (gfc_expr * source, gfc_expr *mold, gfc_expr * size)
3723 /* Reference mold and size to suppress warning. */
3724 if (gfc_init_expr && (mold || size))
3725 gfc_error ("TRANSFER intrinsic not implemented for initialization at %L",
3733 gfc_simplify_trim (gfc_expr * e)
3736 int count, i, len, lentrim;
3738 if (e->expr_type != EXPR_CONSTANT)
3741 len = e->value.character.length;
3743 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3745 for (count = 0, i = 1; i <= len; ++i)
3747 if (e->value.character.string[len - i] == ' ')
3753 lentrim = len - count;
3755 result->value.character.length = lentrim;
3756 result->value.character.string = gfc_getmem (lentrim + 1);