* Merge from mainline
[official-gcc.git] / gcc / fortran / simplify.c
blob894903bdd2e815786fb5d05f905a00739bfbb2c9
1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
3 Foundation, Inc.
4 Contributed by Andy Vaught & Katherine Holcomb
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
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
16 for more details.
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
21 02110-1301, USA. */
23 #include "config.h"
24 #include "system.h"
25 #include "flags.h"
26 #include "gfortran.h"
27 #include "arith.h"
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
47 retained.
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
59 its processing.
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. */
95 static gfc_expr *
96 range_check (gfc_expr * result, const char *name)
98 if (gfc_range_check (result) == ARITH_OK)
99 return result;
101 gfc_error ("Result of %s overflows its kind at %L", name, &result->where);
102 gfc_free_expr (result);
103 return &gfc_bad_expr;
107 /* A helper function that gets an optional and possibly missing
108 kind parameter. Returns the kind, -1 if something went wrong. */
110 static int
111 get_kind (bt type, gfc_expr * k, const char *name, int default_kind)
113 int kind;
115 if (k == NULL)
116 return default_kind;
118 if (k->expr_type != EXPR_CONSTANT)
120 gfc_error ("KIND parameter of %s at %L must be an initialization "
121 "expression", name, &k->where);
123 return -1;
126 if (gfc_extract_int (k, &kind) != NULL
127 || gfc_validate_kind (type, kind, true) < 0)
130 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
131 return -1;
134 return kind;
138 /* Checks if X, which is assumed to represent a two's complement
139 integer of binary width BITSIZE, has the signbit set. If so, makes
140 X the corresponding negative number. */
142 static void
143 twos_complement (mpz_t x, int bitsize)
145 mpz_t mask;
147 if (mpz_tstbit (x, bitsize - 1) == 1)
149 mpz_init_set_ui(mask, 1);
150 mpz_mul_2exp(mask, mask, bitsize);
151 mpz_sub_ui(mask, mask, 1);
153 /* We negate the number by hand, zeroing the high bits, that is
154 make it the corresponding positive number, and then have it
155 negated by GMP, giving the correct representation of the
156 negative number. */
157 mpz_com (x, x);
158 mpz_add_ui (x, x, 1);
159 mpz_and (x, x, mask);
161 mpz_neg (x, x);
163 mpz_clear (mask);
168 /********************** Simplification functions *****************************/
170 gfc_expr *
171 gfc_simplify_abs (gfc_expr * e)
173 gfc_expr *result;
175 if (e->expr_type != EXPR_CONSTANT)
176 return NULL;
178 switch (e->ts.type)
180 case BT_INTEGER:
181 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
183 mpz_abs (result->value.integer, e->value.integer);
185 result = range_check (result, "IABS");
186 break;
188 case BT_REAL:
189 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
191 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
193 result = range_check (result, "ABS");
194 break;
196 case BT_COMPLEX:
197 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
199 gfc_set_model_kind (e->ts.kind);
201 mpfr_hypot (result->value.real, e->value.complex.r,
202 e->value.complex.i, GFC_RND_MODE);
203 result = range_check (result, "CABS");
204 break;
206 default:
207 gfc_internal_error ("gfc_simplify_abs(): Bad type");
210 return result;
214 gfc_expr *
215 gfc_simplify_achar (gfc_expr * e)
217 gfc_expr *result;
218 int index;
220 if (e->expr_type != EXPR_CONSTANT)
221 return NULL;
223 /* We cannot assume that the native character set is ASCII in this
224 function. */
225 if (gfc_extract_int (e, &index) != NULL || index < 0 || index > 127)
227 gfc_error ("Extended ASCII not implemented: argument of ACHAR at %L "
228 "must be between 0 and 127", &e->where);
229 return &gfc_bad_expr;
232 result = gfc_constant_result (BT_CHARACTER, gfc_default_character_kind,
233 &e->where);
235 result->value.character.string = gfc_getmem (2);
237 result->value.character.length = 1;
238 result->value.character.string[0] = ascii_table[index];
239 result->value.character.string[1] = '\0'; /* For debugger */
240 return result;
244 gfc_expr *
245 gfc_simplify_acos (gfc_expr * x)
247 gfc_expr *result;
249 if (x->expr_type != EXPR_CONSTANT)
250 return NULL;
252 if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0)
254 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
255 &x->where);
256 return &gfc_bad_expr;
259 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
261 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
263 return range_check (result, "ACOS");
266 gfc_expr *
267 gfc_simplify_acosh (gfc_expr * x)
269 gfc_expr *result;
271 if (x->expr_type != EXPR_CONSTANT)
272 return NULL;
274 if (mpfr_cmp_si (x->value.real, 1) < 0)
276 gfc_error ("Argument of ACOSH at %L must not be less than 1",
277 &x->where);
278 return &gfc_bad_expr;
281 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
283 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
285 return range_check (result, "ACOSH");
288 gfc_expr *
289 gfc_simplify_adjustl (gfc_expr * e)
291 gfc_expr *result;
292 int count, i, len;
293 char ch;
295 if (e->expr_type != EXPR_CONSTANT)
296 return NULL;
298 len = e->value.character.length;
300 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
302 result->value.character.length = len;
303 result->value.character.string = gfc_getmem (len + 1);
305 for (count = 0, i = 0; i < len; ++i)
307 ch = e->value.character.string[i];
308 if (ch != ' ')
309 break;
310 ++count;
313 for (i = 0; i < len - count; ++i)
315 result->value.character.string[i] =
316 e->value.character.string[count + i];
319 for (i = len - count; i < len; ++i)
321 result->value.character.string[i] = ' ';
324 result->value.character.string[len] = '\0'; /* For debugger */
326 return result;
330 gfc_expr *
331 gfc_simplify_adjustr (gfc_expr * e)
333 gfc_expr *result;
334 int count, i, len;
335 char ch;
337 if (e->expr_type != EXPR_CONSTANT)
338 return NULL;
340 len = e->value.character.length;
342 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
344 result->value.character.length = len;
345 result->value.character.string = gfc_getmem (len + 1);
347 for (count = 0, i = len - 1; i >= 0; --i)
349 ch = e->value.character.string[i];
350 if (ch != ' ')
351 break;
352 ++count;
355 for (i = 0; i < count; ++i)
357 result->value.character.string[i] = ' ';
360 for (i = count; i < len; ++i)
362 result->value.character.string[i] =
363 e->value.character.string[i - count];
366 result->value.character.string[len] = '\0'; /* For debugger */
368 return result;
372 gfc_expr *
373 gfc_simplify_aimag (gfc_expr * e)
376 gfc_expr *result;
378 if (e->expr_type != EXPR_CONSTANT)
379 return NULL;
381 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
382 mpfr_set (result->value.real, e->value.complex.i, GFC_RND_MODE);
384 return range_check (result, "AIMAG");
388 gfc_expr *
389 gfc_simplify_aint (gfc_expr * e, gfc_expr * k)
391 gfc_expr *rtrunc, *result;
392 int kind;
394 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
395 if (kind == -1)
396 return &gfc_bad_expr;
398 if (e->expr_type != EXPR_CONSTANT)
399 return NULL;
401 rtrunc = gfc_copy_expr (e);
403 mpfr_trunc (rtrunc->value.real, e->value.real);
405 result = gfc_real2real (rtrunc, kind);
406 gfc_free_expr (rtrunc);
408 return range_check (result, "AINT");
412 gfc_expr *
413 gfc_simplify_dint (gfc_expr * e)
415 gfc_expr *rtrunc, *result;
417 if (e->expr_type != EXPR_CONSTANT)
418 return NULL;
420 rtrunc = gfc_copy_expr (e);
422 mpfr_trunc (rtrunc->value.real, e->value.real);
424 result = gfc_real2real (rtrunc, gfc_default_double_kind);
425 gfc_free_expr (rtrunc);
427 return range_check (result, "DINT");
431 gfc_expr *
432 gfc_simplify_anint (gfc_expr * e, gfc_expr * k)
434 gfc_expr *result;
435 int kind;
437 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
438 if (kind == -1)
439 return &gfc_bad_expr;
441 if (e->expr_type != EXPR_CONSTANT)
442 return NULL;
444 result = gfc_constant_result (e->ts.type, kind, &e->where);
446 mpfr_round (result->value.real, e->value.real);
448 return range_check (result, "ANINT");
452 gfc_expr *
453 gfc_simplify_and (gfc_expr * x, gfc_expr * y)
455 gfc_expr *result;
456 int kind;
458 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
459 return NULL;
461 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
462 if (x->ts.type == BT_INTEGER)
464 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
465 mpz_and (result->value.integer, x->value.integer, y->value.integer);
467 else /* BT_LOGICAL */
469 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
470 result->value.logical = x->value.logical && y->value.logical;
473 return range_check (result, "AND");
477 gfc_expr *
478 gfc_simplify_dnint (gfc_expr * e)
480 gfc_expr *result;
482 if (e->expr_type != EXPR_CONSTANT)
483 return NULL;
485 result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &e->where);
487 mpfr_round (result->value.real, e->value.real);
489 return range_check (result, "DNINT");
493 gfc_expr *
494 gfc_simplify_asin (gfc_expr * x)
496 gfc_expr *result;
498 if (x->expr_type != EXPR_CONSTANT)
499 return NULL;
501 if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0)
503 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
504 &x->where);
505 return &gfc_bad_expr;
508 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
510 mpfr_asin(result->value.real, x->value.real, GFC_RND_MODE);
512 return range_check (result, "ASIN");
516 gfc_expr *
517 gfc_simplify_asinh (gfc_expr * x)
519 gfc_expr *result;
521 if (x->expr_type != EXPR_CONSTANT)
522 return NULL;
524 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
526 mpfr_asinh(result->value.real, x->value.real, GFC_RND_MODE);
528 return range_check (result, "ASINH");
532 gfc_expr *
533 gfc_simplify_atan (gfc_expr * x)
535 gfc_expr *result;
537 if (x->expr_type != EXPR_CONSTANT)
538 return NULL;
540 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
542 mpfr_atan(result->value.real, x->value.real, GFC_RND_MODE);
544 return range_check (result, "ATAN");
548 gfc_expr *
549 gfc_simplify_atanh (gfc_expr * x)
551 gfc_expr *result;
553 if (x->expr_type != EXPR_CONSTANT)
554 return NULL;
556 if (mpfr_cmp_si (x->value.real, 1) >= 0 ||
557 mpfr_cmp_si (x->value.real, -1) <= 0)
559 gfc_error ("Argument of ATANH at %L must be inside the range -1 to 1",
560 &x->where);
561 return &gfc_bad_expr;
564 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
566 mpfr_atanh(result->value.real, x->value.real, GFC_RND_MODE);
568 return range_check (result, "ATANH");
572 gfc_expr *
573 gfc_simplify_atan2 (gfc_expr * y, gfc_expr * x)
575 gfc_expr *result;
577 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
578 return NULL;
580 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
582 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
584 gfc_error
585 ("If first argument of ATAN2 %L is zero, then the second argument "
586 "must not be zero", &x->where);
587 gfc_free_expr (result);
588 return &gfc_bad_expr;
591 arctangent2 (y->value.real, x->value.real, result->value.real);
593 return range_check (result, "ATAN2");
597 gfc_expr *
598 gfc_simplify_bit_size (gfc_expr * e)
600 gfc_expr *result;
601 int i;
603 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
604 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
605 mpz_set_ui (result->value.integer, gfc_integer_kinds[i].bit_size);
607 return result;
611 gfc_expr *
612 gfc_simplify_btest (gfc_expr * e, gfc_expr * bit)
614 int b;
616 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
617 return NULL;
619 if (gfc_extract_int (bit, &b) != NULL || b < 0)
620 return gfc_logical_expr (0, &e->where);
622 return gfc_logical_expr (mpz_tstbit (e->value.integer, b), &e->where);
626 gfc_expr *
627 gfc_simplify_ceiling (gfc_expr * e, gfc_expr * k)
629 gfc_expr *ceil, *result;
630 int kind;
632 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
633 if (kind == -1)
634 return &gfc_bad_expr;
636 if (e->expr_type != EXPR_CONSTANT)
637 return NULL;
639 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
641 ceil = gfc_copy_expr (e);
643 mpfr_ceil (ceil->value.real, e->value.real);
644 gfc_mpfr_to_mpz(result->value.integer, ceil->value.real);
646 gfc_free_expr (ceil);
648 return range_check (result, "CEILING");
652 gfc_expr *
653 gfc_simplify_char (gfc_expr * e, gfc_expr * k)
655 gfc_expr *result;
656 int c, kind;
658 kind = get_kind (BT_CHARACTER, k, "CHAR", gfc_default_character_kind);
659 if (kind == -1)
660 return &gfc_bad_expr;
662 if (e->expr_type != EXPR_CONSTANT)
663 return NULL;
665 if (gfc_extract_int (e, &c) != NULL || c < 0 || c > UCHAR_MAX)
667 gfc_error ("Bad character in CHAR function at %L", &e->where);
668 return &gfc_bad_expr;
671 result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
673 result->value.character.length = 1;
674 result->value.character.string = gfc_getmem (2);
676 result->value.character.string[0] = c;
677 result->value.character.string[1] = '\0'; /* For debugger */
679 return result;
683 /* Common subroutine for simplifying CMPLX and DCMPLX. */
685 static gfc_expr *
686 simplify_cmplx (const char *name, gfc_expr * x, gfc_expr * y, int kind)
688 gfc_expr *result;
690 result = gfc_constant_result (BT_COMPLEX, kind, &x->where);
692 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
694 switch (x->ts.type)
696 case BT_INTEGER:
697 mpfr_set_z (result->value.complex.r, x->value.integer, GFC_RND_MODE);
698 break;
700 case BT_REAL:
701 mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
702 break;
704 case BT_COMPLEX:
705 mpfr_set (result->value.complex.r, x->value.complex.r, GFC_RND_MODE);
706 mpfr_set (result->value.complex.i, x->value.complex.i, GFC_RND_MODE);
707 break;
709 default:
710 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
713 if (y != NULL)
715 switch (y->ts.type)
717 case BT_INTEGER:
718 mpfr_set_z (result->value.complex.i, y->value.integer, GFC_RND_MODE);
719 break;
721 case BT_REAL:
722 mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
723 break;
725 default:
726 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
730 return range_check (result, name);
734 gfc_expr *
735 gfc_simplify_cmplx (gfc_expr * x, gfc_expr * y, gfc_expr * k)
737 int kind;
739 if (x->expr_type != EXPR_CONSTANT
740 || (y != NULL && y->expr_type != EXPR_CONSTANT))
741 return NULL;
743 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_real_kind);
744 if (kind == -1)
745 return &gfc_bad_expr;
747 return simplify_cmplx ("CMPLX", x, y, kind);
751 gfc_expr *
752 gfc_simplify_complex (gfc_expr * x, gfc_expr * y)
754 int kind;
756 if (x->expr_type != EXPR_CONSTANT
757 || (y != NULL && y->expr_type != EXPR_CONSTANT))
758 return NULL;
760 if (x->ts.type == BT_INTEGER)
762 if (y->ts.type == BT_INTEGER)
763 kind = gfc_default_real_kind;
764 else
765 kind = y->ts.kind;
767 else
769 if (y->ts.type == BT_REAL)
770 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
771 else
772 kind = x->ts.kind;
775 return simplify_cmplx ("COMPLEX", x, y, kind);
779 gfc_expr *
780 gfc_simplify_conjg (gfc_expr * e)
782 gfc_expr *result;
784 if (e->expr_type != EXPR_CONSTANT)
785 return NULL;
787 result = gfc_copy_expr (e);
788 mpfr_neg (result->value.complex.i, result->value.complex.i, GFC_RND_MODE);
790 return range_check (result, "CONJG");
794 gfc_expr *
795 gfc_simplify_cos (gfc_expr * x)
797 gfc_expr *result;
798 mpfr_t xp, xq;
800 if (x->expr_type != EXPR_CONSTANT)
801 return NULL;
803 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
805 switch (x->ts.type)
807 case BT_REAL:
808 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
809 break;
810 case BT_COMPLEX:
811 gfc_set_model_kind (x->ts.kind);
812 mpfr_init (xp);
813 mpfr_init (xq);
815 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
816 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
817 mpfr_mul(result->value.complex.r, xp, xq, GFC_RND_MODE);
819 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
820 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
821 mpfr_mul (xp, xp, xq, GFC_RND_MODE);
822 mpfr_neg (result->value.complex.i, xp, GFC_RND_MODE );
824 mpfr_clear (xp);
825 mpfr_clear (xq);
826 break;
827 default:
828 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
831 return range_check (result, "COS");
836 gfc_expr *
837 gfc_simplify_cosh (gfc_expr * x)
839 gfc_expr *result;
841 if (x->expr_type != EXPR_CONSTANT)
842 return NULL;
844 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
846 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
848 return range_check (result, "COSH");
852 gfc_expr *
853 gfc_simplify_dcmplx (gfc_expr * x, gfc_expr * y)
856 if (x->expr_type != EXPR_CONSTANT
857 || (y != NULL && y->expr_type != EXPR_CONSTANT))
858 return NULL;
860 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
864 gfc_expr *
865 gfc_simplify_dble (gfc_expr * e)
867 gfc_expr *result;
869 if (e->expr_type != EXPR_CONSTANT)
870 return NULL;
872 switch (e->ts.type)
874 case BT_INTEGER:
875 result = gfc_int2real (e, gfc_default_double_kind);
876 break;
878 case BT_REAL:
879 result = gfc_real2real (e, gfc_default_double_kind);
880 break;
882 case BT_COMPLEX:
883 result = gfc_complex2real (e, gfc_default_double_kind);
884 break;
886 default:
887 gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e->where);
890 return range_check (result, "DBLE");
894 gfc_expr *
895 gfc_simplify_digits (gfc_expr * x)
897 int i, digits;
899 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
900 switch (x->ts.type)
902 case BT_INTEGER:
903 digits = gfc_integer_kinds[i].digits;
904 break;
906 case BT_REAL:
907 case BT_COMPLEX:
908 digits = gfc_real_kinds[i].digits;
909 break;
911 default:
912 gcc_unreachable ();
915 return gfc_int_expr (digits);
919 gfc_expr *
920 gfc_simplify_dim (gfc_expr * x, gfc_expr * y)
922 gfc_expr *result;
923 int kind;
925 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
926 return NULL;
928 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
929 result = gfc_constant_result (x->ts.type, kind, &x->where);
931 switch (x->ts.type)
933 case BT_INTEGER:
934 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
935 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
936 else
937 mpz_set_ui (result->value.integer, 0);
939 break;
941 case BT_REAL:
942 if (mpfr_cmp (x->value.real, y->value.real) > 0)
943 mpfr_sub (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
944 else
945 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
947 break;
949 default:
950 gfc_internal_error ("gfc_simplify_dim(): Bad type");
953 return range_check (result, "DIM");
957 gfc_expr *
958 gfc_simplify_dprod (gfc_expr * x, gfc_expr * y)
960 gfc_expr *a1, *a2, *result;
962 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
963 return NULL;
965 result =
966 gfc_constant_result (BT_REAL, gfc_default_double_kind, &x->where);
968 a1 = gfc_real2real (x, gfc_default_double_kind);
969 a2 = gfc_real2real (y, gfc_default_double_kind);
971 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
973 gfc_free_expr (a1);
974 gfc_free_expr (a2);
976 return range_check (result, "DPROD");
980 gfc_expr *
981 gfc_simplify_epsilon (gfc_expr * e)
983 gfc_expr *result;
984 int i;
986 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
988 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
990 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
992 return range_check (result, "EPSILON");
996 gfc_expr *
997 gfc_simplify_exp (gfc_expr * x)
999 gfc_expr *result;
1000 mpfr_t xp, xq;
1002 if (x->expr_type != EXPR_CONSTANT)
1003 return NULL;
1005 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1007 switch (x->ts.type)
1009 case BT_REAL:
1010 mpfr_exp(result->value.real, x->value.real, GFC_RND_MODE);
1011 break;
1013 case BT_COMPLEX:
1014 gfc_set_model_kind (x->ts.kind);
1015 mpfr_init (xp);
1016 mpfr_init (xq);
1017 mpfr_exp (xq, x->value.complex.r, GFC_RND_MODE);
1018 mpfr_cos (xp, x->value.complex.i, GFC_RND_MODE);
1019 mpfr_mul (result->value.complex.r, xq, xp, GFC_RND_MODE);
1020 mpfr_sin (xp, x->value.complex.i, GFC_RND_MODE);
1021 mpfr_mul (result->value.complex.i, xq, xp, GFC_RND_MODE);
1022 mpfr_clear (xp);
1023 mpfr_clear (xq);
1024 break;
1026 default:
1027 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
1030 return range_check (result, "EXP");
1033 /* FIXME: MPFR should be able to do this better */
1034 gfc_expr *
1035 gfc_simplify_exponent (gfc_expr * x)
1037 int i;
1038 mpfr_t tmp;
1039 gfc_expr *result;
1041 if (x->expr_type != EXPR_CONSTANT)
1042 return NULL;
1044 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1045 &x->where);
1047 gfc_set_model (x->value.real);
1049 if (mpfr_sgn (x->value.real) == 0)
1051 mpz_set_ui (result->value.integer, 0);
1052 return result;
1055 mpfr_init (tmp);
1057 mpfr_abs (tmp, x->value.real, GFC_RND_MODE);
1058 mpfr_log2 (tmp, tmp, GFC_RND_MODE);
1060 gfc_mpfr_to_mpz (result->value.integer, tmp);
1062 /* The model number for tiny(x) is b**(emin - 1) where b is the base and emin
1063 is the smallest exponent value. So, we need to add 1 if x is tiny(x). */
1064 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1065 if (mpfr_cmp (x->value.real, gfc_real_kinds[i].tiny) == 0)
1066 mpz_add_ui (result->value.integer,result->value.integer, 1);
1068 mpfr_clear (tmp);
1070 return range_check (result, "EXPONENT");
1074 gfc_expr *
1075 gfc_simplify_float (gfc_expr * a)
1077 gfc_expr *result;
1079 if (a->expr_type != EXPR_CONSTANT)
1080 return NULL;
1082 result = gfc_int2real (a, gfc_default_real_kind);
1083 return range_check (result, "FLOAT");
1087 gfc_expr *
1088 gfc_simplify_floor (gfc_expr * e, gfc_expr * k)
1090 gfc_expr *result;
1091 mpfr_t floor;
1092 int kind;
1094 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
1095 if (kind == -1)
1096 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
1098 if (e->expr_type != EXPR_CONSTANT)
1099 return NULL;
1101 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1103 gfc_set_model_kind (kind);
1104 mpfr_init (floor);
1105 mpfr_floor (floor, e->value.real);
1107 gfc_mpfr_to_mpz (result->value.integer, floor);
1109 mpfr_clear (floor);
1111 return range_check (result, "FLOOR");
1115 gfc_expr *
1116 gfc_simplify_fraction (gfc_expr * x)
1118 gfc_expr *result;
1119 mpfr_t absv, exp, pow2;
1121 if (x->expr_type != EXPR_CONSTANT)
1122 return NULL;
1124 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
1126 gfc_set_model_kind (x->ts.kind);
1128 if (mpfr_sgn (x->value.real) == 0)
1130 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1131 return result;
1134 mpfr_init (exp);
1135 mpfr_init (absv);
1136 mpfr_init (pow2);
1138 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
1139 mpfr_log2 (exp, absv, GFC_RND_MODE);
1141 mpfr_trunc (exp, exp);
1142 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
1144 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
1146 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
1148 mpfr_clear (exp);
1149 mpfr_clear (absv);
1150 mpfr_clear (pow2);
1152 return range_check (result, "FRACTION");
1156 gfc_expr *
1157 gfc_simplify_huge (gfc_expr * e)
1159 gfc_expr *result;
1160 int i;
1162 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1164 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1166 switch (e->ts.type)
1168 case BT_INTEGER:
1169 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
1170 break;
1172 case BT_REAL:
1173 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
1174 break;
1176 default:
1177 gcc_unreachable ();
1180 return result;
1184 gfc_expr *
1185 gfc_simplify_iachar (gfc_expr * e)
1187 gfc_expr *result;
1188 int index;
1190 if (e->expr_type != EXPR_CONSTANT)
1191 return NULL;
1193 if (e->value.character.length != 1)
1195 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
1196 return &gfc_bad_expr;
1199 index = xascii_table[(int) e->value.character.string[0] & 0xFF];
1201 result = gfc_int_expr (index);
1202 result->where = e->where;
1204 return range_check (result, "IACHAR");
1208 gfc_expr *
1209 gfc_simplify_iand (gfc_expr * x, gfc_expr * y)
1211 gfc_expr *result;
1213 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1214 return NULL;
1216 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1218 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1220 return range_check (result, "IAND");
1224 gfc_expr *
1225 gfc_simplify_ibclr (gfc_expr * x, gfc_expr * y)
1227 gfc_expr *result;
1228 int k, pos;
1230 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1231 return NULL;
1233 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1235 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
1236 return &gfc_bad_expr;
1239 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1241 if (pos > gfc_integer_kinds[k].bit_size)
1243 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
1244 &y->where);
1245 return &gfc_bad_expr;
1248 result = gfc_copy_expr (x);
1250 mpz_clrbit (result->value.integer, pos);
1251 return range_check (result, "IBCLR");
1255 gfc_expr *
1256 gfc_simplify_ibits (gfc_expr * x, gfc_expr * y, gfc_expr * z)
1258 gfc_expr *result;
1259 int pos, len;
1260 int i, k, bitsize;
1261 int *bits;
1263 if (x->expr_type != EXPR_CONSTANT
1264 || y->expr_type != EXPR_CONSTANT
1265 || z->expr_type != EXPR_CONSTANT)
1266 return NULL;
1268 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1270 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
1271 return &gfc_bad_expr;
1274 if (gfc_extract_int (z, &len) != NULL || len < 0)
1276 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
1277 return &gfc_bad_expr;
1280 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
1282 bitsize = gfc_integer_kinds[k].bit_size;
1284 if (pos + len > bitsize)
1286 gfc_error
1287 ("Sum of second and third arguments of IBITS exceeds bit size "
1288 "at %L", &y->where);
1289 return &gfc_bad_expr;
1292 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1294 bits = gfc_getmem (bitsize * sizeof (int));
1296 for (i = 0; i < bitsize; i++)
1297 bits[i] = 0;
1299 for (i = 0; i < len; i++)
1300 bits[i] = mpz_tstbit (x->value.integer, i + pos);
1302 for (i = 0; i < bitsize; i++)
1304 if (bits[i] == 0)
1306 mpz_clrbit (result->value.integer, i);
1308 else if (bits[i] == 1)
1310 mpz_setbit (result->value.integer, i);
1312 else
1314 gfc_internal_error ("IBITS: Bad bit");
1318 gfc_free (bits);
1320 return range_check (result, "IBITS");
1324 gfc_expr *
1325 gfc_simplify_ibset (gfc_expr * x, gfc_expr * y)
1327 gfc_expr *result;
1328 int k, pos;
1330 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1331 return NULL;
1333 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1335 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
1336 return &gfc_bad_expr;
1339 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1341 if (pos > gfc_integer_kinds[k].bit_size)
1343 gfc_error ("Second argument of IBSET exceeds bit size at %L",
1344 &y->where);
1345 return &gfc_bad_expr;
1348 result = gfc_copy_expr (x);
1350 mpz_setbit (result->value.integer, pos);
1352 twos_complement (result->value.integer, gfc_integer_kinds[k].bit_size);
1354 return range_check (result, "IBSET");
1358 gfc_expr *
1359 gfc_simplify_ichar (gfc_expr * e)
1361 gfc_expr *result;
1362 int index;
1364 if (e->expr_type != EXPR_CONSTANT)
1365 return NULL;
1367 if (e->value.character.length != 1)
1369 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
1370 return &gfc_bad_expr;
1373 index = (unsigned char) e->value.character.string[0];
1375 if (index < 0 || index > UCHAR_MAX)
1377 gfc_error ("Argument of ICHAR at %L out of range of this processor",
1378 &e->where);
1379 return &gfc_bad_expr;
1382 result = gfc_int_expr (index);
1383 result->where = e->where;
1384 return range_check (result, "ICHAR");
1388 gfc_expr *
1389 gfc_simplify_ieor (gfc_expr * x, gfc_expr * y)
1391 gfc_expr *result;
1393 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1394 return NULL;
1396 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1398 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
1400 return range_check (result, "IEOR");
1404 gfc_expr *
1405 gfc_simplify_index (gfc_expr * x, gfc_expr * y, gfc_expr * b)
1407 gfc_expr *result;
1408 int back, len, lensub;
1409 int i, j, k, count, index = 0, start;
1411 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1412 return NULL;
1414 if (b != NULL && b->value.logical != 0)
1415 back = 1;
1416 else
1417 back = 0;
1419 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1420 &x->where);
1422 len = x->value.character.length;
1423 lensub = y->value.character.length;
1425 if (len < lensub)
1427 mpz_set_si (result->value.integer, 0);
1428 return result;
1431 if (back == 0)
1434 if (lensub == 0)
1436 mpz_set_si (result->value.integer, 1);
1437 return result;
1439 else if (lensub == 1)
1441 for (i = 0; i < len; i++)
1443 for (j = 0; j < lensub; j++)
1445 if (y->value.character.string[j] ==
1446 x->value.character.string[i])
1448 index = i + 1;
1449 goto done;
1454 else
1456 for (i = 0; i < len; i++)
1458 for (j = 0; j < lensub; j++)
1460 if (y->value.character.string[j] ==
1461 x->value.character.string[i])
1463 start = i;
1464 count = 0;
1466 for (k = 0; k < lensub; k++)
1468 if (y->value.character.string[k] ==
1469 x->value.character.string[k + start])
1470 count++;
1473 if (count == lensub)
1475 index = start + 1;
1476 goto done;
1484 else
1487 if (lensub == 0)
1489 mpz_set_si (result->value.integer, len + 1);
1490 return result;
1492 else if (lensub == 1)
1494 for (i = 0; i < len; i++)
1496 for (j = 0; j < lensub; j++)
1498 if (y->value.character.string[j] ==
1499 x->value.character.string[len - i])
1501 index = len - i + 1;
1502 goto done;
1507 else
1509 for (i = 0; i < len; i++)
1511 for (j = 0; j < lensub; j++)
1513 if (y->value.character.string[j] ==
1514 x->value.character.string[len - i])
1516 start = len - i;
1517 if (start <= len - lensub)
1519 count = 0;
1520 for (k = 0; k < lensub; k++)
1521 if (y->value.character.string[k] ==
1522 x->value.character.string[k + start])
1523 count++;
1525 if (count == lensub)
1527 index = start + 1;
1528 goto done;
1531 else
1533 continue;
1541 done:
1542 mpz_set_si (result->value.integer, index);
1543 return range_check (result, "INDEX");
1547 gfc_expr *
1548 gfc_simplify_int (gfc_expr * e, gfc_expr * k)
1550 gfc_expr *rpart, *rtrunc, *result;
1551 int kind;
1553 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
1554 if (kind == -1)
1555 return &gfc_bad_expr;
1557 if (e->expr_type != EXPR_CONSTANT)
1558 return NULL;
1560 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1562 switch (e->ts.type)
1564 case BT_INTEGER:
1565 mpz_set (result->value.integer, e->value.integer);
1566 break;
1568 case BT_REAL:
1569 rtrunc = gfc_copy_expr (e);
1570 mpfr_trunc (rtrunc->value.real, e->value.real);
1571 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1572 gfc_free_expr (rtrunc);
1573 break;
1575 case BT_COMPLEX:
1576 rpart = gfc_complex2real (e, kind);
1577 rtrunc = gfc_copy_expr (rpart);
1578 mpfr_trunc (rtrunc->value.real, rpart->value.real);
1579 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1580 gfc_free_expr (rpart);
1581 gfc_free_expr (rtrunc);
1582 break;
1584 default:
1585 gfc_error ("Argument of INT at %L is not a valid type", &e->where);
1586 gfc_free_expr (result);
1587 return &gfc_bad_expr;
1590 return range_check (result, "INT");
1594 gfc_expr *
1595 gfc_simplify_ifix (gfc_expr * e)
1597 gfc_expr *rtrunc, *result;
1599 if (e->expr_type != EXPR_CONSTANT)
1600 return NULL;
1602 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1603 &e->where);
1605 rtrunc = gfc_copy_expr (e);
1607 mpfr_trunc (rtrunc->value.real, e->value.real);
1608 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1610 gfc_free_expr (rtrunc);
1611 return range_check (result, "IFIX");
1615 gfc_expr *
1616 gfc_simplify_idint (gfc_expr * e)
1618 gfc_expr *rtrunc, *result;
1620 if (e->expr_type != EXPR_CONSTANT)
1621 return NULL;
1623 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1624 &e->where);
1626 rtrunc = gfc_copy_expr (e);
1628 mpfr_trunc (rtrunc->value.real, e->value.real);
1629 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1631 gfc_free_expr (rtrunc);
1632 return range_check (result, "IDINT");
1636 gfc_expr *
1637 gfc_simplify_ior (gfc_expr * x, gfc_expr * y)
1639 gfc_expr *result;
1641 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1642 return NULL;
1644 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1646 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
1647 return range_check (result, "IOR");
1651 gfc_expr *
1652 gfc_simplify_ishft (gfc_expr * e, gfc_expr * s)
1654 gfc_expr *result;
1655 int shift, ashift, isize, k, *bits, i;
1657 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1658 return NULL;
1660 if (gfc_extract_int (s, &shift) != NULL)
1662 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
1663 return &gfc_bad_expr;
1666 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
1668 isize = gfc_integer_kinds[k].bit_size;
1670 if (shift >= 0)
1671 ashift = shift;
1672 else
1673 ashift = -shift;
1675 if (ashift > isize)
1677 gfc_error
1678 ("Magnitude of second argument of ISHFT exceeds bit size at %L",
1679 &s->where);
1680 return &gfc_bad_expr;
1683 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1685 if (shift == 0)
1687 mpz_set (result->value.integer, e->value.integer);
1688 return range_check (result, "ISHFT");
1691 bits = gfc_getmem (isize * sizeof (int));
1693 for (i = 0; i < isize; i++)
1694 bits[i] = mpz_tstbit (e->value.integer, i);
1696 if (shift > 0)
1698 for (i = 0; i < shift; i++)
1699 mpz_clrbit (result->value.integer, i);
1701 for (i = 0; i < isize - shift; i++)
1703 if (bits[i] == 0)
1704 mpz_clrbit (result->value.integer, i + shift);
1705 else
1706 mpz_setbit (result->value.integer, i + shift);
1709 else
1711 for (i = isize - 1; i >= isize - ashift; i--)
1712 mpz_clrbit (result->value.integer, i);
1714 for (i = isize - 1; i >= ashift; i--)
1716 if (bits[i] == 0)
1717 mpz_clrbit (result->value.integer, i - ashift);
1718 else
1719 mpz_setbit (result->value.integer, i - ashift);
1723 twos_complement (result->value.integer, isize);
1725 gfc_free (bits);
1726 return result;
1730 gfc_expr *
1731 gfc_simplify_ishftc (gfc_expr * e, gfc_expr * s, gfc_expr * sz)
1733 gfc_expr *result;
1734 int shift, ashift, isize, delta, k;
1735 int i, *bits;
1737 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1738 return NULL;
1740 if (gfc_extract_int (s, &shift) != NULL)
1742 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
1743 return &gfc_bad_expr;
1746 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1748 if (sz != NULL)
1750 if (gfc_extract_int (sz, &isize) != NULL || isize < 0)
1752 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
1753 return &gfc_bad_expr;
1756 else
1757 isize = gfc_integer_kinds[k].bit_size;
1759 if (shift >= 0)
1760 ashift = shift;
1761 else
1762 ashift = -shift;
1764 if (ashift > isize)
1766 gfc_error
1767 ("Magnitude of second argument of ISHFTC exceeds third argument "
1768 "at %L", &s->where);
1769 return &gfc_bad_expr;
1772 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1774 if (shift == 0)
1776 mpz_set (result->value.integer, e->value.integer);
1777 return result;
1780 bits = gfc_getmem (isize * sizeof (int));
1782 for (i = 0; i < isize; i++)
1783 bits[i] = mpz_tstbit (e->value.integer, i);
1785 delta = isize - ashift;
1787 if (shift > 0)
1789 for (i = 0; i < delta; i++)
1791 if (bits[i] == 0)
1792 mpz_clrbit (result->value.integer, i + shift);
1793 else
1794 mpz_setbit (result->value.integer, i + shift);
1797 for (i = delta; i < isize; i++)
1799 if (bits[i] == 0)
1800 mpz_clrbit (result->value.integer, i - delta);
1801 else
1802 mpz_setbit (result->value.integer, i - delta);
1805 else
1807 for (i = 0; i < ashift; i++)
1809 if (bits[i] == 0)
1810 mpz_clrbit (result->value.integer, i + delta);
1811 else
1812 mpz_setbit (result->value.integer, i + delta);
1815 for (i = ashift; i < isize; i++)
1817 if (bits[i] == 0)
1818 mpz_clrbit (result->value.integer, i + shift);
1819 else
1820 mpz_setbit (result->value.integer, i + shift);
1824 twos_complement (result->value.integer, isize);
1826 gfc_free (bits);
1827 return result;
1831 gfc_expr *
1832 gfc_simplify_kind (gfc_expr * e)
1835 if (e->ts.type == BT_DERIVED)
1837 gfc_error ("Argument of KIND at %L is a DERIVED type", &e->where);
1838 return &gfc_bad_expr;
1841 return gfc_int_expr (e->ts.kind);
1845 static gfc_expr *
1846 simplify_bound (gfc_expr * array, gfc_expr * dim, int upper)
1848 gfc_ref *ref;
1849 gfc_array_spec *as;
1850 gfc_expr *e;
1851 int d;
1853 if (array->expr_type != EXPR_VARIABLE)
1854 return NULL;
1856 if (dim == NULL)
1857 /* TODO: Simplify constant multi-dimensional bounds. */
1858 return NULL;
1860 if (dim->expr_type != EXPR_CONSTANT)
1861 return NULL;
1863 /* Follow any component references. */
1864 as = array->symtree->n.sym->as;
1865 for (ref = array->ref; ref; ref = ref->next)
1867 switch (ref->type)
1869 case REF_ARRAY:
1870 switch (ref->u.ar.type)
1872 case AR_ELEMENT:
1873 as = NULL;
1874 continue;
1876 case AR_FULL:
1877 /* We're done because 'as' has already been set in the
1878 previous iteration. */
1879 goto done;
1881 case AR_SECTION:
1882 case AR_UNKNOWN:
1883 return NULL;
1886 gcc_unreachable ();
1888 case REF_COMPONENT:
1889 as = ref->u.c.component->as;
1890 continue;
1892 case REF_SUBSTRING:
1893 continue;
1897 gcc_unreachable ();
1899 done:
1900 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
1901 return NULL;
1903 d = mpz_get_si (dim->value.integer);
1905 if (d < 1 || d > as->rank
1906 || (d == as->rank && as->type == AS_ASSUMED_SIZE && upper))
1908 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
1909 return &gfc_bad_expr;
1912 e = upper ? as->upper[d-1] : as->lower[d-1];
1914 if (e->expr_type != EXPR_CONSTANT)
1915 return NULL;
1917 return gfc_copy_expr (e);
1921 gfc_expr *
1922 gfc_simplify_lbound (gfc_expr * array, gfc_expr * dim)
1924 return simplify_bound (array, dim, 0);
1928 gfc_expr *
1929 gfc_simplify_len (gfc_expr * e)
1931 gfc_expr *result;
1933 if (e->expr_type != EXPR_CONSTANT)
1934 return NULL;
1936 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1937 &e->where);
1939 mpz_set_si (result->value.integer, e->value.character.length);
1940 return range_check (result, "LEN");
1944 gfc_expr *
1945 gfc_simplify_len_trim (gfc_expr * e)
1947 gfc_expr *result;
1948 int count, len, lentrim, i;
1950 if (e->expr_type != EXPR_CONSTANT)
1951 return NULL;
1953 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1954 &e->where);
1956 len = e->value.character.length;
1958 for (count = 0, i = 1; i <= len; i++)
1959 if (e->value.character.string[len - i] == ' ')
1960 count++;
1961 else
1962 break;
1964 lentrim = len - count;
1966 mpz_set_si (result->value.integer, lentrim);
1967 return range_check (result, "LEN_TRIM");
1971 gfc_expr *
1972 gfc_simplify_lge (gfc_expr * a, gfc_expr * b)
1975 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
1976 return NULL;
1978 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) >= 0,
1979 &a->where);
1983 gfc_expr *
1984 gfc_simplify_lgt (gfc_expr * a, gfc_expr * b)
1987 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
1988 return NULL;
1990 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) > 0,
1991 &a->where);
1995 gfc_expr *
1996 gfc_simplify_lle (gfc_expr * a, gfc_expr * b)
1999 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2000 return NULL;
2002 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) <= 0,
2003 &a->where);
2007 gfc_expr *
2008 gfc_simplify_llt (gfc_expr * a, gfc_expr * b)
2011 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2012 return NULL;
2014 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) < 0,
2015 &a->where);
2019 gfc_expr *
2020 gfc_simplify_log (gfc_expr * x)
2022 gfc_expr *result;
2023 mpfr_t xr, xi;
2025 if (x->expr_type != EXPR_CONSTANT)
2026 return NULL;
2028 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2030 gfc_set_model_kind (x->ts.kind);
2032 switch (x->ts.type)
2034 case BT_REAL:
2035 if (mpfr_sgn (x->value.real) <= 0)
2037 gfc_error
2038 ("Argument of LOG at %L cannot be less than or equal to zero",
2039 &x->where);
2040 gfc_free_expr (result);
2041 return &gfc_bad_expr;
2044 mpfr_log(result->value.real, x->value.real, GFC_RND_MODE);
2045 break;
2047 case BT_COMPLEX:
2048 if ((mpfr_sgn (x->value.complex.r) == 0)
2049 && (mpfr_sgn (x->value.complex.i) == 0))
2051 gfc_error ("Complex argument of LOG at %L cannot be zero",
2052 &x->where);
2053 gfc_free_expr (result);
2054 return &gfc_bad_expr;
2057 mpfr_init (xr);
2058 mpfr_init (xi);
2060 arctangent2 (x->value.complex.i, x->value.complex.r,
2061 result->value.complex.i);
2063 mpfr_mul (xr, x->value.complex.r, x->value.complex.r, GFC_RND_MODE);
2064 mpfr_mul (xi, x->value.complex.i, x->value.complex.i, GFC_RND_MODE);
2065 mpfr_add (xr, xr, xi, GFC_RND_MODE);
2066 mpfr_sqrt (xr, xr, GFC_RND_MODE);
2067 mpfr_log (result->value.complex.r, xr, GFC_RND_MODE);
2069 mpfr_clear (xr);
2070 mpfr_clear (xi);
2072 break;
2074 default:
2075 gfc_internal_error ("gfc_simplify_log: bad type");
2078 return range_check (result, "LOG");
2082 gfc_expr *
2083 gfc_simplify_log10 (gfc_expr * x)
2085 gfc_expr *result;
2087 if (x->expr_type != EXPR_CONSTANT)
2088 return NULL;
2090 gfc_set_model_kind (x->ts.kind);
2092 if (mpfr_sgn (x->value.real) <= 0)
2094 gfc_error
2095 ("Argument of LOG10 at %L cannot be less than or equal to zero",
2096 &x->where);
2097 return &gfc_bad_expr;
2100 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2102 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
2104 return range_check (result, "LOG10");
2108 gfc_expr *
2109 gfc_simplify_logical (gfc_expr * e, gfc_expr * k)
2111 gfc_expr *result;
2112 int kind;
2114 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
2115 if (kind < 0)
2116 return &gfc_bad_expr;
2118 if (e->expr_type != EXPR_CONSTANT)
2119 return NULL;
2121 result = gfc_constant_result (BT_LOGICAL, kind, &e->where);
2123 result->value.logical = e->value.logical;
2125 return result;
2129 /* This function is special since MAX() can take any number of
2130 arguments. The simplified expression is a rewritten version of the
2131 argument list containing at most one constant element. Other
2132 constant elements are deleted. Because the argument list has
2133 already been checked, this function always succeeds. sign is 1 for
2134 MAX(), -1 for MIN(). */
2136 static gfc_expr *
2137 simplify_min_max (gfc_expr * expr, int sign)
2139 gfc_actual_arglist *arg, *last, *extremum;
2140 gfc_intrinsic_sym * specific;
2142 last = NULL;
2143 extremum = NULL;
2144 specific = expr->value.function.isym;
2146 arg = expr->value.function.actual;
2148 for (; arg; last = arg, arg = arg->next)
2150 if (arg->expr->expr_type != EXPR_CONSTANT)
2151 continue;
2153 if (extremum == NULL)
2155 extremum = arg;
2156 continue;
2159 switch (arg->expr->ts.type)
2161 case BT_INTEGER:
2162 if (mpz_cmp (arg->expr->value.integer,
2163 extremum->expr->value.integer) * sign > 0)
2164 mpz_set (extremum->expr->value.integer, arg->expr->value.integer);
2166 break;
2168 case BT_REAL:
2169 if (mpfr_cmp (arg->expr->value.real, extremum->expr->value.real) *
2170 sign > 0)
2171 mpfr_set (extremum->expr->value.real, arg->expr->value.real,
2172 GFC_RND_MODE);
2174 break;
2176 default:
2177 gfc_internal_error ("gfc_simplify_max(): Bad type in arglist");
2180 /* Delete the extra constant argument. */
2181 if (last == NULL)
2182 expr->value.function.actual = arg->next;
2183 else
2184 last->next = arg->next;
2186 arg->next = NULL;
2187 gfc_free_actual_arglist (arg);
2188 arg = last;
2191 /* If there is one value left, replace the function call with the
2192 expression. */
2193 if (expr->value.function.actual->next != NULL)
2194 return NULL;
2196 /* Convert to the correct type and kind. */
2197 if (expr->ts.type != BT_UNKNOWN)
2198 return gfc_convert_constant (expr->value.function.actual->expr,
2199 expr->ts.type, expr->ts.kind);
2201 if (specific->ts.type != BT_UNKNOWN)
2202 return gfc_convert_constant (expr->value.function.actual->expr,
2203 specific->ts.type, specific->ts.kind);
2205 return gfc_copy_expr (expr->value.function.actual->expr);
2209 gfc_expr *
2210 gfc_simplify_min (gfc_expr * e)
2212 return simplify_min_max (e, -1);
2216 gfc_expr *
2217 gfc_simplify_max (gfc_expr * e)
2219 return simplify_min_max (e, 1);
2223 gfc_expr *
2224 gfc_simplify_maxexponent (gfc_expr * x)
2226 gfc_expr *result;
2227 int i;
2229 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2231 result = gfc_int_expr (gfc_real_kinds[i].max_exponent);
2232 result->where = x->where;
2234 return result;
2238 gfc_expr *
2239 gfc_simplify_minexponent (gfc_expr * x)
2241 gfc_expr *result;
2242 int i;
2244 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2246 result = gfc_int_expr (gfc_real_kinds[i].min_exponent);
2247 result->where = x->where;
2249 return result;
2253 gfc_expr *
2254 gfc_simplify_mod (gfc_expr * a, gfc_expr * p)
2256 gfc_expr *result;
2257 mpfr_t quot, iquot, term;
2258 int kind;
2260 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2261 return NULL;
2263 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2264 result = gfc_constant_result (a->ts.type, kind, &a->where);
2266 switch (a->ts.type)
2268 case BT_INTEGER:
2269 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2271 /* Result is processor-dependent. */
2272 gfc_error ("Second argument MOD at %L is zero", &a->where);
2273 gfc_free_expr (result);
2274 return &gfc_bad_expr;
2276 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
2277 break;
2279 case BT_REAL:
2280 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2282 /* Result is processor-dependent. */
2283 gfc_error ("Second argument of MOD at %L is zero", &p->where);
2284 gfc_free_expr (result);
2285 return &gfc_bad_expr;
2288 gfc_set_model_kind (kind);
2289 mpfr_init (quot);
2290 mpfr_init (iquot);
2291 mpfr_init (term);
2293 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2294 mpfr_trunc (iquot, quot);
2295 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2296 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2298 mpfr_clear (quot);
2299 mpfr_clear (iquot);
2300 mpfr_clear (term);
2301 break;
2303 default:
2304 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
2307 return range_check (result, "MOD");
2311 gfc_expr *
2312 gfc_simplify_modulo (gfc_expr * a, gfc_expr * p)
2314 gfc_expr *result;
2315 mpfr_t quot, iquot, term;
2316 int kind;
2318 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2319 return NULL;
2321 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2322 result = gfc_constant_result (a->ts.type, kind, &a->where);
2324 switch (a->ts.type)
2326 case BT_INTEGER:
2327 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2329 /* Result is processor-dependent. This processor just opts
2330 to not handle it at all. */
2331 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
2332 gfc_free_expr (result);
2333 return &gfc_bad_expr;
2335 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
2337 break;
2339 case BT_REAL:
2340 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2342 /* Result is processor-dependent. */
2343 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
2344 gfc_free_expr (result);
2345 return &gfc_bad_expr;
2348 gfc_set_model_kind (kind);
2349 mpfr_init (quot);
2350 mpfr_init (iquot);
2351 mpfr_init (term);
2353 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2354 mpfr_floor (iquot, quot);
2355 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2356 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2358 mpfr_clear (quot);
2359 mpfr_clear (iquot);
2360 mpfr_clear (term);
2361 break;
2363 default:
2364 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
2367 return range_check (result, "MODULO");
2371 /* Exists for the sole purpose of consistency with other intrinsics. */
2372 gfc_expr *
2373 gfc_simplify_mvbits (gfc_expr * f ATTRIBUTE_UNUSED,
2374 gfc_expr * fp ATTRIBUTE_UNUSED,
2375 gfc_expr * l ATTRIBUTE_UNUSED,
2376 gfc_expr * to ATTRIBUTE_UNUSED,
2377 gfc_expr * tp ATTRIBUTE_UNUSED)
2379 return NULL;
2383 gfc_expr *
2384 gfc_simplify_nearest (gfc_expr * x, gfc_expr * s)
2386 gfc_expr *result;
2387 mpfr_t tmp;
2388 int direction, sgn;
2390 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2391 return NULL;
2393 gfc_set_model_kind (x->ts.kind);
2394 result = gfc_copy_expr (x);
2396 direction = mpfr_sgn (s->value.real);
2398 if (direction == 0)
2400 gfc_error ("Second argument of NEAREST at %L may not be zero",
2401 &s->where);
2402 gfc_free (result);
2403 return &gfc_bad_expr;
2406 /* TODO: Use mpfr_nextabove and mpfr_nextbelow once we move to a
2407 newer version of mpfr. */
2409 sgn = mpfr_sgn (x->value.real);
2411 if (sgn == 0)
2413 int k = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
2415 if (direction > 0)
2416 mpfr_add (result->value.real,
2417 x->value.real, gfc_real_kinds[k].subnormal, GFC_RND_MODE);
2418 else
2419 mpfr_sub (result->value.real,
2420 x->value.real, gfc_real_kinds[k].subnormal, GFC_RND_MODE);
2422 else
2424 if (sgn < 0)
2426 direction = -direction;
2427 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
2430 if (direction > 0)
2431 mpfr_add_one_ulp (result->value.real, GFC_RND_MODE);
2432 else
2434 /* In this case the exponent can shrink, which makes us skip
2435 over one number because we subtract one ulp with the
2436 larger exponent. Thus we need to compensate for this. */
2437 mpfr_init_set (tmp, result->value.real, GFC_RND_MODE);
2439 mpfr_sub_one_ulp (result->value.real, GFC_RND_MODE);
2440 mpfr_add_one_ulp (result->value.real, GFC_RND_MODE);
2442 /* If we're back to where we started, the spacing is one
2443 ulp, and we get the correct result by subtracting. */
2444 if (mpfr_cmp (tmp, result->value.real) == 0)
2445 mpfr_sub_one_ulp (result->value.real, GFC_RND_MODE);
2447 mpfr_clear (tmp);
2450 if (sgn < 0)
2451 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
2454 return range_check (result, "NEAREST");
2458 static gfc_expr *
2459 simplify_nint (const char *name, gfc_expr * e, gfc_expr * k)
2461 gfc_expr *itrunc, *result;
2462 int kind;
2464 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
2465 if (kind == -1)
2466 return &gfc_bad_expr;
2468 if (e->expr_type != EXPR_CONSTANT)
2469 return NULL;
2471 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
2473 itrunc = gfc_copy_expr (e);
2475 mpfr_round(itrunc->value.real, e->value.real);
2477 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real);
2479 gfc_free_expr (itrunc);
2481 return range_check (result, name);
2485 gfc_expr *
2486 gfc_simplify_nint (gfc_expr * e, gfc_expr * k)
2488 return simplify_nint ("NINT", e, k);
2492 gfc_expr *
2493 gfc_simplify_idnint (gfc_expr * e)
2495 return simplify_nint ("IDNINT", e, NULL);
2499 gfc_expr *
2500 gfc_simplify_not (gfc_expr * e)
2502 gfc_expr *result;
2503 int i;
2505 if (e->expr_type != EXPR_CONSTANT)
2506 return NULL;
2508 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2510 mpz_com (result->value.integer, e->value.integer);
2512 /* Because of how GMP handles numbers, the result must be ANDed with
2513 the max_int mask. For radices <> 2, this will require change. */
2515 i = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2517 mpz_and (result->value.integer, result->value.integer,
2518 gfc_integer_kinds[i].max_int);
2520 twos_complement (result->value.integer, gfc_integer_kinds[i].bit_size);
2522 return range_check (result, "NOT");
2526 gfc_expr *
2527 gfc_simplify_null (gfc_expr * mold)
2529 gfc_expr *result;
2531 result = gfc_get_expr ();
2532 result->expr_type = EXPR_NULL;
2534 if (mold == NULL)
2535 result->ts.type = BT_UNKNOWN;
2536 else
2538 result->ts = mold->ts;
2539 result->where = mold->where;
2542 return result;
2546 gfc_expr *
2547 gfc_simplify_or (gfc_expr * x, gfc_expr * y)
2549 gfc_expr *result;
2550 int kind;
2552 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2553 return NULL;
2555 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
2556 if (x->ts.type == BT_INTEGER)
2558 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
2559 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2561 else /* BT_LOGICAL */
2563 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
2564 result->value.logical = x->value.logical || y->value.logical;
2567 return range_check (result, "OR");
2571 gfc_expr *
2572 gfc_simplify_precision (gfc_expr * e)
2574 gfc_expr *result;
2575 int i;
2577 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2579 result = gfc_int_expr (gfc_real_kinds[i].precision);
2580 result->where = e->where;
2582 return result;
2586 gfc_expr *
2587 gfc_simplify_radix (gfc_expr * e)
2589 gfc_expr *result;
2590 int i;
2592 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2593 switch (e->ts.type)
2595 case BT_INTEGER:
2596 i = gfc_integer_kinds[i].radix;
2597 break;
2599 case BT_REAL:
2600 i = gfc_real_kinds[i].radix;
2601 break;
2603 default:
2604 gcc_unreachable ();
2607 result = gfc_int_expr (i);
2608 result->where = e->where;
2610 return result;
2614 gfc_expr *
2615 gfc_simplify_range (gfc_expr * e)
2617 gfc_expr *result;
2618 int i;
2619 long j;
2621 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2623 switch (e->ts.type)
2625 case BT_INTEGER:
2626 j = gfc_integer_kinds[i].range;
2627 break;
2629 case BT_REAL:
2630 case BT_COMPLEX:
2631 j = gfc_real_kinds[i].range;
2632 break;
2634 default:
2635 gcc_unreachable ();
2638 result = gfc_int_expr (j);
2639 result->where = e->where;
2641 return result;
2645 gfc_expr *
2646 gfc_simplify_real (gfc_expr * e, gfc_expr * k)
2648 gfc_expr *result;
2649 int kind;
2651 if (e->ts.type == BT_COMPLEX)
2652 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
2653 else
2654 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
2656 if (kind == -1)
2657 return &gfc_bad_expr;
2659 if (e->expr_type != EXPR_CONSTANT)
2660 return NULL;
2662 switch (e->ts.type)
2664 case BT_INTEGER:
2665 result = gfc_int2real (e, kind);
2666 break;
2668 case BT_REAL:
2669 result = gfc_real2real (e, kind);
2670 break;
2672 case BT_COMPLEX:
2673 result = gfc_complex2real (e, kind);
2674 break;
2676 default:
2677 gfc_internal_error ("bad type in REAL");
2678 /* Not reached */
2681 return range_check (result, "REAL");
2685 gfc_expr *
2686 gfc_simplify_realpart (gfc_expr * e)
2688 gfc_expr *result;
2690 if (e->expr_type != EXPR_CONSTANT)
2691 return NULL;
2693 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
2694 mpfr_set (result->value.real, e->value.complex.r, GFC_RND_MODE);
2696 return range_check (result, "REALPART");
2699 gfc_expr *
2700 gfc_simplify_repeat (gfc_expr * e, gfc_expr * n)
2702 gfc_expr *result;
2703 int i, j, len, ncopies, nlen;
2705 if (e->expr_type != EXPR_CONSTANT || n->expr_type != EXPR_CONSTANT)
2706 return NULL;
2708 if (n != NULL && (gfc_extract_int (n, &ncopies) != NULL || ncopies < 0))
2710 gfc_error ("Invalid second argument of REPEAT at %L", &n->where);
2711 return &gfc_bad_expr;
2714 len = e->value.character.length;
2715 nlen = ncopies * len;
2717 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
2719 if (ncopies == 0)
2721 result->value.character.string = gfc_getmem (1);
2722 result->value.character.length = 0;
2723 result->value.character.string[0] = '\0';
2724 return result;
2727 result->value.character.length = nlen;
2728 result->value.character.string = gfc_getmem (nlen + 1);
2730 for (i = 0; i < ncopies; i++)
2731 for (j = 0; j < len; j++)
2732 result->value.character.string[j + i * len] =
2733 e->value.character.string[j];
2735 result->value.character.string[nlen] = '\0'; /* For debugger */
2736 return result;
2740 /* This one is a bear, but mainly has to do with shuffling elements. */
2742 gfc_expr *
2743 gfc_simplify_reshape (gfc_expr * source, gfc_expr * shape_exp,
2744 gfc_expr * pad, gfc_expr * order_exp)
2747 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
2748 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
2749 gfc_constructor *head, *tail;
2750 mpz_t index, size;
2751 unsigned long j;
2752 size_t nsource;
2753 gfc_expr *e;
2755 /* Unpack the shape array. */
2756 if (source->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (source))
2757 return NULL;
2759 if (shape_exp->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (shape_exp))
2760 return NULL;
2762 if (pad != NULL
2763 && (pad->expr_type != EXPR_ARRAY
2764 || !gfc_is_constant_expr (pad)))
2765 return NULL;
2767 if (order_exp != NULL
2768 && (order_exp->expr_type != EXPR_ARRAY
2769 || !gfc_is_constant_expr (order_exp)))
2770 return NULL;
2772 mpz_init (index);
2773 rank = 0;
2774 head = tail = NULL;
2776 for (;;)
2778 e = gfc_get_array_element (shape_exp, rank);
2779 if (e == NULL)
2780 break;
2782 if (gfc_extract_int (e, &shape[rank]) != NULL)
2784 gfc_error ("Integer too large in shape specification at %L",
2785 &e->where);
2786 gfc_free_expr (e);
2787 goto bad_reshape;
2790 gfc_free_expr (e);
2792 if (rank >= GFC_MAX_DIMENSIONS)
2794 gfc_error ("Too many dimensions in shape specification for RESHAPE "
2795 "at %L", &e->where);
2797 goto bad_reshape;
2800 if (shape[rank] < 0)
2802 gfc_error ("Shape specification at %L cannot be negative",
2803 &e->where);
2804 goto bad_reshape;
2807 rank++;
2810 if (rank == 0)
2812 gfc_error ("Shape specification at %L cannot be the null array",
2813 &shape_exp->where);
2814 goto bad_reshape;
2817 /* Now unpack the order array if present. */
2818 if (order_exp == NULL)
2820 for (i = 0; i < rank; i++)
2821 order[i] = i;
2824 else
2827 for (i = 0; i < rank; i++)
2828 x[i] = 0;
2830 for (i = 0; i < rank; i++)
2832 e = gfc_get_array_element (order_exp, i);
2833 if (e == NULL)
2835 gfc_error
2836 ("ORDER parameter of RESHAPE at %L is not the same size "
2837 "as SHAPE parameter", &order_exp->where);
2838 goto bad_reshape;
2841 if (gfc_extract_int (e, &order[i]) != NULL)
2843 gfc_error ("Error in ORDER parameter of RESHAPE at %L",
2844 &e->where);
2845 gfc_free_expr (e);
2846 goto bad_reshape;
2849 gfc_free_expr (e);
2851 if (order[i] < 1 || order[i] > rank)
2853 gfc_error ("ORDER parameter of RESHAPE at %L is out of range",
2854 &e->where);
2855 goto bad_reshape;
2858 order[i]--;
2860 if (x[order[i]])
2862 gfc_error ("Invalid permutation in ORDER parameter at %L",
2863 &e->where);
2864 goto bad_reshape;
2867 x[order[i]] = 1;
2871 /* Count the elements in the source and padding arrays. */
2873 npad = 0;
2874 if (pad != NULL)
2876 gfc_array_size (pad, &size);
2877 npad = mpz_get_ui (size);
2878 mpz_clear (size);
2881 gfc_array_size (source, &size);
2882 nsource = mpz_get_ui (size);
2883 mpz_clear (size);
2885 /* If it weren't for that pesky permutation we could just loop
2886 through the source and round out any shortage with pad elements.
2887 But no, someone just had to have the compiler do something the
2888 user should be doing. */
2890 for (i = 0; i < rank; i++)
2891 x[i] = 0;
2893 for (;;)
2895 /* Figure out which element to extract. */
2896 mpz_set_ui (index, 0);
2898 for (i = rank - 1; i >= 0; i--)
2900 mpz_add_ui (index, index, x[order[i]]);
2901 if (i != 0)
2902 mpz_mul_ui (index, index, shape[order[i - 1]]);
2905 if (mpz_cmp_ui (index, INT_MAX) > 0)
2906 gfc_internal_error ("Reshaped array too large at %L", &e->where);
2908 j = mpz_get_ui (index);
2910 if (j < nsource)
2911 e = gfc_get_array_element (source, j);
2912 else
2914 j = j - nsource;
2916 if (npad == 0)
2918 gfc_error
2919 ("PAD parameter required for short SOURCE parameter at %L",
2920 &source->where);
2921 goto bad_reshape;
2924 j = j % npad;
2925 e = gfc_get_array_element (pad, j);
2928 if (head == NULL)
2929 head = tail = gfc_get_constructor ();
2930 else
2932 tail->next = gfc_get_constructor ();
2933 tail = tail->next;
2936 if (e == NULL)
2937 goto bad_reshape;
2939 tail->where = e->where;
2940 tail->expr = e;
2942 /* Calculate the next element. */
2943 i = 0;
2945 inc:
2946 if (++x[i] < shape[i])
2947 continue;
2948 x[i++] = 0;
2949 if (i < rank)
2950 goto inc;
2952 break;
2955 mpz_clear (index);
2957 e = gfc_get_expr ();
2958 e->where = source->where;
2959 e->expr_type = EXPR_ARRAY;
2960 e->value.constructor = head;
2961 e->shape = gfc_get_shape (rank);
2963 for (i = 0; i < rank; i++)
2964 mpz_init_set_ui (e->shape[i], shape[i]);
2966 e->ts = source->ts;
2967 e->rank = rank;
2969 return e;
2971 bad_reshape:
2972 gfc_free_constructor (head);
2973 mpz_clear (index);
2974 return &gfc_bad_expr;
2978 gfc_expr *
2979 gfc_simplify_rrspacing (gfc_expr * x)
2981 gfc_expr *result;
2982 mpfr_t absv, log2, exp, frac, pow2;
2983 int i, p;
2985 if (x->expr_type != EXPR_CONSTANT)
2986 return NULL;
2988 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2990 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
2992 p = gfc_real_kinds[i].digits;
2994 gfc_set_model_kind (x->ts.kind);
2996 if (mpfr_sgn (x->value.real) == 0)
2998 mpfr_ui_div (result->value.real, 1, gfc_real_kinds[i].tiny, GFC_RND_MODE);
2999 return result;
3002 mpfr_init (log2);
3003 mpfr_init (absv);
3004 mpfr_init (frac);
3005 mpfr_init (pow2);
3007 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3008 mpfr_log2 (log2, absv, GFC_RND_MODE);
3010 mpfr_trunc (log2, log2);
3011 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3013 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3014 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3016 mpfr_mul_2exp (result->value.real, frac, (unsigned long)p, GFC_RND_MODE);
3018 mpfr_clear (log2);
3019 mpfr_clear (absv);
3020 mpfr_clear (frac);
3021 mpfr_clear (pow2);
3023 return range_check (result, "RRSPACING");
3027 gfc_expr *
3028 gfc_simplify_scale (gfc_expr * x, gfc_expr * i)
3030 int k, neg_flag, power, exp_range;
3031 mpfr_t scale, radix;
3032 gfc_expr *result;
3034 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3035 return NULL;
3037 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3039 if (mpfr_sgn (x->value.real) == 0)
3041 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3042 return result;
3045 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3047 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
3049 /* This check filters out values of i that would overflow an int. */
3050 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
3051 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
3053 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
3054 return &gfc_bad_expr;
3057 /* Compute scale = radix ** power. */
3058 power = mpz_get_si (i->value.integer);
3060 if (power >= 0)
3061 neg_flag = 0;
3062 else
3064 neg_flag = 1;
3065 power = -power;
3068 gfc_set_model_kind (x->ts.kind);
3069 mpfr_init (scale);
3070 mpfr_init (radix);
3071 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
3072 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
3074 if (neg_flag)
3075 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
3076 else
3077 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
3079 mpfr_clear (scale);
3080 mpfr_clear (radix);
3082 return range_check (result, "SCALE");
3086 gfc_expr *
3087 gfc_simplify_scan (gfc_expr * e, gfc_expr * c, gfc_expr * b)
3089 gfc_expr *result;
3090 int back;
3091 size_t i;
3092 size_t indx, len, lenc;
3094 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
3095 return NULL;
3097 if (b != NULL && b->value.logical != 0)
3098 back = 1;
3099 else
3100 back = 0;
3102 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3103 &e->where);
3105 len = e->value.character.length;
3106 lenc = c->value.character.length;
3108 if (len == 0 || lenc == 0)
3110 indx = 0;
3112 else
3114 if (back == 0)
3116 indx =
3117 strcspn (e->value.character.string, c->value.character.string) + 1;
3118 if (indx > len)
3119 indx = 0;
3121 else
3123 i = 0;
3124 for (indx = len; indx > 0; indx--)
3126 for (i = 0; i < lenc; i++)
3128 if (c->value.character.string[i]
3129 == e->value.character.string[indx - 1])
3130 break;
3132 if (i < lenc)
3133 break;
3137 mpz_set_ui (result->value.integer, indx);
3138 return range_check (result, "SCAN");
3142 gfc_expr *
3143 gfc_simplify_selected_int_kind (gfc_expr * e)
3145 int i, kind, range;
3146 gfc_expr *result;
3148 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
3149 return NULL;
3151 kind = INT_MAX;
3153 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3154 if (gfc_integer_kinds[i].range >= range
3155 && gfc_integer_kinds[i].kind < kind)
3156 kind = gfc_integer_kinds[i].kind;
3158 if (kind == INT_MAX)
3159 kind = -1;
3161 result = gfc_int_expr (kind);
3162 result->where = e->where;
3164 return result;
3168 gfc_expr *
3169 gfc_simplify_selected_real_kind (gfc_expr * p, gfc_expr * q)
3171 int range, precision, i, kind, found_precision, found_range;
3172 gfc_expr *result;
3174 if (p == NULL)
3175 precision = 0;
3176 else
3178 if (p->expr_type != EXPR_CONSTANT
3179 || gfc_extract_int (p, &precision) != NULL)
3180 return NULL;
3183 if (q == NULL)
3184 range = 0;
3185 else
3187 if (q->expr_type != EXPR_CONSTANT
3188 || gfc_extract_int (q, &range) != NULL)
3189 return NULL;
3192 kind = INT_MAX;
3193 found_precision = 0;
3194 found_range = 0;
3196 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3198 if (gfc_real_kinds[i].precision >= precision)
3199 found_precision = 1;
3201 if (gfc_real_kinds[i].range >= range)
3202 found_range = 1;
3204 if (gfc_real_kinds[i].precision >= precision
3205 && gfc_real_kinds[i].range >= range && gfc_real_kinds[i].kind < kind)
3206 kind = gfc_real_kinds[i].kind;
3209 if (kind == INT_MAX)
3211 kind = 0;
3213 if (!found_precision)
3214 kind = -1;
3215 if (!found_range)
3216 kind -= 2;
3219 result = gfc_int_expr (kind);
3220 result->where = (p != NULL) ? p->where : q->where;
3222 return result;
3226 gfc_expr *
3227 gfc_simplify_set_exponent (gfc_expr * x, gfc_expr * i)
3229 gfc_expr *result;
3230 mpfr_t exp, absv, log2, pow2, frac;
3231 unsigned long exp2;
3233 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3234 return NULL;
3236 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3238 gfc_set_model_kind (x->ts.kind);
3240 if (mpfr_sgn (x->value.real) == 0)
3242 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3243 return result;
3246 mpfr_init (absv);
3247 mpfr_init (log2);
3248 mpfr_init (exp);
3249 mpfr_init (pow2);
3250 mpfr_init (frac);
3252 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3253 mpfr_log2 (log2, absv, GFC_RND_MODE);
3255 mpfr_trunc (log2, log2);
3256 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3258 /* Old exponent value, and fraction. */
3259 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3261 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3263 /* New exponent. */
3264 exp2 = (unsigned long) mpz_get_d (i->value.integer);
3265 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
3267 mpfr_clear (absv);
3268 mpfr_clear (log2);
3269 mpfr_clear (pow2);
3270 mpfr_clear (frac);
3272 return range_check (result, "SET_EXPONENT");
3276 gfc_expr *
3277 gfc_simplify_shape (gfc_expr * source)
3279 mpz_t shape[GFC_MAX_DIMENSIONS];
3280 gfc_expr *result, *e, *f;
3281 gfc_array_ref *ar;
3282 int n;
3283 try t;
3285 if (source->rank == 0 || source->expr_type != EXPR_VARIABLE)
3286 return NULL;
3288 result = gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3289 &source->where);
3291 ar = gfc_find_array_ref (source);
3293 t = gfc_array_ref_shape (ar, shape);
3295 for (n = 0; n < source->rank; n++)
3297 e = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3298 &source->where);
3300 if (t == SUCCESS)
3302 mpz_set (e->value.integer, shape[n]);
3303 mpz_clear (shape[n]);
3305 else
3307 mpz_set_ui (e->value.integer, n + 1);
3309 f = gfc_simplify_size (source, e);
3310 gfc_free_expr (e);
3311 if (f == NULL)
3313 gfc_free_expr (result);
3314 return NULL;
3316 else
3318 e = f;
3322 gfc_append_constructor (result, e);
3325 return result;
3329 gfc_expr *
3330 gfc_simplify_size (gfc_expr * array, gfc_expr * dim)
3332 mpz_t size;
3333 gfc_expr *result;
3334 int d;
3336 if (dim == NULL)
3338 if (gfc_array_size (array, &size) == FAILURE)
3339 return NULL;
3341 else
3343 if (dim->expr_type != EXPR_CONSTANT)
3344 return NULL;
3346 d = mpz_get_ui (dim->value.integer) - 1;
3347 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
3348 return NULL;
3351 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3352 &array->where);
3354 mpz_set (result->value.integer, size);
3356 return result;
3360 gfc_expr *
3361 gfc_simplify_sign (gfc_expr * x, gfc_expr * y)
3363 gfc_expr *result;
3365 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3366 return NULL;
3368 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3370 switch (x->ts.type)
3372 case BT_INTEGER:
3373 mpz_abs (result->value.integer, x->value.integer);
3374 if (mpz_sgn (y->value.integer) < 0)
3375 mpz_neg (result->value.integer, result->value.integer);
3377 break;
3379 case BT_REAL:
3380 /* TODO: Handle -0.0 and +0.0 correctly on machines that support
3381 it. */
3382 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3383 if (mpfr_sgn (y->value.real) < 0)
3384 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
3386 break;
3388 default:
3389 gfc_internal_error ("Bad type in gfc_simplify_sign");
3392 return result;
3396 gfc_expr *
3397 gfc_simplify_sin (gfc_expr * x)
3399 gfc_expr *result;
3400 mpfr_t xp, xq;
3402 if (x->expr_type != EXPR_CONSTANT)
3403 return NULL;
3405 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3407 switch (x->ts.type)
3409 case BT_REAL:
3410 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
3411 break;
3413 case BT_COMPLEX:
3414 gfc_set_model (x->value.real);
3415 mpfr_init (xp);
3416 mpfr_init (xq);
3418 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
3419 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
3420 mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
3422 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
3423 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
3424 mpfr_mul (result->value.complex.i, xp, xq, GFC_RND_MODE);
3426 mpfr_clear (xp);
3427 mpfr_clear (xq);
3428 break;
3430 default:
3431 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
3434 return range_check (result, "SIN");
3438 gfc_expr *
3439 gfc_simplify_sinh (gfc_expr * x)
3441 gfc_expr *result;
3443 if (x->expr_type != EXPR_CONSTANT)
3444 return NULL;
3446 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3448 mpfr_sinh(result->value.real, x->value.real, GFC_RND_MODE);
3450 return range_check (result, "SINH");
3454 /* The argument is always a double precision real that is converted to
3455 single precision. TODO: Rounding! */
3457 gfc_expr *
3458 gfc_simplify_sngl (gfc_expr * a)
3460 gfc_expr *result;
3462 if (a->expr_type != EXPR_CONSTANT)
3463 return NULL;
3465 result = gfc_real2real (a, gfc_default_real_kind);
3466 return range_check (result, "SNGL");
3470 gfc_expr *
3471 gfc_simplify_spacing (gfc_expr * x)
3473 gfc_expr *result;
3474 mpfr_t absv, log2;
3475 long diff;
3476 int i, p;
3478 if (x->expr_type != EXPR_CONSTANT)
3479 return NULL;
3481 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3483 p = gfc_real_kinds[i].digits;
3485 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3487 gfc_set_model_kind (x->ts.kind);
3489 if (mpfr_sgn (x->value.real) == 0)
3491 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3492 return result;
3495 mpfr_init (log2);
3496 mpfr_init (absv);
3498 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3499 mpfr_log2 (log2, absv, GFC_RND_MODE);
3500 mpfr_trunc (log2, log2);
3502 mpfr_add_ui (log2, log2, 1, GFC_RND_MODE);
3504 /* FIXME: We should be using mpfr_get_si here, but this function is
3505 not available with the version of mpfr distributed with gmp (as of
3506 2004-09-17). Replace once mpfr has been imported into the gcc cvs
3507 tree. */
3508 diff = (long)mpfr_get_d (log2, GFC_RND_MODE) - (long)p;
3509 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
3510 mpfr_mul_2si (result->value.real, result->value.real, diff, GFC_RND_MODE);
3512 mpfr_clear (log2);
3513 mpfr_clear (absv);
3515 if (mpfr_cmp (result->value.real, gfc_real_kinds[i].tiny) < 0)
3516 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3518 return range_check (result, "SPACING");
3522 gfc_expr *
3523 gfc_simplify_sqrt (gfc_expr * e)
3525 gfc_expr *result;
3526 mpfr_t ac, ad, s, t, w;
3528 if (e->expr_type != EXPR_CONSTANT)
3529 return NULL;
3531 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
3533 switch (e->ts.type)
3535 case BT_REAL:
3536 if (mpfr_cmp_si (e->value.real, 0) < 0)
3537 goto negative_arg;
3538 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
3540 break;
3542 case BT_COMPLEX:
3543 /* Formula taken from Numerical Recipes to avoid over- and
3544 underflow. */
3546 gfc_set_model (e->value.real);
3547 mpfr_init (ac);
3548 mpfr_init (ad);
3549 mpfr_init (s);
3550 mpfr_init (t);
3551 mpfr_init (w);
3553 if (mpfr_cmp_ui (e->value.complex.r, 0) == 0
3554 && mpfr_cmp_ui (e->value.complex.i, 0) == 0)
3557 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
3558 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
3559 break;
3562 mpfr_abs (ac, e->value.complex.r, GFC_RND_MODE);
3563 mpfr_abs (ad, e->value.complex.i, GFC_RND_MODE);
3565 if (mpfr_cmp (ac, ad) >= 0)
3567 mpfr_div (t, e->value.complex.i, e->value.complex.r, GFC_RND_MODE);
3568 mpfr_mul (t, t, t, GFC_RND_MODE);
3569 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3570 mpfr_sqrt (t, t, GFC_RND_MODE);
3571 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3572 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3573 mpfr_sqrt (t, t, GFC_RND_MODE);
3574 mpfr_sqrt (s, ac, GFC_RND_MODE);
3575 mpfr_mul (w, s, t, GFC_RND_MODE);
3577 else
3579 mpfr_div (s, e->value.complex.r, e->value.complex.i, GFC_RND_MODE);
3580 mpfr_mul (t, s, s, GFC_RND_MODE);
3581 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3582 mpfr_sqrt (t, t, GFC_RND_MODE);
3583 mpfr_abs (s, s, GFC_RND_MODE);
3584 mpfr_add (t, t, s, GFC_RND_MODE);
3585 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3586 mpfr_sqrt (t, t, GFC_RND_MODE);
3587 mpfr_sqrt (s, ad, GFC_RND_MODE);
3588 mpfr_mul (w, s, t, GFC_RND_MODE);
3591 if (mpfr_cmp_ui (w, 0) != 0 && mpfr_cmp_ui (e->value.complex.r, 0) >= 0)
3593 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3594 mpfr_div (result->value.complex.i, e->value.complex.i, t, GFC_RND_MODE);
3595 mpfr_set (result->value.complex.r, w, GFC_RND_MODE);
3597 else if (mpfr_cmp_ui (w, 0) != 0
3598 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3599 && mpfr_cmp_ui (e->value.complex.i, 0) >= 0)
3601 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3602 mpfr_div (result->value.complex.r, e->value.complex.i, t, GFC_RND_MODE);
3603 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3605 else if (mpfr_cmp_ui (w, 0) != 0
3606 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3607 && mpfr_cmp_ui (e->value.complex.i, 0) < 0)
3609 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3610 mpfr_div (result->value.complex.r, ad, t, GFC_RND_MODE);
3611 mpfr_neg (w, w, GFC_RND_MODE);
3612 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3614 else
3615 gfc_internal_error ("invalid complex argument of SQRT at %L",
3616 &e->where);
3618 mpfr_clear (s);
3619 mpfr_clear (t);
3620 mpfr_clear (ac);
3621 mpfr_clear (ad);
3622 mpfr_clear (w);
3624 break;
3626 default:
3627 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
3630 return range_check (result, "SQRT");
3632 negative_arg:
3633 gfc_free_expr (result);
3634 gfc_error ("Argument of SQRT at %L has a negative value", &e->where);
3635 return &gfc_bad_expr;
3639 gfc_expr *
3640 gfc_simplify_tan (gfc_expr * x)
3642 int i;
3643 gfc_expr *result;
3645 if (x->expr_type != EXPR_CONSTANT)
3646 return NULL;
3648 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3650 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3652 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
3654 return range_check (result, "TAN");
3658 gfc_expr *
3659 gfc_simplify_tanh (gfc_expr * x)
3661 gfc_expr *result;
3663 if (x->expr_type != EXPR_CONSTANT)
3664 return NULL;
3666 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3668 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
3670 return range_check (result, "TANH");
3675 gfc_expr *
3676 gfc_simplify_tiny (gfc_expr * e)
3678 gfc_expr *result;
3679 int i;
3681 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
3683 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
3684 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3686 return result;
3690 gfc_expr *
3691 gfc_simplify_trim (gfc_expr * e)
3693 gfc_expr *result;
3694 int count, i, len, lentrim;
3696 if (e->expr_type != EXPR_CONSTANT)
3697 return NULL;
3699 len = e->value.character.length;
3701 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3703 for (count = 0, i = 1; i <= len; ++i)
3705 if (e->value.character.string[len - i] == ' ')
3706 count++;
3707 else
3708 break;
3711 lentrim = len - count;
3713 result->value.character.length = lentrim;
3714 result->value.character.string = gfc_getmem (lentrim + 1);
3716 for (i = 0; i < lentrim; i++)
3717 result->value.character.string[i] = e->value.character.string[i];
3719 result->value.character.string[lentrim] = '\0'; /* For debugger */
3721 return result;
3725 gfc_expr *
3726 gfc_simplify_ubound (gfc_expr * array, gfc_expr * dim)
3728 return simplify_bound (array, dim, 1);
3732 gfc_expr *
3733 gfc_simplify_verify (gfc_expr * s, gfc_expr * set, gfc_expr * b)
3735 gfc_expr *result;
3736 int back;
3737 size_t index, len, lenset;
3738 size_t i;
3740 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
3741 return NULL;
3743 if (b != NULL && b->value.logical != 0)
3744 back = 1;
3745 else
3746 back = 0;
3748 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3749 &s->where);
3751 len = s->value.character.length;
3752 lenset = set->value.character.length;
3754 if (len == 0)
3756 mpz_set_ui (result->value.integer, 0);
3757 return result;
3760 if (back == 0)
3762 if (lenset == 0)
3764 mpz_set_ui (result->value.integer, len);
3765 return result;
3768 index =
3769 strspn (s->value.character.string, set->value.character.string) + 1;
3770 if (index > len)
3771 index = 0;
3774 else
3776 if (lenset == 0)
3778 mpz_set_ui (result->value.integer, 1);
3779 return result;
3781 for (index = len; index > 0; index --)
3783 for (i = 0; i < lenset; i++)
3785 if (s->value.character.string[index - 1]
3786 == set->value.character.string[i])
3787 break;
3789 if (i == lenset)
3790 break;
3794 mpz_set_ui (result->value.integer, index);
3795 return result;
3799 gfc_expr *
3800 gfc_simplify_xor (gfc_expr * x, gfc_expr * y)
3802 gfc_expr *result;
3803 int kind;
3805 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3806 return NULL;
3808 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
3809 if (x->ts.type == BT_INTEGER)
3811 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
3812 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
3814 else /* BT_LOGICAL */
3816 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
3817 result->value.logical = (x->value.logical && ! y->value.logical)
3818 || (! x->value.logical && y->value.logical);
3821 return range_check (result, "XOR");
3826 /****************** Constant simplification *****************/
3828 /* Master function to convert one constant to another. While this is
3829 used as a simplification function, it requires the destination type
3830 and kind information which is supplied by a special case in
3831 do_simplify(). */
3833 gfc_expr *
3834 gfc_convert_constant (gfc_expr * e, bt type, int kind)
3836 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
3837 gfc_constructor *head, *c, *tail = NULL;
3839 switch (e->ts.type)
3841 case BT_INTEGER:
3842 switch (type)
3844 case BT_INTEGER:
3845 f = gfc_int2int;
3846 break;
3847 case BT_REAL:
3848 f = gfc_int2real;
3849 break;
3850 case BT_COMPLEX:
3851 f = gfc_int2complex;
3852 break;
3853 case BT_LOGICAL:
3854 f = gfc_int2log;
3855 break;
3856 default:
3857 goto oops;
3859 break;
3861 case BT_REAL:
3862 switch (type)
3864 case BT_INTEGER:
3865 f = gfc_real2int;
3866 break;
3867 case BT_REAL:
3868 f = gfc_real2real;
3869 break;
3870 case BT_COMPLEX:
3871 f = gfc_real2complex;
3872 break;
3873 default:
3874 goto oops;
3876 break;
3878 case BT_COMPLEX:
3879 switch (type)
3881 case BT_INTEGER:
3882 f = gfc_complex2int;
3883 break;
3884 case BT_REAL:
3885 f = gfc_complex2real;
3886 break;
3887 case BT_COMPLEX:
3888 f = gfc_complex2complex;
3889 break;
3891 default:
3892 goto oops;
3894 break;
3896 case BT_LOGICAL:
3897 switch (type)
3899 case BT_INTEGER:
3900 f = gfc_log2int;
3901 break;
3902 case BT_LOGICAL:
3903 f = gfc_log2log;
3904 break;
3905 default:
3906 goto oops;
3908 break;
3910 case BT_HOLLERITH:
3911 switch (type)
3913 case BT_INTEGER:
3914 f = gfc_hollerith2int;
3915 break;
3917 case BT_REAL:
3918 f = gfc_hollerith2real;
3919 break;
3921 case BT_COMPLEX:
3922 f = gfc_hollerith2complex;
3923 break;
3925 case BT_CHARACTER:
3926 f = gfc_hollerith2character;
3927 break;
3929 case BT_LOGICAL:
3930 f = gfc_hollerith2logical;
3931 break;
3933 default:
3934 goto oops;
3936 break;
3938 default:
3939 oops:
3940 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
3943 result = NULL;
3945 switch (e->expr_type)
3947 case EXPR_CONSTANT:
3948 result = f (e, kind);
3949 if (result == NULL)
3950 return &gfc_bad_expr;
3951 break;
3953 case EXPR_ARRAY:
3954 if (!gfc_is_constant_expr (e))
3955 break;
3957 head = NULL;
3959 for (c = e->value.constructor; c; c = c->next)
3961 if (head == NULL)
3962 head = tail = gfc_get_constructor ();
3963 else
3965 tail->next = gfc_get_constructor ();
3966 tail = tail->next;
3969 tail->where = c->where;
3971 if (c->iterator == NULL)
3972 tail->expr = f (c->expr, kind);
3973 else
3975 g = gfc_convert_constant (c->expr, type, kind);
3976 if (g == &gfc_bad_expr)
3977 return g;
3978 tail->expr = g;
3981 if (tail->expr == NULL)
3983 gfc_free_constructor (head);
3984 return NULL;
3988 result = gfc_get_expr ();
3989 result->ts.type = type;
3990 result->ts.kind = kind;
3991 result->expr_type = EXPR_ARRAY;
3992 result->value.constructor = head;
3993 result->shape = gfc_copy_shape (e->shape, e->rank);
3994 result->where = e->where;
3995 result->rank = e->rank;
3996 break;
3998 default:
3999 break;
4002 return result;
4006 /****************** Helper functions ***********************/
4008 /* Given a collating table, create the inverse table. */
4010 static void
4011 invert_table (const int *table, int *xtable)
4013 int i;
4015 for (i = 0; i < 256; i++)
4016 xtable[i] = 0;
4018 for (i = 0; i < 256; i++)
4019 xtable[table[i]] = i;
4023 void
4024 gfc_simplify_init_1 (void)
4027 invert_table (ascii_table, xascii_table);