Merge from the pain train
[official-gcc.git] / gcc / fortran / simplify.c
blob81bc01599091420a7c4999a1307c1f18246226af
1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
3 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, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, 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");
267 gfc_expr *
268 gfc_simplify_adjustl (gfc_expr * e)
270 gfc_expr *result;
271 int count, i, len;
272 char ch;
274 if (e->expr_type != EXPR_CONSTANT)
275 return NULL;
277 len = e->value.character.length;
279 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
281 result->value.character.length = len;
282 result->value.character.string = gfc_getmem (len + 1);
284 for (count = 0, i = 0; i < len; ++i)
286 ch = e->value.character.string[i];
287 if (ch != ' ')
288 break;
289 ++count;
292 for (i = 0; i < len - count; ++i)
294 result->value.character.string[i] =
295 e->value.character.string[count + i];
298 for (i = len - count; i < len; ++i)
300 result->value.character.string[i] = ' ';
303 result->value.character.string[len] = '\0'; /* For debugger */
305 return result;
309 gfc_expr *
310 gfc_simplify_adjustr (gfc_expr * e)
312 gfc_expr *result;
313 int count, i, len;
314 char ch;
316 if (e->expr_type != EXPR_CONSTANT)
317 return NULL;
319 len = e->value.character.length;
321 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
323 result->value.character.length = len;
324 result->value.character.string = gfc_getmem (len + 1);
326 for (count = 0, i = len - 1; i >= 0; --i)
328 ch = e->value.character.string[i];
329 if (ch != ' ')
330 break;
331 ++count;
334 for (i = 0; i < count; ++i)
336 result->value.character.string[i] = ' ';
339 for (i = count; i < len; ++i)
341 result->value.character.string[i] =
342 e->value.character.string[i - count];
345 result->value.character.string[len] = '\0'; /* For debugger */
347 return result;
351 gfc_expr *
352 gfc_simplify_aimag (gfc_expr * e)
354 gfc_expr *result;
356 if (e->expr_type != EXPR_CONSTANT)
357 return NULL;
359 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
360 mpfr_set (result->value.real, e->value.complex.i, GFC_RND_MODE);
362 return range_check (result, "AIMAG");
366 gfc_expr *
367 gfc_simplify_aint (gfc_expr * e, gfc_expr * k)
369 gfc_expr *rtrunc, *result;
370 int kind;
372 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
373 if (kind == -1)
374 return &gfc_bad_expr;
376 if (e->expr_type != EXPR_CONSTANT)
377 return NULL;
379 rtrunc = gfc_copy_expr (e);
381 mpfr_trunc (rtrunc->value.real, e->value.real);
383 result = gfc_real2real (rtrunc, kind);
384 gfc_free_expr (rtrunc);
386 return range_check (result, "AINT");
390 gfc_expr *
391 gfc_simplify_dint (gfc_expr * e)
393 gfc_expr *rtrunc, *result;
395 if (e->expr_type != EXPR_CONSTANT)
396 return NULL;
398 rtrunc = gfc_copy_expr (e);
400 mpfr_trunc (rtrunc->value.real, e->value.real);
402 result = gfc_real2real (rtrunc, gfc_default_double_kind);
403 gfc_free_expr (rtrunc);
405 return range_check (result, "DINT");
409 gfc_expr *
410 gfc_simplify_anint (gfc_expr * e, gfc_expr * k)
412 gfc_expr *rtrunc, *result;
413 int kind, cmp;
414 mpfr_t half;
416 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
417 if (kind == -1)
418 return &gfc_bad_expr;
420 if (e->expr_type != EXPR_CONSTANT)
421 return NULL;
423 result = gfc_constant_result (e->ts.type, kind, &e->where);
425 rtrunc = gfc_copy_expr (e);
427 cmp = mpfr_cmp_ui (e->value.real, 0);
429 gfc_set_model_kind (kind);
430 mpfr_init (half);
431 mpfr_set_str (half, "0.5", 10, GFC_RND_MODE);
433 if (cmp > 0)
435 mpfr_add (rtrunc->value.real, e->value.real, half, GFC_RND_MODE);
436 mpfr_trunc (result->value.real, rtrunc->value.real);
438 else if (cmp < 0)
440 mpfr_sub (rtrunc->value.real, e->value.real, half, GFC_RND_MODE);
441 mpfr_trunc (result->value.real, rtrunc->value.real);
443 else
444 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
446 gfc_free_expr (rtrunc);
447 mpfr_clear (half);
449 return range_check (result, "ANINT");
453 gfc_expr *
454 gfc_simplify_dnint (gfc_expr * e)
456 gfc_expr *rtrunc, *result;
457 int cmp;
458 mpfr_t half;
460 if (e->expr_type != EXPR_CONSTANT)
461 return NULL;
463 result =
464 gfc_constant_result (BT_REAL, gfc_default_double_kind, &e->where);
466 rtrunc = gfc_copy_expr (e);
468 cmp = mpfr_cmp_ui (e->value.real, 0);
470 gfc_set_model_kind (gfc_default_double_kind);
471 mpfr_init (half);
472 mpfr_set_str (half, "0.5", 10, GFC_RND_MODE);
474 if (cmp > 0)
476 mpfr_add (rtrunc->value.real, e->value.real, half, GFC_RND_MODE);
477 mpfr_trunc (result->value.real, rtrunc->value.real);
479 else if (cmp < 0)
481 mpfr_sub (rtrunc->value.real, e->value.real, half, GFC_RND_MODE);
482 mpfr_trunc (result->value.real, rtrunc->value.real);
484 else
485 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
487 gfc_free_expr (rtrunc);
488 mpfr_clear (half);
490 return range_check (result, "DNINT");
494 gfc_expr *
495 gfc_simplify_asin (gfc_expr * x)
497 gfc_expr *result;
499 if (x->expr_type != EXPR_CONSTANT)
500 return NULL;
502 if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0)
504 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
505 &x->where);
506 return &gfc_bad_expr;
509 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
511 mpfr_asin(result->value.real, x->value.real, GFC_RND_MODE);
513 return range_check (result, "ASIN");
517 gfc_expr *
518 gfc_simplify_atan (gfc_expr * x)
520 gfc_expr *result;
522 if (x->expr_type != EXPR_CONSTANT)
523 return NULL;
525 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
527 mpfr_atan(result->value.real, x->value.real, GFC_RND_MODE);
529 return range_check (result, "ATAN");
534 gfc_expr *
535 gfc_simplify_atan2 (gfc_expr * y, gfc_expr * x)
537 gfc_expr *result;
539 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
540 return NULL;
542 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
544 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
546 gfc_error
547 ("If first argument of ATAN2 %L is zero, then the second argument "
548 "must not be zero", &x->where);
549 gfc_free_expr (result);
550 return &gfc_bad_expr;
553 arctangent2 (y->value.real, x->value.real, result->value.real);
555 return range_check (result, "ATAN2");
560 gfc_expr *
561 gfc_simplify_bit_size (gfc_expr * e)
563 gfc_expr *result;
564 int i;
566 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
567 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
568 mpz_set_ui (result->value.integer, gfc_integer_kinds[i].bit_size);
570 return result;
574 gfc_expr *
575 gfc_simplify_btest (gfc_expr * e, gfc_expr * bit)
577 int b;
579 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
580 return NULL;
582 if (gfc_extract_int (bit, &b) != NULL || b < 0)
583 return gfc_logical_expr (0, &e->where);
585 return gfc_logical_expr (mpz_tstbit (e->value.integer, b), &e->where);
589 gfc_expr *
590 gfc_simplify_ceiling (gfc_expr * e, gfc_expr * k)
592 gfc_expr *ceil, *result;
593 int kind;
595 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
596 if (kind == -1)
597 return &gfc_bad_expr;
599 if (e->expr_type != EXPR_CONSTANT)
600 return NULL;
602 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
604 ceil = gfc_copy_expr (e);
606 mpfr_ceil (ceil->value.real, e->value.real);
607 gfc_mpfr_to_mpz(result->value.integer, ceil->value.real);
609 gfc_free_expr (ceil);
611 return range_check (result, "CEILING");
615 gfc_expr *
616 gfc_simplify_char (gfc_expr * e, gfc_expr * k)
618 gfc_expr *result;
619 int c, kind;
621 kind = get_kind (BT_CHARACTER, k, "CHAR", gfc_default_character_kind);
622 if (kind == -1)
623 return &gfc_bad_expr;
625 if (e->expr_type != EXPR_CONSTANT)
626 return NULL;
628 if (gfc_extract_int (e, &c) != NULL || c < 0 || c > 255)
630 gfc_error ("Bad character in CHAR function at %L", &e->where);
631 return &gfc_bad_expr;
634 result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
636 result->value.character.length = 1;
637 result->value.character.string = gfc_getmem (2);
639 result->value.character.string[0] = c;
640 result->value.character.string[1] = '\0'; /* For debugger */
642 return result;
646 /* Common subroutine for simplifying CMPLX and DCMPLX. */
648 static gfc_expr *
649 simplify_cmplx (const char *name, gfc_expr * x, gfc_expr * y, int kind)
651 gfc_expr *result;
653 result = gfc_constant_result (BT_COMPLEX, kind, &x->where);
655 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
657 switch (x->ts.type)
659 case BT_INTEGER:
660 mpfr_set_z (result->value.complex.r, x->value.integer, GFC_RND_MODE);
661 break;
663 case BT_REAL:
664 mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
665 break;
667 case BT_COMPLEX:
668 mpfr_set (result->value.complex.r, x->value.complex.r, GFC_RND_MODE);
669 mpfr_set (result->value.complex.i, x->value.complex.i, GFC_RND_MODE);
670 break;
672 default:
673 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
676 if (y != NULL)
678 switch (y->ts.type)
680 case BT_INTEGER:
681 mpfr_set_z (result->value.complex.i, y->value.integer, GFC_RND_MODE);
682 break;
684 case BT_REAL:
685 mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
686 break;
688 default:
689 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
693 return range_check (result, name);
697 gfc_expr *
698 gfc_simplify_cmplx (gfc_expr * x, gfc_expr * y, gfc_expr * k)
700 int kind;
702 if (x->expr_type != EXPR_CONSTANT
703 || (y != NULL && y->expr_type != EXPR_CONSTANT))
704 return NULL;
706 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_real_kind);
707 if (kind == -1)
708 return &gfc_bad_expr;
710 return simplify_cmplx ("CMPLX", x, y, kind);
714 gfc_expr *
715 gfc_simplify_conjg (gfc_expr * e)
717 gfc_expr *result;
719 if (e->expr_type != EXPR_CONSTANT)
720 return NULL;
722 result = gfc_copy_expr (e);
723 mpfr_neg (result->value.complex.i, result->value.complex.i, GFC_RND_MODE);
725 return range_check (result, "CONJG");
729 gfc_expr *
730 gfc_simplify_cos (gfc_expr * x)
732 gfc_expr *result;
733 mpfr_t xp, xq;
735 if (x->expr_type != EXPR_CONSTANT)
736 return NULL;
738 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
740 switch (x->ts.type)
742 case BT_REAL:
743 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
744 break;
745 case BT_COMPLEX:
746 gfc_set_model_kind (x->ts.kind);
747 mpfr_init (xp);
748 mpfr_init (xq);
750 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
751 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
752 mpfr_mul(result->value.complex.r, xp, xq, GFC_RND_MODE);
754 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
755 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
756 mpfr_mul (xp, xp, xq, GFC_RND_MODE);
757 mpfr_neg (result->value.complex.i, xp, GFC_RND_MODE );
759 mpfr_clear (xp);
760 mpfr_clear (xq);
761 break;
762 default:
763 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
766 return range_check (result, "COS");
771 gfc_expr *
772 gfc_simplify_cosh (gfc_expr * x)
774 gfc_expr *result;
776 if (x->expr_type != EXPR_CONSTANT)
777 return NULL;
779 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
781 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
783 return range_check (result, "COSH");
787 gfc_expr *
788 gfc_simplify_dcmplx (gfc_expr * x, gfc_expr * y)
791 if (x->expr_type != EXPR_CONSTANT
792 || (y != NULL && y->expr_type != EXPR_CONSTANT))
793 return NULL;
795 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
799 gfc_expr *
800 gfc_simplify_dble (gfc_expr * e)
802 gfc_expr *result;
804 if (e->expr_type != EXPR_CONSTANT)
805 return NULL;
807 switch (e->ts.type)
809 case BT_INTEGER:
810 result = gfc_int2real (e, gfc_default_double_kind);
811 break;
813 case BT_REAL:
814 result = gfc_real2real (e, gfc_default_double_kind);
815 break;
817 case BT_COMPLEX:
818 result = gfc_complex2real (e, gfc_default_double_kind);
819 break;
821 default:
822 gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e->where);
825 return range_check (result, "DBLE");
829 gfc_expr *
830 gfc_simplify_digits (gfc_expr * x)
832 int i, digits;
834 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
835 switch (x->ts.type)
837 case BT_INTEGER:
838 digits = gfc_integer_kinds[i].digits;
839 break;
841 case BT_REAL:
842 case BT_COMPLEX:
843 digits = gfc_real_kinds[i].digits;
844 break;
846 default:
847 gcc_unreachable ();
850 return gfc_int_expr (digits);
854 gfc_expr *
855 gfc_simplify_dim (gfc_expr * x, gfc_expr * y)
857 gfc_expr *result;
859 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
860 return NULL;
862 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
864 switch (x->ts.type)
866 case BT_INTEGER:
867 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
868 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
869 else
870 mpz_set_ui (result->value.integer, 0);
872 break;
874 case BT_REAL:
875 if (mpfr_cmp (x->value.real, y->value.real) > 0)
876 mpfr_sub (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
877 else
878 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
880 break;
882 default:
883 gfc_internal_error ("gfc_simplify_dim(): Bad type");
886 return range_check (result, "DIM");
890 gfc_expr *
891 gfc_simplify_dprod (gfc_expr * x, gfc_expr * y)
893 gfc_expr *a1, *a2, *result;
895 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
896 return NULL;
898 result =
899 gfc_constant_result (BT_REAL, gfc_default_double_kind, &x->where);
901 a1 = gfc_real2real (x, gfc_default_double_kind);
902 a2 = gfc_real2real (y, gfc_default_double_kind);
904 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
906 gfc_free_expr (a1);
907 gfc_free_expr (a2);
909 return range_check (result, "DPROD");
913 gfc_expr *
914 gfc_simplify_epsilon (gfc_expr * e)
916 gfc_expr *result;
917 int i;
919 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
921 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
923 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
925 return range_check (result, "EPSILON");
929 gfc_expr *
930 gfc_simplify_exp (gfc_expr * x)
932 gfc_expr *result;
933 mpfr_t xp, xq;
935 if (x->expr_type != EXPR_CONSTANT)
936 return NULL;
938 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
940 switch (x->ts.type)
942 case BT_REAL:
943 mpfr_exp(result->value.real, x->value.real, GFC_RND_MODE);
944 break;
946 case BT_COMPLEX:
947 gfc_set_model_kind (x->ts.kind);
948 mpfr_init (xp);
949 mpfr_init (xq);
950 mpfr_exp (xq, x->value.complex.r, GFC_RND_MODE);
951 mpfr_cos (xp, x->value.complex.i, GFC_RND_MODE);
952 mpfr_mul (result->value.complex.r, xq, xp, GFC_RND_MODE);
953 mpfr_sin (xp, x->value.complex.i, GFC_RND_MODE);
954 mpfr_mul (result->value.complex.i, xq, xp, GFC_RND_MODE);
955 mpfr_clear (xp);
956 mpfr_clear (xq);
957 break;
959 default:
960 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
963 return range_check (result, "EXP");
966 /* FIXME: MPFR should be able to do this better */
967 gfc_expr *
968 gfc_simplify_exponent (gfc_expr * x)
970 mpfr_t tmp;
971 gfc_expr *result;
973 if (x->expr_type != EXPR_CONSTANT)
974 return NULL;
976 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
977 &x->where);
979 gfc_set_model (x->value.real);
981 if (mpfr_sgn (x->value.real) == 0)
983 mpz_set_ui (result->value.integer, 0);
984 return result;
987 mpfr_init (tmp);
989 mpfr_abs (tmp, x->value.real, GFC_RND_MODE);
990 mpfr_log2 (tmp, tmp, GFC_RND_MODE);
992 gfc_mpfr_to_mpz (result->value.integer, tmp);
994 mpfr_clear (tmp);
996 return range_check (result, "EXPONENT");
1000 gfc_expr *
1001 gfc_simplify_float (gfc_expr * a)
1003 gfc_expr *result;
1005 if (a->expr_type != EXPR_CONSTANT)
1006 return NULL;
1008 result = gfc_int2real (a, gfc_default_real_kind);
1009 return range_check (result, "FLOAT");
1013 gfc_expr *
1014 gfc_simplify_floor (gfc_expr * e, gfc_expr * k)
1016 gfc_expr *result;
1017 mpfr_t floor;
1018 int kind;
1020 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
1021 if (kind == -1)
1022 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
1024 if (e->expr_type != EXPR_CONSTANT)
1025 return NULL;
1027 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1029 gfc_set_model_kind (kind);
1030 mpfr_init (floor);
1031 mpfr_floor (floor, e->value.real);
1033 gfc_mpfr_to_mpz (result->value.integer, floor);
1035 mpfr_clear (floor);
1037 return range_check (result, "FLOOR");
1041 gfc_expr *
1042 gfc_simplify_fraction (gfc_expr * x)
1044 gfc_expr *result;
1045 mpfr_t absv, exp, pow2;
1047 if (x->expr_type != EXPR_CONSTANT)
1048 return NULL;
1050 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
1052 gfc_set_model_kind (x->ts.kind);
1054 if (mpfr_sgn (x->value.real) == 0)
1056 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1057 return result;
1060 mpfr_init (exp);
1061 mpfr_init (absv);
1062 mpfr_init (pow2);
1064 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
1065 mpfr_log2 (exp, absv, GFC_RND_MODE);
1067 mpfr_trunc (exp, exp);
1068 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
1070 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
1072 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
1074 mpfr_clear (exp);
1075 mpfr_clear (absv);
1076 mpfr_clear (pow2);
1078 return range_check (result, "FRACTION");
1082 gfc_expr *
1083 gfc_simplify_huge (gfc_expr * e)
1085 gfc_expr *result;
1086 int i;
1088 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1090 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1092 switch (e->ts.type)
1094 case BT_INTEGER:
1095 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
1096 break;
1098 case BT_REAL:
1099 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
1100 break;
1102 default:
1103 gcc_unreachable ();
1106 return result;
1110 gfc_expr *
1111 gfc_simplify_iachar (gfc_expr * e)
1113 gfc_expr *result;
1114 int index;
1116 if (e->expr_type != EXPR_CONSTANT)
1117 return NULL;
1119 if (e->value.character.length != 1)
1121 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
1122 return &gfc_bad_expr;
1125 index = xascii_table[(int) e->value.character.string[0] & 0xFF];
1127 result = gfc_int_expr (index);
1128 result->where = e->where;
1130 return range_check (result, "IACHAR");
1134 gfc_expr *
1135 gfc_simplify_iand (gfc_expr * x, gfc_expr * y)
1137 gfc_expr *result;
1139 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1140 return NULL;
1142 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1144 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1146 return range_check (result, "IAND");
1150 gfc_expr *
1151 gfc_simplify_ibclr (gfc_expr * x, gfc_expr * y)
1153 gfc_expr *result;
1154 int k, pos;
1156 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1157 return NULL;
1159 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1161 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
1162 return &gfc_bad_expr;
1165 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1167 if (pos > gfc_integer_kinds[k].bit_size)
1169 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
1170 &y->where);
1171 return &gfc_bad_expr;
1174 result = gfc_copy_expr (x);
1176 mpz_clrbit (result->value.integer, pos);
1177 return range_check (result, "IBCLR");
1181 gfc_expr *
1182 gfc_simplify_ibits (gfc_expr * x, gfc_expr * y, gfc_expr * z)
1184 gfc_expr *result;
1185 int pos, len;
1186 int i, k, bitsize;
1187 int *bits;
1189 if (x->expr_type != EXPR_CONSTANT
1190 || y->expr_type != EXPR_CONSTANT
1191 || z->expr_type != EXPR_CONSTANT)
1192 return NULL;
1194 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1196 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
1197 return &gfc_bad_expr;
1200 if (gfc_extract_int (z, &len) != NULL || len < 0)
1202 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
1203 return &gfc_bad_expr;
1206 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
1208 bitsize = gfc_integer_kinds[k].bit_size;
1210 if (pos + len > bitsize)
1212 gfc_error
1213 ("Sum of second and third arguments of IBITS exceeds bit size "
1214 "at %L", &y->where);
1215 return &gfc_bad_expr;
1218 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1220 bits = gfc_getmem (bitsize * sizeof (int));
1222 for (i = 0; i < bitsize; i++)
1223 bits[i] = 0;
1225 for (i = 0; i < len; i++)
1226 bits[i] = mpz_tstbit (x->value.integer, i + pos);
1228 for (i = 0; i < bitsize; i++)
1230 if (bits[i] == 0)
1232 mpz_clrbit (result->value.integer, i);
1234 else if (bits[i] == 1)
1236 mpz_setbit (result->value.integer, i);
1238 else
1240 gfc_internal_error ("IBITS: Bad bit");
1244 gfc_free (bits);
1246 return range_check (result, "IBITS");
1250 gfc_expr *
1251 gfc_simplify_ibset (gfc_expr * x, gfc_expr * y)
1253 gfc_expr *result;
1254 int k, pos;
1256 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1257 return NULL;
1259 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1261 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
1262 return &gfc_bad_expr;
1265 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1267 if (pos > gfc_integer_kinds[k].bit_size)
1269 gfc_error ("Second argument of IBSET exceeds bit size at %L",
1270 &y->where);
1271 return &gfc_bad_expr;
1274 result = gfc_copy_expr (x);
1276 mpz_setbit (result->value.integer, pos);
1277 return range_check (result, "IBSET");
1281 gfc_expr *
1282 gfc_simplify_ichar (gfc_expr * e)
1284 gfc_expr *result;
1285 int index;
1287 if (e->expr_type != EXPR_CONSTANT)
1288 return NULL;
1290 if (e->value.character.length != 1)
1292 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
1293 return &gfc_bad_expr;
1296 index = (int) e->value.character.string[0];
1298 if (index < CHAR_MIN || index > CHAR_MAX)
1300 gfc_error ("Argument of ICHAR at %L out of range of this processor",
1301 &e->where);
1302 return &gfc_bad_expr;
1305 result = gfc_int_expr (index);
1306 result->where = e->where;
1307 return range_check (result, "ICHAR");
1311 gfc_expr *
1312 gfc_simplify_ieor (gfc_expr * x, gfc_expr * y)
1314 gfc_expr *result;
1316 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1317 return NULL;
1319 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1321 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
1323 return range_check (result, "IEOR");
1327 gfc_expr *
1328 gfc_simplify_index (gfc_expr * x, gfc_expr * y, gfc_expr * b)
1330 gfc_expr *result;
1331 int back, len, lensub;
1332 int i, j, k, count, index = 0, start;
1334 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1335 return NULL;
1337 if (b != NULL && b->value.logical != 0)
1338 back = 1;
1339 else
1340 back = 0;
1342 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1343 &x->where);
1345 len = x->value.character.length;
1346 lensub = y->value.character.length;
1348 if (len < lensub)
1350 mpz_set_si (result->value.integer, 0);
1351 return result;
1354 if (back == 0)
1357 if (lensub == 0)
1359 mpz_set_si (result->value.integer, 1);
1360 return result;
1362 else if (lensub == 1)
1364 for (i = 0; i < len; i++)
1366 for (j = 0; j < lensub; j++)
1368 if (y->value.character.string[j] ==
1369 x->value.character.string[i])
1371 index = i + 1;
1372 goto done;
1377 else
1379 for (i = 0; i < len; i++)
1381 for (j = 0; j < lensub; j++)
1383 if (y->value.character.string[j] ==
1384 x->value.character.string[i])
1386 start = i;
1387 count = 0;
1389 for (k = 0; k < lensub; k++)
1391 if (y->value.character.string[k] ==
1392 x->value.character.string[k + start])
1393 count++;
1396 if (count == lensub)
1398 index = start + 1;
1399 goto done;
1407 else
1410 if (lensub == 0)
1412 mpz_set_si (result->value.integer, len + 1);
1413 return result;
1415 else if (lensub == 1)
1417 for (i = 0; i < len; i++)
1419 for (j = 0; j < lensub; j++)
1421 if (y->value.character.string[j] ==
1422 x->value.character.string[len - i])
1424 index = len - i + 1;
1425 goto done;
1430 else
1432 for (i = 0; i < len; i++)
1434 for (j = 0; j < lensub; j++)
1436 if (y->value.character.string[j] ==
1437 x->value.character.string[len - i])
1439 start = len - i;
1440 if (start <= len - lensub)
1442 count = 0;
1443 for (k = 0; k < lensub; k++)
1444 if (y->value.character.string[k] ==
1445 x->value.character.string[k + start])
1446 count++;
1448 if (count == lensub)
1450 index = start + 1;
1451 goto done;
1454 else
1456 continue;
1464 done:
1465 mpz_set_si (result->value.integer, index);
1466 return range_check (result, "INDEX");
1470 gfc_expr *
1471 gfc_simplify_int (gfc_expr * e, gfc_expr * k)
1473 gfc_expr *rpart, *rtrunc, *result;
1474 int kind;
1476 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
1477 if (kind == -1)
1478 return &gfc_bad_expr;
1480 if (e->expr_type != EXPR_CONSTANT)
1481 return NULL;
1483 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1485 switch (e->ts.type)
1487 case BT_INTEGER:
1488 mpz_set (result->value.integer, e->value.integer);
1489 break;
1491 case BT_REAL:
1492 rtrunc = gfc_copy_expr (e);
1493 mpfr_trunc (rtrunc->value.real, e->value.real);
1494 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1495 gfc_free_expr (rtrunc);
1496 break;
1498 case BT_COMPLEX:
1499 rpart = gfc_complex2real (e, kind);
1500 rtrunc = gfc_copy_expr (rpart);
1501 mpfr_trunc (rtrunc->value.real, rpart->value.real);
1502 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1503 gfc_free_expr (rpart);
1504 gfc_free_expr (rtrunc);
1505 break;
1507 default:
1508 gfc_error ("Argument of INT at %L is not a valid type", &e->where);
1509 gfc_free_expr (result);
1510 return &gfc_bad_expr;
1513 return range_check (result, "INT");
1517 gfc_expr *
1518 gfc_simplify_ifix (gfc_expr * e)
1520 gfc_expr *rtrunc, *result;
1522 if (e->expr_type != EXPR_CONSTANT)
1523 return NULL;
1525 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1526 &e->where);
1528 rtrunc = gfc_copy_expr (e);
1530 mpfr_trunc (rtrunc->value.real, e->value.real);
1531 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1533 gfc_free_expr (rtrunc);
1534 return range_check (result, "IFIX");
1538 gfc_expr *
1539 gfc_simplify_idint (gfc_expr * e)
1541 gfc_expr *rtrunc, *result;
1543 if (e->expr_type != EXPR_CONSTANT)
1544 return NULL;
1546 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1547 &e->where);
1549 rtrunc = gfc_copy_expr (e);
1551 mpfr_trunc (rtrunc->value.real, e->value.real);
1552 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1554 gfc_free_expr (rtrunc);
1555 return range_check (result, "IDINT");
1559 gfc_expr *
1560 gfc_simplify_ior (gfc_expr * x, gfc_expr * y)
1562 gfc_expr *result;
1564 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1565 return NULL;
1567 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1569 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
1570 return range_check (result, "IOR");
1574 gfc_expr *
1575 gfc_simplify_ishft (gfc_expr * e, gfc_expr * s)
1577 gfc_expr *result;
1578 int shift, ashift, isize, k, *bits, i;
1580 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1581 return NULL;
1583 if (gfc_extract_int (s, &shift) != NULL)
1585 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
1586 return &gfc_bad_expr;
1589 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
1591 isize = gfc_integer_kinds[k].bit_size;
1593 if (shift >= 0)
1594 ashift = shift;
1595 else
1596 ashift = -shift;
1598 if (ashift > isize)
1600 gfc_error
1601 ("Magnitude of second argument of ISHFT exceeds bit size at %L",
1602 &s->where);
1603 return &gfc_bad_expr;
1606 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1608 if (shift == 0)
1610 mpz_set (result->value.integer, e->value.integer);
1611 return range_check (result, "ISHFT");
1614 bits = gfc_getmem (isize * sizeof (int));
1616 for (i = 0; i < isize; i++)
1617 bits[i] = mpz_tstbit (e->value.integer, i);
1619 if (shift > 0)
1621 for (i = 0; i < shift; i++)
1622 mpz_clrbit (result->value.integer, i);
1624 for (i = 0; i < isize - shift; i++)
1626 if (bits[i] == 0)
1627 mpz_clrbit (result->value.integer, i + shift);
1628 else
1629 mpz_setbit (result->value.integer, i + shift);
1632 else
1634 for (i = isize - 1; i >= isize - ashift; i--)
1635 mpz_clrbit (result->value.integer, i);
1637 for (i = isize - 1; i >= ashift; i--)
1639 if (bits[i] == 0)
1640 mpz_clrbit (result->value.integer, i - ashift);
1641 else
1642 mpz_setbit (result->value.integer, i - ashift);
1646 twos_complement (result->value.integer, isize);
1648 gfc_free (bits);
1649 return result;
1653 gfc_expr *
1654 gfc_simplify_ishftc (gfc_expr * e, gfc_expr * s, gfc_expr * sz)
1656 gfc_expr *result;
1657 int shift, ashift, isize, delta, k;
1658 int i, *bits;
1660 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1661 return NULL;
1663 if (gfc_extract_int (s, &shift) != NULL)
1665 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
1666 return &gfc_bad_expr;
1669 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1671 if (sz != NULL)
1673 if (gfc_extract_int (sz, &isize) != NULL || isize < 0)
1675 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
1676 return &gfc_bad_expr;
1679 else
1680 isize = gfc_integer_kinds[k].bit_size;
1682 if (shift >= 0)
1683 ashift = shift;
1684 else
1685 ashift = -shift;
1687 if (ashift > isize)
1689 gfc_error
1690 ("Magnitude of second argument of ISHFTC exceeds third argument "
1691 "at %L", &s->where);
1692 return &gfc_bad_expr;
1695 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1697 if (shift == 0)
1699 mpz_set (result->value.integer, e->value.integer);
1700 return result;
1703 bits = gfc_getmem (isize * sizeof (int));
1705 for (i = 0; i < isize; i++)
1706 bits[i] = mpz_tstbit (e->value.integer, i);
1708 delta = isize - ashift;
1710 if (shift > 0)
1712 for (i = 0; i < delta; i++)
1714 if (bits[i] == 0)
1715 mpz_clrbit (result->value.integer, i + shift);
1716 else
1717 mpz_setbit (result->value.integer, i + shift);
1720 for (i = delta; i < isize; i++)
1722 if (bits[i] == 0)
1723 mpz_clrbit (result->value.integer, i - delta);
1724 else
1725 mpz_setbit (result->value.integer, i - delta);
1728 else
1730 for (i = 0; i < ashift; i++)
1732 if (bits[i] == 0)
1733 mpz_clrbit (result->value.integer, i + delta);
1734 else
1735 mpz_setbit (result->value.integer, i + delta);
1738 for (i = ashift; i < isize; i++)
1740 if (bits[i] == 0)
1741 mpz_clrbit (result->value.integer, i + shift);
1742 else
1743 mpz_setbit (result->value.integer, i + shift);
1747 twos_complement (result->value.integer, isize);
1749 gfc_free (bits);
1750 return result;
1754 gfc_expr *
1755 gfc_simplify_kind (gfc_expr * e)
1758 if (e->ts.type == BT_DERIVED)
1760 gfc_error ("Argument of KIND at %L is a DERIVED type", &e->where);
1761 return &gfc_bad_expr;
1764 return gfc_int_expr (e->ts.kind);
1768 static gfc_expr *
1769 gfc_simplify_bound (gfc_expr * array, gfc_expr * dim, int upper)
1771 gfc_ref *ref;
1772 gfc_array_spec *as;
1773 int i;
1775 if (array->expr_type != EXPR_VARIABLE)
1776 return NULL;
1778 if (dim == NULL)
1779 return NULL;
1781 if (dim->expr_type != EXPR_CONSTANT)
1782 return NULL;
1784 /* Follow any component references. */
1785 as = array->symtree->n.sym->as;
1786 ref = array->ref;
1787 while (ref->next != NULL)
1789 if (ref->type == REF_COMPONENT)
1790 as = ref->u.c.sym->as;
1791 ref = ref->next;
1794 if (ref->type != REF_ARRAY || ref->u.ar.type != AR_FULL)
1795 return NULL;
1797 i = mpz_get_si (dim->value.integer);
1798 if (upper)
1799 return gfc_copy_expr (as->upper[i-1]);
1800 else
1801 return gfc_copy_expr (as->lower[i-1]);
1805 gfc_expr *
1806 gfc_simplify_lbound (gfc_expr * array, gfc_expr * dim)
1808 return gfc_simplify_bound (array, dim, 0);
1812 gfc_expr *
1813 gfc_simplify_len (gfc_expr * e)
1815 gfc_expr *result;
1817 if (e->expr_type != EXPR_CONSTANT)
1818 return NULL;
1820 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1821 &e->where);
1823 mpz_set_si (result->value.integer, e->value.character.length);
1824 return range_check (result, "LEN");
1828 gfc_expr *
1829 gfc_simplify_len_trim (gfc_expr * e)
1831 gfc_expr *result;
1832 int count, len, lentrim, i;
1834 if (e->expr_type != EXPR_CONSTANT)
1835 return NULL;
1837 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1838 &e->where);
1840 len = e->value.character.length;
1842 for (count = 0, i = 1; i <= len; i++)
1843 if (e->value.character.string[len - i] == ' ')
1844 count++;
1845 else
1846 break;
1848 lentrim = len - count;
1850 mpz_set_si (result->value.integer, lentrim);
1851 return range_check (result, "LEN_TRIM");
1855 gfc_expr *
1856 gfc_simplify_lge (gfc_expr * a, gfc_expr * b)
1859 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
1860 return NULL;
1862 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) >= 0,
1863 &a->where);
1867 gfc_expr *
1868 gfc_simplify_lgt (gfc_expr * a, gfc_expr * b)
1871 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
1872 return NULL;
1874 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) > 0,
1875 &a->where);
1879 gfc_expr *
1880 gfc_simplify_lle (gfc_expr * a, gfc_expr * b)
1883 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
1884 return NULL;
1886 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) <= 0,
1887 &a->where);
1891 gfc_expr *
1892 gfc_simplify_llt (gfc_expr * a, gfc_expr * b)
1895 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
1896 return NULL;
1898 return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) < 0,
1899 &a->where);
1903 gfc_expr *
1904 gfc_simplify_log (gfc_expr * x)
1906 gfc_expr *result;
1907 mpfr_t xr, xi;
1909 if (x->expr_type != EXPR_CONSTANT)
1910 return NULL;
1912 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1914 gfc_set_model_kind (x->ts.kind);
1916 switch (x->ts.type)
1918 case BT_REAL:
1919 if (mpfr_sgn (x->value.real) <= 0)
1921 gfc_error
1922 ("Argument of LOG at %L cannot be less than or equal to zero",
1923 &x->where);
1924 gfc_free_expr (result);
1925 return &gfc_bad_expr;
1928 mpfr_log(result->value.real, x->value.real, GFC_RND_MODE);
1929 break;
1931 case BT_COMPLEX:
1932 if ((mpfr_sgn (x->value.complex.r) == 0)
1933 && (mpfr_sgn (x->value.complex.i) == 0))
1935 gfc_error ("Complex argument of LOG at %L cannot be zero",
1936 &x->where);
1937 gfc_free_expr (result);
1938 return &gfc_bad_expr;
1941 mpfr_init (xr);
1942 mpfr_init (xi);
1944 arctangent2 (x->value.complex.i, x->value.complex.r,
1945 result->value.complex.i);
1947 mpfr_mul (xr, x->value.complex.r, x->value.complex.r, GFC_RND_MODE);
1948 mpfr_mul (xi, x->value.complex.i, x->value.complex.i, GFC_RND_MODE);
1949 mpfr_add (xr, xr, xi, GFC_RND_MODE);
1950 mpfr_sqrt (xr, xr, GFC_RND_MODE);
1951 mpfr_log (result->value.complex.r, xr, GFC_RND_MODE);
1953 mpfr_clear (xr);
1954 mpfr_clear (xi);
1956 break;
1958 default:
1959 gfc_internal_error ("gfc_simplify_log: bad type");
1962 return range_check (result, "LOG");
1966 gfc_expr *
1967 gfc_simplify_log10 (gfc_expr * x)
1969 gfc_expr *result;
1971 if (x->expr_type != EXPR_CONSTANT)
1972 return NULL;
1974 gfc_set_model_kind (x->ts.kind);
1976 if (mpfr_sgn (x->value.real) <= 0)
1978 gfc_error
1979 ("Argument of LOG10 at %L cannot be less than or equal to zero",
1980 &x->where);
1981 return &gfc_bad_expr;
1984 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1986 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
1988 return range_check (result, "LOG10");
1992 gfc_expr *
1993 gfc_simplify_logical (gfc_expr * e, gfc_expr * k)
1995 gfc_expr *result;
1996 int kind;
1998 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
1999 if (kind < 0)
2000 return &gfc_bad_expr;
2002 if (e->expr_type != EXPR_CONSTANT)
2003 return NULL;
2005 result = gfc_constant_result (BT_LOGICAL, kind, &e->where);
2007 result->value.logical = e->value.logical;
2009 return result;
2013 /* This function is special since MAX() can take any number of
2014 arguments. The simplified expression is a rewritten version of the
2015 argument list containing at most one constant element. Other
2016 constant elements are deleted. Because the argument list has
2017 already been checked, this function always succeeds. sign is 1 for
2018 MAX(), -1 for MIN(). */
2020 static gfc_expr *
2021 simplify_min_max (gfc_expr * expr, int sign)
2023 gfc_actual_arglist *arg, *last, *extremum;
2024 gfc_intrinsic_sym * specific;
2026 last = NULL;
2027 extremum = NULL;
2028 specific = expr->value.function.isym;
2030 arg = expr->value.function.actual;
2032 for (; arg; last = arg, arg = arg->next)
2034 if (arg->expr->expr_type != EXPR_CONSTANT)
2035 continue;
2037 if (extremum == NULL)
2039 extremum = arg;
2040 continue;
2043 switch (arg->expr->ts.type)
2045 case BT_INTEGER:
2046 if (mpz_cmp (arg->expr->value.integer,
2047 extremum->expr->value.integer) * sign > 0)
2048 mpz_set (extremum->expr->value.integer, arg->expr->value.integer);
2050 break;
2052 case BT_REAL:
2053 if (mpfr_cmp (arg->expr->value.real, extremum->expr->value.real) *
2054 sign > 0)
2055 mpfr_set (extremum->expr->value.real, arg->expr->value.real,
2056 GFC_RND_MODE);
2058 break;
2060 default:
2061 gfc_internal_error ("gfc_simplify_max(): Bad type in arglist");
2064 /* Delete the extra constant argument. */
2065 if (last == NULL)
2066 expr->value.function.actual = arg->next;
2067 else
2068 last->next = arg->next;
2070 arg->next = NULL;
2071 gfc_free_actual_arglist (arg);
2072 arg = last;
2075 /* If there is one value left, replace the function call with the
2076 expression. */
2077 if (expr->value.function.actual->next != NULL)
2078 return NULL;
2080 /* Convert to the correct type and kind. */
2081 if (expr->ts.type != BT_UNKNOWN)
2082 return gfc_convert_constant (expr->value.function.actual->expr,
2083 expr->ts.type, expr->ts.kind);
2085 if (specific->ts.type != BT_UNKNOWN)
2086 return gfc_convert_constant (expr->value.function.actual->expr,
2087 specific->ts.type, specific->ts.kind);
2089 return gfc_copy_expr (expr->value.function.actual->expr);
2093 gfc_expr *
2094 gfc_simplify_min (gfc_expr * e)
2096 return simplify_min_max (e, -1);
2100 gfc_expr *
2101 gfc_simplify_max (gfc_expr * e)
2103 return simplify_min_max (e, 1);
2107 gfc_expr *
2108 gfc_simplify_maxexponent (gfc_expr * x)
2110 gfc_expr *result;
2111 int i;
2113 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2115 result = gfc_int_expr (gfc_real_kinds[i].max_exponent);
2116 result->where = x->where;
2118 return result;
2122 gfc_expr *
2123 gfc_simplify_minexponent (gfc_expr * x)
2125 gfc_expr *result;
2126 int i;
2128 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2130 result = gfc_int_expr (gfc_real_kinds[i].min_exponent);
2131 result->where = x->where;
2133 return result;
2137 gfc_expr *
2138 gfc_simplify_mod (gfc_expr * a, gfc_expr * p)
2140 gfc_expr *result;
2141 mpfr_t quot, iquot, term;
2143 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2144 return NULL;
2146 result = gfc_constant_result (a->ts.type, a->ts.kind, &a->where);
2148 switch (a->ts.type)
2150 case BT_INTEGER:
2151 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2153 /* Result is processor-dependent. */
2154 gfc_error ("Second argument MOD at %L is zero", &a->where);
2155 gfc_free_expr (result);
2156 return &gfc_bad_expr;
2158 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
2159 break;
2161 case BT_REAL:
2162 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2164 /* Result is processor-dependent. */
2165 gfc_error ("Second argument of MOD at %L is zero", &p->where);
2166 gfc_free_expr (result);
2167 return &gfc_bad_expr;
2170 gfc_set_model_kind (a->ts.kind);
2171 mpfr_init (quot);
2172 mpfr_init (iquot);
2173 mpfr_init (term);
2175 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2176 mpfr_trunc (iquot, quot);
2177 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2178 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2180 mpfr_clear (quot);
2181 mpfr_clear (iquot);
2182 mpfr_clear (term);
2183 break;
2185 default:
2186 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
2189 return range_check (result, "MOD");
2193 gfc_expr *
2194 gfc_simplify_modulo (gfc_expr * a, gfc_expr * p)
2196 gfc_expr *result;
2197 mpfr_t quot, iquot, term;
2199 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2200 return NULL;
2202 result = gfc_constant_result (a->ts.type, a->ts.kind, &a->where);
2204 switch (a->ts.type)
2206 case BT_INTEGER:
2207 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2209 /* Result is processor-dependent. This processor just opts
2210 to not handle it at all. */
2211 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
2212 gfc_free_expr (result);
2213 return &gfc_bad_expr;
2215 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
2217 break;
2219 case BT_REAL:
2220 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2222 /* Result is processor-dependent. */
2223 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
2224 gfc_free_expr (result);
2225 return &gfc_bad_expr;
2228 gfc_set_model_kind (a->ts.kind);
2229 mpfr_init (quot);
2230 mpfr_init (iquot);
2231 mpfr_init (term);
2233 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2234 mpfr_floor (iquot, quot);
2235 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2237 mpfr_clear (quot);
2238 mpfr_clear (iquot);
2239 mpfr_clear (term);
2241 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2242 break;
2244 default:
2245 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
2248 return range_check (result, "MODULO");
2252 /* Exists for the sole purpose of consistency with other intrinsics. */
2253 gfc_expr *
2254 gfc_simplify_mvbits (gfc_expr * f ATTRIBUTE_UNUSED,
2255 gfc_expr * fp ATTRIBUTE_UNUSED,
2256 gfc_expr * l ATTRIBUTE_UNUSED,
2257 gfc_expr * to ATTRIBUTE_UNUSED,
2258 gfc_expr * tp ATTRIBUTE_UNUSED)
2260 return NULL;
2264 gfc_expr *
2265 gfc_simplify_nearest (gfc_expr * x, gfc_expr * s)
2267 gfc_expr *result;
2268 float rval;
2269 double val, eps;
2270 int p, i, k, match_float;
2272 /* FIXME: This implementation is dopey and probably not quite right,
2273 but it's a start. */
2275 if (x->expr_type != EXPR_CONSTANT)
2276 return NULL;
2278 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2280 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2282 val = mpfr_get_d (x->value.real, GFC_RND_MODE);
2283 p = gfc_real_kinds[k].digits;
2285 eps = 1.;
2286 for (i = 1; i < p; ++i)
2288 eps = eps / 2.;
2291 /* TODO we should make sure that 'float' matches kind 4 */
2292 match_float = gfc_real_kinds[k].kind == 4;
2293 if (mpfr_cmp_ui (s->value.real, 0) > 0)
2295 if (match_float)
2297 rval = (float) val;
2298 rval = rval + eps;
2299 mpfr_set_d (result->value.real, rval, GFC_RND_MODE);
2301 else
2303 val = val + eps;
2304 mpfr_set_d (result->value.real, val, GFC_RND_MODE);
2307 else if (mpfr_cmp_ui (s->value.real, 0) < 0)
2309 if (match_float)
2311 rval = (float) val;
2312 rval = rval - eps;
2313 mpfr_set_d (result->value.real, rval, GFC_RND_MODE);
2315 else
2317 val = val - eps;
2318 mpfr_set_d (result->value.real, val, GFC_RND_MODE);
2321 else
2323 gfc_error ("Invalid second argument of NEAREST at %L", &s->where);
2324 gfc_free (result);
2325 return &gfc_bad_expr;
2328 return range_check (result, "NEAREST");
2332 static gfc_expr *
2333 simplify_nint (const char *name, gfc_expr * e, gfc_expr * k)
2335 gfc_expr *rtrunc, *itrunc, *result;
2336 int kind, cmp;
2337 mpfr_t half;
2339 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
2340 if (kind == -1)
2341 return &gfc_bad_expr;
2343 if (e->expr_type != EXPR_CONSTANT)
2344 return NULL;
2346 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
2348 rtrunc = gfc_copy_expr (e);
2349 itrunc = gfc_copy_expr (e);
2351 cmp = mpfr_cmp_ui (e->value.real, 0);
2353 gfc_set_model (e->value.real);
2354 mpfr_init (half);
2355 mpfr_set_str (half, "0.5", 10, GFC_RND_MODE);
2357 if (cmp > 0)
2359 mpfr_add (rtrunc->value.real, e->value.real, half, GFC_RND_MODE);
2360 mpfr_trunc (itrunc->value.real, rtrunc->value.real);
2362 else if (cmp < 0)
2364 mpfr_sub (rtrunc->value.real, e->value.real, half, GFC_RND_MODE);
2365 mpfr_trunc (itrunc->value.real, rtrunc->value.real);
2367 else
2368 mpfr_set_ui (itrunc->value.real, 0, GFC_RND_MODE);
2370 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real);
2372 gfc_free_expr (itrunc);
2373 gfc_free_expr (rtrunc);
2374 mpfr_clear (half);
2376 return range_check (result, name);
2380 gfc_expr *
2381 gfc_simplify_nint (gfc_expr * e, gfc_expr * k)
2383 return simplify_nint ("NINT", e, k);
2387 gfc_expr *
2388 gfc_simplify_idnint (gfc_expr * e)
2390 return simplify_nint ("IDNINT", e, NULL);
2394 gfc_expr *
2395 gfc_simplify_not (gfc_expr * e)
2397 gfc_expr *result;
2398 int i;
2400 if (e->expr_type != EXPR_CONSTANT)
2401 return NULL;
2403 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2405 mpz_com (result->value.integer, e->value.integer);
2407 /* Because of how GMP handles numbers, the result must be ANDed with
2408 the max_int mask. For radices <> 2, this will require change. */
2410 i = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2412 mpz_and (result->value.integer, result->value.integer,
2413 gfc_integer_kinds[i].max_int);
2415 return range_check (result, "NOT");
2419 gfc_expr *
2420 gfc_simplify_null (gfc_expr * mold)
2422 gfc_expr *result;
2424 result = gfc_get_expr ();
2425 result->expr_type = EXPR_NULL;
2427 if (mold == NULL)
2428 result->ts.type = BT_UNKNOWN;
2429 else
2431 result->ts = mold->ts;
2432 result->where = mold->where;
2435 return result;
2439 gfc_expr *
2440 gfc_simplify_precision (gfc_expr * e)
2442 gfc_expr *result;
2443 int i;
2445 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2447 result = gfc_int_expr (gfc_real_kinds[i].precision);
2448 result->where = e->where;
2450 return result;
2454 gfc_expr *
2455 gfc_simplify_radix (gfc_expr * e)
2457 gfc_expr *result;
2458 int i;
2460 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2461 switch (e->ts.type)
2463 case BT_INTEGER:
2464 i = gfc_integer_kinds[i].radix;
2465 break;
2467 case BT_REAL:
2468 i = gfc_real_kinds[i].radix;
2469 break;
2471 default:
2472 gcc_unreachable ();
2475 result = gfc_int_expr (i);
2476 result->where = e->where;
2478 return result;
2482 gfc_expr *
2483 gfc_simplify_range (gfc_expr * e)
2485 gfc_expr *result;
2486 int i;
2487 long j;
2489 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2491 switch (e->ts.type)
2493 case BT_INTEGER:
2494 j = gfc_integer_kinds[i].range;
2495 break;
2497 case BT_REAL:
2498 case BT_COMPLEX:
2499 j = gfc_real_kinds[i].range;
2500 break;
2502 default:
2503 gcc_unreachable ();
2506 result = gfc_int_expr (j);
2507 result->where = e->where;
2509 return result;
2513 gfc_expr *
2514 gfc_simplify_real (gfc_expr * e, gfc_expr * k)
2516 gfc_expr *result;
2517 int kind;
2519 if (e->ts.type == BT_COMPLEX)
2520 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
2521 else
2522 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
2524 if (kind == -1)
2525 return &gfc_bad_expr;
2527 if (e->expr_type != EXPR_CONSTANT)
2528 return NULL;
2530 switch (e->ts.type)
2532 case BT_INTEGER:
2533 result = gfc_int2real (e, kind);
2534 break;
2536 case BT_REAL:
2537 result = gfc_real2real (e, kind);
2538 break;
2540 case BT_COMPLEX:
2541 result = gfc_complex2real (e, kind);
2542 break;
2544 default:
2545 gfc_internal_error ("bad type in REAL");
2546 /* Not reached */
2549 return range_check (result, "REAL");
2552 gfc_expr *
2553 gfc_simplify_repeat (gfc_expr * e, gfc_expr * n)
2555 gfc_expr *result;
2556 int i, j, len, ncopies, nlen;
2558 if (e->expr_type != EXPR_CONSTANT || n->expr_type != EXPR_CONSTANT)
2559 return NULL;
2561 if (n != NULL && (gfc_extract_int (n, &ncopies) != NULL || ncopies < 0))
2563 gfc_error ("Invalid second argument of REPEAT at %L", &n->where);
2564 return &gfc_bad_expr;
2567 len = e->value.character.length;
2568 nlen = ncopies * len;
2570 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
2572 if (ncopies == 0)
2574 result->value.character.string = gfc_getmem (1);
2575 result->value.character.length = 0;
2576 result->value.character.string[0] = '\0';
2577 return result;
2580 result->value.character.length = nlen;
2581 result->value.character.string = gfc_getmem (nlen + 1);
2583 for (i = 0; i < ncopies; i++)
2584 for (j = 0; j < len; j++)
2585 result->value.character.string[j + i * len] =
2586 e->value.character.string[j];
2588 result->value.character.string[nlen] = '\0'; /* For debugger */
2589 return result;
2593 /* This one is a bear, but mainly has to do with shuffling elements. */
2595 gfc_expr *
2596 gfc_simplify_reshape (gfc_expr * source, gfc_expr * shape_exp,
2597 gfc_expr * pad, gfc_expr * order_exp)
2600 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
2601 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
2602 gfc_constructor *head, *tail;
2603 mpz_t index, size;
2604 unsigned long j;
2605 size_t nsource;
2606 gfc_expr *e;
2608 /* Unpack the shape array. */
2609 if (source->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (source))
2610 return NULL;
2612 if (shape_exp->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (shape_exp))
2613 return NULL;
2615 if (pad != NULL
2616 && (pad->expr_type != EXPR_ARRAY
2617 || !gfc_is_constant_expr (pad)))
2618 return NULL;
2620 if (order_exp != NULL
2621 && (order_exp->expr_type != EXPR_ARRAY
2622 || !gfc_is_constant_expr (order_exp)))
2623 return NULL;
2625 mpz_init (index);
2626 rank = 0;
2627 head = tail = NULL;
2629 for (;;)
2631 e = gfc_get_array_element (shape_exp, rank);
2632 if (e == NULL)
2633 break;
2635 if (gfc_extract_int (e, &shape[rank]) != NULL)
2637 gfc_error ("Integer too large in shape specification at %L",
2638 &e->where);
2639 gfc_free_expr (e);
2640 goto bad_reshape;
2643 gfc_free_expr (e);
2645 if (rank >= GFC_MAX_DIMENSIONS)
2647 gfc_error ("Too many dimensions in shape specification for RESHAPE "
2648 "at %L", &e->where);
2650 goto bad_reshape;
2653 if (shape[rank] < 0)
2655 gfc_error ("Shape specification at %L cannot be negative",
2656 &e->where);
2657 goto bad_reshape;
2660 rank++;
2663 if (rank == 0)
2665 gfc_error ("Shape specification at %L cannot be the null array",
2666 &shape_exp->where);
2667 goto bad_reshape;
2670 /* Now unpack the order array if present. */
2671 if (order_exp == NULL)
2673 for (i = 0; i < rank; i++)
2674 order[i] = i;
2677 else
2680 for (i = 0; i < rank; i++)
2681 x[i] = 0;
2683 for (i = 0; i < rank; i++)
2685 e = gfc_get_array_element (order_exp, i);
2686 if (e == NULL)
2688 gfc_error
2689 ("ORDER parameter of RESHAPE at %L is not the same size "
2690 "as SHAPE parameter", &order_exp->where);
2691 goto bad_reshape;
2694 if (gfc_extract_int (e, &order[i]) != NULL)
2696 gfc_error ("Error in ORDER parameter of RESHAPE at %L",
2697 &e->where);
2698 gfc_free_expr (e);
2699 goto bad_reshape;
2702 gfc_free_expr (e);
2704 if (order[i] < 1 || order[i] > rank)
2706 gfc_error ("ORDER parameter of RESHAPE at %L is out of range",
2707 &e->where);
2708 goto bad_reshape;
2711 order[i]--;
2713 if (x[order[i]])
2715 gfc_error ("Invalid permutation in ORDER parameter at %L",
2716 &e->where);
2717 goto bad_reshape;
2720 x[order[i]] = 1;
2724 /* Count the elements in the source and padding arrays. */
2726 npad = 0;
2727 if (pad != NULL)
2729 gfc_array_size (pad, &size);
2730 npad = mpz_get_ui (size);
2731 mpz_clear (size);
2734 gfc_array_size (source, &size);
2735 nsource = mpz_get_ui (size);
2736 mpz_clear (size);
2738 /* If it weren't for that pesky permutation we could just loop
2739 through the source and round out any shortage with pad elements.
2740 But no, someone just had to have the compiler do something the
2741 user should be doing. */
2743 for (i = 0; i < rank; i++)
2744 x[i] = 0;
2746 for (;;)
2748 /* Figure out which element to extract. */
2749 mpz_set_ui (index, 0);
2751 for (i = rank - 1; i >= 0; i--)
2753 mpz_add_ui (index, index, x[order[i]]);
2754 if (i != 0)
2755 mpz_mul_ui (index, index, shape[order[i - 1]]);
2758 if (mpz_cmp_ui (index, INT_MAX) > 0)
2759 gfc_internal_error ("Reshaped array too large at %L", &e->where);
2761 j = mpz_get_ui (index);
2763 if (j < nsource)
2764 e = gfc_get_array_element (source, j);
2765 else
2767 j = j - nsource;
2769 if (npad == 0)
2771 gfc_error
2772 ("PAD parameter required for short SOURCE parameter at %L",
2773 &source->where);
2774 goto bad_reshape;
2777 j = j % npad;
2778 e = gfc_get_array_element (pad, j);
2781 if (head == NULL)
2782 head = tail = gfc_get_constructor ();
2783 else
2785 tail->next = gfc_get_constructor ();
2786 tail = tail->next;
2789 if (e == NULL)
2790 goto bad_reshape;
2792 tail->where = e->where;
2793 tail->expr = e;
2795 /* Calculate the next element. */
2796 i = 0;
2798 inc:
2799 if (++x[i] < shape[i])
2800 continue;
2801 x[i++] = 0;
2802 if (i < rank)
2803 goto inc;
2805 break;
2808 mpz_clear (index);
2810 e = gfc_get_expr ();
2811 e->where = source->where;
2812 e->expr_type = EXPR_ARRAY;
2813 e->value.constructor = head;
2814 e->shape = gfc_get_shape (rank);
2816 for (i = 0; i < rank; i++)
2817 mpz_init_set_ui (e->shape[i], shape[i]);
2819 e->ts = head->expr->ts;
2820 e->rank = rank;
2822 return e;
2824 bad_reshape:
2825 gfc_free_constructor (head);
2826 mpz_clear (index);
2827 return &gfc_bad_expr;
2831 gfc_expr *
2832 gfc_simplify_rrspacing (gfc_expr * x)
2834 gfc_expr *result;
2835 mpfr_t absv, log2, exp, frac, pow2;
2836 int i, p;
2838 if (x->expr_type != EXPR_CONSTANT)
2839 return NULL;
2841 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2843 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
2845 p = gfc_real_kinds[i].digits;
2847 gfc_set_model_kind (x->ts.kind);
2849 if (mpfr_sgn (x->value.real) == 0)
2851 mpfr_ui_div (result->value.real, 1, gfc_real_kinds[i].tiny, GFC_RND_MODE);
2852 return result;
2855 mpfr_init (log2);
2856 mpfr_init (absv);
2857 mpfr_init (frac);
2858 mpfr_init (pow2);
2860 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2861 mpfr_log2 (log2, absv, GFC_RND_MODE);
2863 mpfr_trunc (log2, log2);
2864 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
2866 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2867 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
2869 mpfr_mul_2exp (result->value.real, frac, (unsigned long)p, GFC_RND_MODE);
2871 mpfr_clear (log2);
2872 mpfr_clear (absv);
2873 mpfr_clear (frac);
2874 mpfr_clear (pow2);
2876 return range_check (result, "RRSPACING");
2880 gfc_expr *
2881 gfc_simplify_scale (gfc_expr * x, gfc_expr * i)
2883 int k, neg_flag, power, exp_range;
2884 mpfr_t scale, radix;
2885 gfc_expr *result;
2887 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
2888 return NULL;
2890 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
2892 if (mpfr_sgn (x->value.real) == 0)
2894 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2895 return result;
2898 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2900 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
2902 /* This check filters out values of i that would overflow an int. */
2903 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
2904 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
2906 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
2907 return &gfc_bad_expr;
2910 /* Compute scale = radix ** power. */
2911 power = mpz_get_si (i->value.integer);
2913 if (power >= 0)
2914 neg_flag = 0;
2915 else
2917 neg_flag = 1;
2918 power = -power;
2921 gfc_set_model_kind (x->ts.kind);
2922 mpfr_init (scale);
2923 mpfr_init (radix);
2924 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
2925 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
2927 if (neg_flag)
2928 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
2929 else
2930 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
2932 mpfr_clear (scale);
2933 mpfr_clear (radix);
2935 return range_check (result, "SCALE");
2939 gfc_expr *
2940 gfc_simplify_scan (gfc_expr * e, gfc_expr * c, gfc_expr * b)
2942 gfc_expr *result;
2943 int back;
2944 size_t i;
2945 size_t indx, len, lenc;
2947 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
2948 return NULL;
2950 if (b != NULL && b->value.logical != 0)
2951 back = 1;
2952 else
2953 back = 0;
2955 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
2956 &e->where);
2958 len = e->value.character.length;
2959 lenc = c->value.character.length;
2961 if (len == 0 || lenc == 0)
2963 indx = 0;
2965 else
2967 if (back == 0)
2969 indx =
2970 strcspn (e->value.character.string, c->value.character.string) + 1;
2971 if (indx > len)
2972 indx = 0;
2974 else
2976 i = 0;
2977 for (indx = len; indx > 0; indx--)
2979 for (i = 0; i < lenc; i++)
2981 if (c->value.character.string[i]
2982 == e->value.character.string[indx - 1])
2983 break;
2985 if (i < lenc)
2986 break;
2990 mpz_set_ui (result->value.integer, indx);
2991 return range_check (result, "SCAN");
2995 gfc_expr *
2996 gfc_simplify_selected_int_kind (gfc_expr * e)
2998 int i, kind, range;
2999 gfc_expr *result;
3001 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
3002 return NULL;
3004 kind = INT_MAX;
3006 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3007 if (gfc_integer_kinds[i].range >= range
3008 && gfc_integer_kinds[i].kind < kind)
3009 kind = gfc_integer_kinds[i].kind;
3011 if (kind == INT_MAX)
3012 kind = -1;
3014 result = gfc_int_expr (kind);
3015 result->where = e->where;
3017 return result;
3021 gfc_expr *
3022 gfc_simplify_selected_real_kind (gfc_expr * p, gfc_expr * q)
3024 int range, precision, i, kind, found_precision, found_range;
3025 gfc_expr *result;
3027 if (p == NULL)
3028 precision = 0;
3029 else
3031 if (p->expr_type != EXPR_CONSTANT
3032 || gfc_extract_int (p, &precision) != NULL)
3033 return NULL;
3036 if (q == NULL)
3037 range = 0;
3038 else
3040 if (q->expr_type != EXPR_CONSTANT
3041 || gfc_extract_int (q, &range) != NULL)
3042 return NULL;
3045 kind = INT_MAX;
3046 found_precision = 0;
3047 found_range = 0;
3049 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3051 if (gfc_real_kinds[i].precision >= precision)
3052 found_precision = 1;
3054 if (gfc_real_kinds[i].range >= range)
3055 found_range = 1;
3057 if (gfc_real_kinds[i].precision >= precision
3058 && gfc_real_kinds[i].range >= range && gfc_real_kinds[i].kind < kind)
3059 kind = gfc_real_kinds[i].kind;
3062 if (kind == INT_MAX)
3064 kind = 0;
3066 if (!found_precision)
3067 kind = -1;
3068 if (!found_range)
3069 kind -= 2;
3072 result = gfc_int_expr (kind);
3073 result->where = (p != NULL) ? p->where : q->where;
3075 return result;
3079 gfc_expr *
3080 gfc_simplify_set_exponent (gfc_expr * x, gfc_expr * i)
3082 gfc_expr *result;
3083 mpfr_t exp, absv, log2, pow2, frac;
3084 unsigned long exp2;
3086 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3087 return NULL;
3089 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3091 gfc_set_model_kind (x->ts.kind);
3093 if (mpfr_sgn (x->value.real) == 0)
3095 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3096 return result;
3099 mpfr_init (absv);
3100 mpfr_init (log2);
3101 mpfr_init (exp);
3102 mpfr_init (pow2);
3103 mpfr_init (frac);
3105 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3106 mpfr_log2 (log2, absv, GFC_RND_MODE);
3108 mpfr_trunc (log2, log2);
3109 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3111 /* Old exponent value, and fraction. */
3112 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3114 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3116 /* New exponent. */
3117 exp2 = (unsigned long) mpz_get_d (i->value.integer);
3118 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
3120 mpfr_clear (absv);
3121 mpfr_clear (log2);
3122 mpfr_clear (pow2);
3123 mpfr_clear (frac);
3125 return range_check (result, "SET_EXPONENT");
3129 gfc_expr *
3130 gfc_simplify_shape (gfc_expr * source)
3132 mpz_t shape[GFC_MAX_DIMENSIONS];
3133 gfc_expr *result, *e, *f;
3134 gfc_array_ref *ar;
3135 int n;
3136 try t;
3138 if (source->rank == 0 || source->expr_type != EXPR_VARIABLE)
3139 return NULL;
3141 result = gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3142 &source->where);
3144 ar = gfc_find_array_ref (source);
3146 t = gfc_array_ref_shape (ar, shape);
3148 for (n = 0; n < source->rank; n++)
3150 e = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3151 &source->where);
3153 if (t == SUCCESS)
3155 mpz_set (e->value.integer, shape[n]);
3156 mpz_clear (shape[n]);
3158 else
3160 mpz_set_ui (e->value.integer, n + 1);
3162 f = gfc_simplify_size (source, e);
3163 gfc_free_expr (e);
3164 if (f == NULL)
3166 gfc_free_expr (result);
3167 return NULL;
3169 else
3171 e = f;
3175 gfc_append_constructor (result, e);
3178 return result;
3182 gfc_expr *
3183 gfc_simplify_size (gfc_expr * array, gfc_expr * dim)
3185 mpz_t size;
3186 gfc_expr *result;
3187 int d;
3189 if (dim == NULL)
3191 if (gfc_array_size (array, &size) == FAILURE)
3192 return NULL;
3194 else
3196 if (dim->expr_type != EXPR_CONSTANT)
3197 return NULL;
3199 d = mpz_get_ui (dim->value.integer) - 1;
3200 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
3201 return NULL;
3204 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3205 &array->where);
3207 mpz_set (result->value.integer, size);
3209 return result;
3213 gfc_expr *
3214 gfc_simplify_sign (gfc_expr * x, gfc_expr * y)
3216 gfc_expr *result;
3218 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3219 return NULL;
3221 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3223 switch (x->ts.type)
3225 case BT_INTEGER:
3226 mpz_abs (result->value.integer, x->value.integer);
3227 if (mpz_sgn (y->value.integer) < 0)
3228 mpz_neg (result->value.integer, result->value.integer);
3230 break;
3232 case BT_REAL:
3233 /* TODO: Handle -0.0 and +0.0 correctly on machines that support
3234 it. */
3235 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3236 if (mpfr_sgn (y->value.real) < 0)
3237 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
3239 break;
3241 default:
3242 gfc_internal_error ("Bad type in gfc_simplify_sign");
3245 return result;
3249 gfc_expr *
3250 gfc_simplify_sin (gfc_expr * x)
3252 gfc_expr *result;
3253 mpfr_t xp, xq;
3255 if (x->expr_type != EXPR_CONSTANT)
3256 return NULL;
3258 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3260 switch (x->ts.type)
3262 case BT_REAL:
3263 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
3264 break;
3266 case BT_COMPLEX:
3267 gfc_set_model (x->value.real);
3268 mpfr_init (xp);
3269 mpfr_init (xq);
3271 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
3272 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
3273 mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
3275 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
3276 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
3277 mpfr_mul (result->value.complex.i, xp, xq, GFC_RND_MODE);
3279 mpfr_clear (xp);
3280 mpfr_clear (xq);
3281 break;
3283 default:
3284 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
3287 return range_check (result, "SIN");
3291 gfc_expr *
3292 gfc_simplify_sinh (gfc_expr * x)
3294 gfc_expr *result;
3296 if (x->expr_type != EXPR_CONSTANT)
3297 return NULL;
3299 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3301 mpfr_sinh(result->value.real, x->value.real, GFC_RND_MODE);
3303 return range_check (result, "SINH");
3307 /* The argument is always a double precision real that is converted to
3308 single precision. TODO: Rounding! */
3310 gfc_expr *
3311 gfc_simplify_sngl (gfc_expr * a)
3313 gfc_expr *result;
3315 if (a->expr_type != EXPR_CONSTANT)
3316 return NULL;
3318 result = gfc_real2real (a, gfc_default_real_kind);
3319 return range_check (result, "SNGL");
3323 gfc_expr *
3324 gfc_simplify_spacing (gfc_expr * x)
3326 gfc_expr *result;
3327 mpfr_t absv, log2;
3328 long diff;
3329 int i, p;
3331 if (x->expr_type != EXPR_CONSTANT)
3332 return NULL;
3334 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3336 p = gfc_real_kinds[i].digits;
3338 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3340 gfc_set_model_kind (x->ts.kind);
3342 if (mpfr_sgn (x->value.real) == 0)
3344 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3345 return result;
3348 mpfr_init (log2);
3349 mpfr_init (absv);
3351 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3352 mpfr_log2 (log2, absv, GFC_RND_MODE);
3353 mpfr_trunc (log2, log2);
3355 mpfr_add_ui (log2, log2, 1, GFC_RND_MODE);
3357 /* FIXME: We should be using mpfr_get_si here, but this function is
3358 not available with the version of mpfr distributed with gmp (as of
3359 2004-09-17). Replace once mpfr has been imported into the gcc cvs
3360 tree. */
3361 diff = (long)mpfr_get_d (log2, GFC_RND_MODE) - (long)p;
3362 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
3363 mpfr_mul_2si (result->value.real, result->value.real, diff, GFC_RND_MODE);
3365 mpfr_clear (log2);
3366 mpfr_clear (absv);
3368 if (mpfr_cmp (result->value.real, gfc_real_kinds[i].tiny) < 0)
3369 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3371 return range_check (result, "SPACING");
3375 gfc_expr *
3376 gfc_simplify_sqrt (gfc_expr * e)
3378 gfc_expr *result;
3379 mpfr_t ac, ad, s, t, w;
3381 if (e->expr_type != EXPR_CONSTANT)
3382 return NULL;
3384 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
3386 switch (e->ts.type)
3388 case BT_REAL:
3389 if (mpfr_cmp_si (e->value.real, 0) < 0)
3390 goto negative_arg;
3391 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
3393 break;
3395 case BT_COMPLEX:
3396 /* Formula taken from Numerical Recipes to avoid over- and
3397 underflow. */
3399 gfc_set_model (e->value.real);
3400 mpfr_init (ac);
3401 mpfr_init (ad);
3402 mpfr_init (s);
3403 mpfr_init (t);
3404 mpfr_init (w);
3406 if (mpfr_cmp_ui (e->value.complex.r, 0) == 0
3407 && mpfr_cmp_ui (e->value.complex.i, 0) == 0)
3410 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
3411 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
3412 break;
3415 mpfr_abs (ac, e->value.complex.r, GFC_RND_MODE);
3416 mpfr_abs (ad, e->value.complex.i, GFC_RND_MODE);
3418 if (mpfr_cmp (ac, ad) >= 0)
3420 mpfr_div (t, e->value.complex.i, e->value.complex.r, GFC_RND_MODE);
3421 mpfr_mul (t, t, t, GFC_RND_MODE);
3422 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3423 mpfr_sqrt (t, t, GFC_RND_MODE);
3424 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3425 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3426 mpfr_sqrt (t, t, GFC_RND_MODE);
3427 mpfr_sqrt (s, ac, GFC_RND_MODE);
3428 mpfr_mul (w, s, t, GFC_RND_MODE);
3430 else
3432 mpfr_div (s, e->value.complex.r, e->value.complex.i, GFC_RND_MODE);
3433 mpfr_mul (t, s, s, GFC_RND_MODE);
3434 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3435 mpfr_sqrt (t, t, GFC_RND_MODE);
3436 mpfr_abs (s, s, GFC_RND_MODE);
3437 mpfr_add (t, t, s, GFC_RND_MODE);
3438 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3439 mpfr_sqrt (t, t, GFC_RND_MODE);
3440 mpfr_sqrt (s, ad, GFC_RND_MODE);
3441 mpfr_mul (w, s, t, GFC_RND_MODE);
3444 if (mpfr_cmp_ui (w, 0) != 0 && mpfr_cmp_ui (e->value.complex.r, 0) >= 0)
3446 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3447 mpfr_div (result->value.complex.i, e->value.complex.i, t, GFC_RND_MODE);
3448 mpfr_set (result->value.complex.r, w, GFC_RND_MODE);
3450 else if (mpfr_cmp_ui (w, 0) != 0
3451 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3452 && mpfr_cmp_ui (e->value.complex.i, 0) >= 0)
3454 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3455 mpfr_div (result->value.complex.r, e->value.complex.i, t, GFC_RND_MODE);
3456 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3458 else if (mpfr_cmp_ui (w, 0) != 0
3459 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3460 && mpfr_cmp_ui (e->value.complex.i, 0) < 0)
3462 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3463 mpfr_div (result->value.complex.r, ad, t, GFC_RND_MODE);
3464 mpfr_neg (w, w, GFC_RND_MODE);
3465 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3467 else
3468 gfc_internal_error ("invalid complex argument of SQRT at %L",
3469 &e->where);
3471 mpfr_clear (s);
3472 mpfr_clear (t);
3473 mpfr_clear (ac);
3474 mpfr_clear (ad);
3475 mpfr_clear (w);
3477 break;
3479 default:
3480 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
3483 return range_check (result, "SQRT");
3485 negative_arg:
3486 gfc_free_expr (result);
3487 gfc_error ("Argument of SQRT at %L has a negative value", &e->where);
3488 return &gfc_bad_expr;
3492 gfc_expr *
3493 gfc_simplify_tan (gfc_expr * x)
3495 int i;
3496 gfc_expr *result;
3498 if (x->expr_type != EXPR_CONSTANT)
3499 return NULL;
3501 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3503 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3505 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
3507 return range_check (result, "TAN");
3511 gfc_expr *
3512 gfc_simplify_tanh (gfc_expr * x)
3514 gfc_expr *result;
3516 if (x->expr_type != EXPR_CONSTANT)
3517 return NULL;
3519 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3521 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
3523 return range_check (result, "TANH");
3528 gfc_expr *
3529 gfc_simplify_tiny (gfc_expr * e)
3531 gfc_expr *result;
3532 int i;
3534 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
3536 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
3537 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3539 return result;
3543 gfc_expr *
3544 gfc_simplify_trim (gfc_expr * e)
3546 gfc_expr *result;
3547 int count, i, len, lentrim;
3549 if (e->expr_type != EXPR_CONSTANT)
3550 return NULL;
3552 len = e->value.character.length;
3554 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3556 for (count = 0, i = 1; i <= len; ++i)
3558 if (e->value.character.string[len - i] == ' ')
3559 count++;
3560 else
3561 break;
3564 lentrim = len - count;
3566 result->value.character.length = lentrim;
3567 result->value.character.string = gfc_getmem (lentrim + 1);
3569 for (i = 0; i < lentrim; i++)
3570 result->value.character.string[i] = e->value.character.string[i];
3572 result->value.character.string[lentrim] = '\0'; /* For debugger */
3574 return result;
3578 gfc_expr *
3579 gfc_simplify_ubound (gfc_expr * array, gfc_expr * dim)
3581 return gfc_simplify_bound (array, dim, 1);
3585 gfc_expr *
3586 gfc_simplify_verify (gfc_expr * s, gfc_expr * set, gfc_expr * b)
3588 gfc_expr *result;
3589 int back;
3590 size_t index, len, lenset;
3591 size_t i;
3593 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
3594 return NULL;
3596 if (b != NULL && b->value.logical != 0)
3597 back = 1;
3598 else
3599 back = 0;
3601 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3602 &s->where);
3604 len = s->value.character.length;
3605 lenset = set->value.character.length;
3607 if (len == 0)
3609 mpz_set_ui (result->value.integer, 0);
3610 return result;
3613 if (back == 0)
3615 if (lenset == 0)
3617 mpz_set_ui (result->value.integer, len);
3618 return result;
3621 index =
3622 strspn (s->value.character.string, set->value.character.string) + 1;
3623 if (index > len)
3624 index = 0;
3627 else
3629 if (lenset == 0)
3631 mpz_set_ui (result->value.integer, 1);
3632 return result;
3634 for (index = len; index > 0; index --)
3636 for (i = 0; i < lenset; i++)
3638 if (s->value.character.string[index - 1]
3639 == set->value.character.string[i])
3640 break;
3642 if (i == lenset)
3643 break;
3647 mpz_set_ui (result->value.integer, index);
3648 return result;
3651 /****************** Constant simplification *****************/
3653 /* Master function to convert one constant to another. While this is
3654 used as a simplification function, it requires the destination type
3655 and kind information which is supplied by a special case in
3656 do_simplify(). */
3658 gfc_expr *
3659 gfc_convert_constant (gfc_expr * e, bt type, int kind)
3661 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
3662 gfc_constructor *head, *c, *tail = NULL;
3664 switch (e->ts.type)
3666 case BT_INTEGER:
3667 switch (type)
3669 case BT_INTEGER:
3670 f = gfc_int2int;
3671 break;
3672 case BT_REAL:
3673 f = gfc_int2real;
3674 break;
3675 case BT_COMPLEX:
3676 f = gfc_int2complex;
3677 break;
3678 default:
3679 goto oops;
3681 break;
3683 case BT_REAL:
3684 switch (type)
3686 case BT_INTEGER:
3687 f = gfc_real2int;
3688 break;
3689 case BT_REAL:
3690 f = gfc_real2real;
3691 break;
3692 case BT_COMPLEX:
3693 f = gfc_real2complex;
3694 break;
3695 default:
3696 goto oops;
3698 break;
3700 case BT_COMPLEX:
3701 switch (type)
3703 case BT_INTEGER:
3704 f = gfc_complex2int;
3705 break;
3706 case BT_REAL:
3707 f = gfc_complex2real;
3708 break;
3709 case BT_COMPLEX:
3710 f = gfc_complex2complex;
3711 break;
3713 default:
3714 goto oops;
3716 break;
3718 case BT_LOGICAL:
3719 if (type != BT_LOGICAL)
3720 goto oops;
3721 f = gfc_log2log;
3722 break;
3724 default:
3725 oops:
3726 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
3729 result = NULL;
3731 switch (e->expr_type)
3733 case EXPR_CONSTANT:
3734 result = f (e, kind);
3735 if (result == NULL)
3736 return &gfc_bad_expr;
3737 break;
3739 case EXPR_ARRAY:
3740 if (!gfc_is_constant_expr (e))
3741 break;
3743 head = NULL;
3745 for (c = e->value.constructor; c; c = c->next)
3747 if (head == NULL)
3748 head = tail = gfc_get_constructor ();
3749 else
3751 tail->next = gfc_get_constructor ();
3752 tail = tail->next;
3755 tail->where = c->where;
3757 if (c->iterator == NULL)
3758 tail->expr = f (c->expr, kind);
3759 else
3761 g = gfc_convert_constant (c->expr, type, kind);
3762 if (g == &gfc_bad_expr)
3763 return g;
3764 tail->expr = g;
3767 if (tail->expr == NULL)
3769 gfc_free_constructor (head);
3770 return NULL;
3774 result = gfc_get_expr ();
3775 result->ts.type = type;
3776 result->ts.kind = kind;
3777 result->expr_type = EXPR_ARRAY;
3778 result->value.constructor = head;
3779 result->shape = gfc_copy_shape (e->shape, e->rank);
3780 result->where = e->where;
3781 result->rank = e->rank;
3782 break;
3784 default:
3785 break;
3788 return result;
3792 /****************** Helper functions ***********************/
3794 /* Given a collating table, create the inverse table. */
3796 static void
3797 invert_table (const int *table, int *xtable)
3799 int i;
3801 for (i = 0; i < 256; i++)
3802 xtable[i] = 0;
3804 for (i = 0; i < 256; i++)
3805 xtable[table[i]] = i;
3809 void
3810 gfc_simplify_init_1 (void)
3813 invert_table (ascii_table, xascii_table);