2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* Since target arithmetic must be done on the host, there has to
23 be some way of evaluating arithmetic expressions as the host
24 would evaluate them. We use the GNU MP library and the MPFR
25 library to do arithmetic, and this file provides the interface. */
32 #include "target-memory.h"
34 /* MPFR does not have a direct replacement for mpz_set_f() from GMP.
35 It's easily implemented with a few calls though. */
38 gfc_mpfr_to_mpz (mpz_t z, mpfr_t x, locus *where)
42 if (mpfr_inf_p (x) || mpfr_nan_p (x))
44 gfc_error ("Conversion of an Infinity or Not-a-Number at %L "
50 e = mpfr_get_z_exp (z, x);
53 mpz_mul_2exp (z, z, e);
55 mpz_tdiv_q_2exp (z, z, -e);
59 /* Set the model number precision by the requested KIND. */
62 gfc_set_model_kind (int kind)
64 int index = gfc_validate_kind (BT_REAL, kind, false);
67 base2prec = gfc_real_kinds[index].digits;
68 if (gfc_real_kinds[index].radix != 2)
69 base2prec *= gfc_real_kinds[index].radix / 2;
70 mpfr_set_default_prec (base2prec);
74 /* Set the model number precision from mpfr_t x. */
77 gfc_set_model (mpfr_t x)
79 mpfr_set_default_prec (mpfr_get_prec (x));
83 /* Given an arithmetic error code, return a pointer to a string that
84 explains the error. */
87 gfc_arith_error (arith code)
94 p = _("Arithmetic OK at %L");
97 p = _("Arithmetic overflow at %L");
100 p = _("Arithmetic underflow at %L");
103 p = _("Arithmetic NaN at %L");
106 p = _("Division by zero at %L");
108 case ARITH_INCOMMENSURATE:
109 p = _("Array operands are incommensurate at %L");
111 case ARITH_ASYMMETRIC:
113 _("Integer outside symmetric range implied by Standard Fortran at %L");
116 gfc_internal_error ("gfc_arith_error(): Bad error code");
123 /* Get things ready to do math. */
126 gfc_arith_init_1 (void)
128 gfc_integer_info *int_info;
129 gfc_real_info *real_info;
133 mpfr_set_default_prec (128);
136 /* Convert the minimum and maximum values for each kind into their
137 GNU MP representation. */
138 for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
141 mpz_init (int_info->huge);
142 mpz_set_ui (int_info->huge, int_info->radix);
143 mpz_pow_ui (int_info->huge, int_info->huge, int_info->digits);
144 mpz_sub_ui (int_info->huge, int_info->huge, 1);
146 /* These are the numbers that are actually representable by the
147 target. For bases other than two, this needs to be changed. */
148 if (int_info->radix != 2)
149 gfc_internal_error ("Fix min_int calculation");
151 /* See PRs 13490 and 17912, related to integer ranges.
152 The pedantic_min_int exists for range checking when a program
153 is compiled with -pedantic, and reflects the belief that
154 Standard Fortran requires integers to be symmetrical, i.e.
155 every negative integer must have a representable positive
156 absolute value, and vice versa. */
158 mpz_init (int_info->pedantic_min_int);
159 mpz_neg (int_info->pedantic_min_int, int_info->huge);
161 mpz_init (int_info->min_int);
162 mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
165 mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
166 mpfr_log10 (a, a, GFC_RND_MODE);
168 int_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
173 for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
175 gfc_set_model_kind (real_info->kind);
180 /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
182 mpfr_init (real_info->huge);
183 mpfr_set_ui (real_info->huge, 1, GFC_RND_MODE);
184 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
185 mpfr_pow_si (a, a, -real_info->digits, GFC_RND_MODE);
186 mpfr_sub (real_info->huge, real_info->huge, a, GFC_RND_MODE);
189 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
190 mpfr_pow_ui (a, a, real_info->max_exponent - 1, GFC_RND_MODE);
192 /* (1 - b**(-p)) * b**(emax-1) */
193 mpfr_mul (real_info->huge, real_info->huge, a, GFC_RND_MODE);
195 /* (1 - b**(-p)) * b**(emax-1) * b */
196 mpfr_mul_ui (real_info->huge, real_info->huge, real_info->radix,
199 /* tiny(x) = b**(emin-1) */
200 mpfr_init (real_info->tiny);
201 mpfr_set_ui (real_info->tiny, real_info->radix, GFC_RND_MODE);
202 mpfr_pow_si (real_info->tiny, real_info->tiny,
203 real_info->min_exponent - 1, GFC_RND_MODE);
205 /* subnormal (x) = b**(emin - digit) */
206 mpfr_init (real_info->subnormal);
207 mpfr_set_ui (real_info->subnormal, real_info->radix, GFC_RND_MODE);
208 mpfr_pow_si (real_info->subnormal, real_info->subnormal,
209 real_info->min_exponent - real_info->digits, GFC_RND_MODE);
211 /* epsilon(x) = b**(1-p) */
212 mpfr_init (real_info->epsilon);
213 mpfr_set_ui (real_info->epsilon, real_info->radix, GFC_RND_MODE);
214 mpfr_pow_si (real_info->epsilon, real_info->epsilon,
215 1 - real_info->digits, GFC_RND_MODE);
217 /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
218 mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
219 mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
220 mpfr_neg (b, b, GFC_RND_MODE);
223 mpfr_min (a, a, b, GFC_RND_MODE);
225 real_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
227 /* precision(x) = int((p - 1) * log10(b)) + k */
228 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
229 mpfr_log10 (a, a, GFC_RND_MODE);
230 mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
232 real_info->precision = (int) mpfr_get_si (a, GFC_RND_MODE);
234 /* If the radix is an integral power of 10, add one to the precision. */
235 for (i = 10; i <= real_info->radix; i *= 10)
236 if (i == real_info->radix)
237 real_info->precision++;
239 mpfr_clears (a, b, NULL);
244 /* Clean up, get rid of numeric constants. */
247 gfc_arith_done_1 (void)
249 gfc_integer_info *ip;
252 for (ip = gfc_integer_kinds; ip->kind; ip++)
254 mpz_clear (ip->min_int);
255 mpz_clear (ip->pedantic_min_int);
256 mpz_clear (ip->huge);
259 for (rp = gfc_real_kinds; rp->kind; rp++)
260 mpfr_clears (rp->epsilon, rp->huge, rp->tiny, rp->subnormal, NULL);
264 /* Given a wide character value and a character kind, determine whether
265 the character is representable for that kind. */
267 gfc_check_character_range (gfc_char_t c, int kind)
269 /* As wide characters are stored as 32-bit values, they're all
270 representable in UCS=4. */
275 return c <= 255 ? true : false;
281 /* Given an integer and a kind, make sure that the integer lies within
282 the range of the kind. Returns ARITH_OK, ARITH_ASYMMETRIC or
286 gfc_check_integer_range (mpz_t p, int kind)
291 i = gfc_validate_kind (BT_INTEGER, kind, false);
296 if (mpz_cmp (p, gfc_integer_kinds[i].pedantic_min_int) < 0)
297 result = ARITH_ASYMMETRIC;
301 if (gfc_option.flag_range_check == 0)
304 if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
305 || mpz_cmp (p, gfc_integer_kinds[i].huge) > 0)
306 result = ARITH_OVERFLOW;
312 /* Given a real and a kind, make sure that the real lies within the
313 range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
317 gfc_check_real_range (mpfr_t p, int kind)
323 i = gfc_validate_kind (BT_REAL, kind, false);
327 mpfr_abs (q, p, GFC_RND_MODE);
333 if (gfc_option.flag_range_check != 0)
334 retval = ARITH_OVERFLOW;
336 else if (mpfr_nan_p (p))
338 if (gfc_option.flag_range_check != 0)
341 else if (mpfr_sgn (q) == 0)
346 else if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
348 if (gfc_option.flag_range_check == 0)
349 mpfr_set_inf (p, mpfr_sgn (p));
351 retval = ARITH_OVERFLOW;
353 else if (mpfr_cmp (q, gfc_real_kinds[i].subnormal) < 0)
355 if (gfc_option.flag_range_check == 0)
357 if (mpfr_sgn (p) < 0)
359 mpfr_set_ui (p, 0, GFC_RND_MODE);
360 mpfr_set_si (q, -1, GFC_RND_MODE);
361 mpfr_copysign (p, p, q, GFC_RND_MODE);
364 mpfr_set_ui (p, 0, GFC_RND_MODE);
367 retval = ARITH_UNDERFLOW;
369 else if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
374 /* Save current values of emin and emax. */
375 emin = mpfr_get_emin ();
376 emax = mpfr_get_emax ();
378 /* Set emin and emax for the current model number. */
379 en = gfc_real_kinds[i].min_exponent - gfc_real_kinds[i].digits + 1;
380 mpfr_set_emin ((mp_exp_t) en);
381 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[i].max_exponent);
382 mpfr_check_range (q, 0, GFC_RND_MODE);
383 mpfr_subnormalize (q, 0, GFC_RND_MODE);
385 /* Reset emin and emax. */
386 mpfr_set_emin (emin);
387 mpfr_set_emax (emax);
389 /* Copy sign if needed. */
390 if (mpfr_sgn (p) < 0)
391 mpfr_neg (p, q, GMP_RNDN);
393 mpfr_set (p, q, GMP_RNDN);
402 /* Function to return a constant expression node of a given type and kind. */
405 gfc_constant_result (bt type, int kind, locus *where)
410 gfc_internal_error ("gfc_constant_result(): locus 'where' cannot be NULL");
412 result = gfc_get_expr ();
414 result->expr_type = EXPR_CONSTANT;
415 result->ts.type = type;
416 result->ts.kind = kind;
417 result->where = *where;
422 mpz_init (result->value.integer);
426 gfc_set_model_kind (kind);
427 mpfr_init (result->value.real);
431 gfc_set_model_kind (kind);
433 mpc_init2 (result->value.complex, mpfr_get_default_prec());
435 mpfr_init (result->value.complex.r);
436 mpfr_init (result->value.complex.i);
448 /* Low-level arithmetic functions. All of these subroutines assume
449 that all operands are of the same type and return an operand of the
450 same type. The other thing about these subroutines is that they
451 can fail in various ways -- overflow, underflow, division by zero,
452 zero raised to the zero, etc. */
455 gfc_arith_not (gfc_expr *op1, gfc_expr **resultp)
459 result = gfc_constant_result (BT_LOGICAL, op1->ts.kind, &op1->where);
460 result->value.logical = !op1->value.logical;
468 gfc_arith_and (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
472 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
474 result->value.logical = op1->value.logical && op2->value.logical;
482 gfc_arith_or (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
486 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
488 result->value.logical = op1->value.logical || op2->value.logical;
496 gfc_arith_eqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
500 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
502 result->value.logical = op1->value.logical == op2->value.logical;
510 gfc_arith_neqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
514 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
516 result->value.logical = op1->value.logical != op2->value.logical;
523 /* Make sure a constant numeric expression is within the range for
524 its type and kind. Note that there's also a gfc_check_range(),
525 but that one deals with the intrinsic RANGE function. */
528 gfc_range_check (gfc_expr *e)
536 rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
540 rc = gfc_check_real_range (e->value.real, e->ts.kind);
541 if (rc == ARITH_UNDERFLOW)
542 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
543 if (rc == ARITH_OVERFLOW)
544 mpfr_set_inf (e->value.real, mpfr_sgn (e->value.real));
546 mpfr_set_nan (e->value.real);
550 rc = gfc_check_real_range (mpc_realref (e->value.complex), e->ts.kind);
551 if (rc == ARITH_UNDERFLOW)
552 mpfr_set_ui (mpc_realref (e->value.complex), 0, GFC_RND_MODE);
553 if (rc == ARITH_OVERFLOW)
554 mpfr_set_inf (mpc_realref (e->value.complex),
555 mpfr_sgn (mpc_realref (e->value.complex)));
557 mpfr_set_nan (mpc_realref (e->value.complex));
559 rc2 = gfc_check_real_range (mpc_imagref (e->value.complex), e->ts.kind);
560 if (rc == ARITH_UNDERFLOW)
561 mpfr_set_ui (mpc_imagref (e->value.complex), 0, GFC_RND_MODE);
562 if (rc == ARITH_OVERFLOW)
563 mpfr_set_inf (mpc_imagref (e->value.complex),
564 mpfr_sgn (mpc_imagref (e->value.complex)));
566 mpfr_set_nan (mpc_imagref (e->value.complex));
573 gfc_internal_error ("gfc_range_check(): Bad type");
580 /* Several of the following routines use the same set of statements to
581 check the validity of the result. Encapsulate the checking here. */
584 check_result (arith rc, gfc_expr *x, gfc_expr *r, gfc_expr **rp)
588 if (val == ARITH_UNDERFLOW)
590 if (gfc_option.warn_underflow)
591 gfc_warning (gfc_arith_error (val), &x->where);
595 if (val == ARITH_ASYMMETRIC)
597 gfc_warning (gfc_arith_error (val), &x->where);
610 /* It may seem silly to have a subroutine that actually computes the
611 unary plus of a constant, but it prevents us from making exceptions
612 in the code elsewhere. Used for unary plus and parenthesized
616 gfc_arith_identity (gfc_expr *op1, gfc_expr **resultp)
618 *resultp = gfc_copy_expr (op1);
624 gfc_arith_uminus (gfc_expr *op1, gfc_expr **resultp)
629 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
631 switch (op1->ts.type)
634 mpz_neg (result->value.integer, op1->value.integer);
638 mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
643 mpc_neg (result->value.complex, op1->value.complex, GFC_MPC_RND_MODE);
645 mpfr_neg (result->value.complex.r, op1->value.complex.r, GFC_RND_MODE);
646 mpfr_neg (result->value.complex.i, op1->value.complex.i, GFC_RND_MODE);
651 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
654 rc = gfc_range_check (result);
656 return check_result (rc, op1, result, resultp);
661 gfc_arith_plus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
666 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
668 switch (op1->ts.type)
671 mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
675 mpfr_add (result->value.real, op1->value.real, op2->value.real,
681 mpc_add (result->value.complex, op1->value.complex, op2->value.complex,
684 mpfr_add (result->value.complex.r, op1->value.complex.r,
685 op2->value.complex.r, GFC_RND_MODE);
687 mpfr_add (result->value.complex.i, op1->value.complex.i,
688 op2->value.complex.i, GFC_RND_MODE);
693 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
696 rc = gfc_range_check (result);
698 return check_result (rc, op1, result, resultp);
703 gfc_arith_minus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
708 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
710 switch (op1->ts.type)
713 mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
717 mpfr_sub (result->value.real, op1->value.real, op2->value.real,
723 mpc_sub (result->value.complex, op1->value.complex,
724 op2->value.complex, GFC_MPC_RND_MODE);
726 mpfr_sub (result->value.complex.r, op1->value.complex.r,
727 op2->value.complex.r, GFC_RND_MODE);
729 mpfr_sub (result->value.complex.i, op1->value.complex.i,
730 op2->value.complex.i, GFC_RND_MODE);
735 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
738 rc = gfc_range_check (result);
740 return check_result (rc, op1, result, resultp);
745 gfc_arith_times (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
750 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
752 switch (op1->ts.type)
755 mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
759 mpfr_mul (result->value.real, op1->value.real, op2->value.real,
764 gfc_set_model (mpc_realref (op1->value.complex));
766 mpc_mul (result->value.complex, op1->value.complex, op2->value.complex,
774 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
775 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
776 mpfr_sub (result->value.complex.r, x, y, GFC_RND_MODE);
778 mpfr_mul (x, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
779 mpfr_mul (y, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
780 mpfr_add (result->value.complex.i, x, y, GFC_RND_MODE);
782 mpfr_clears (x, y, NULL);
788 gfc_internal_error ("gfc_arith_times(): Bad basic type");
791 rc = gfc_range_check (result);
793 return check_result (rc, op1, result, resultp);
798 gfc_arith_divide (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
805 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
807 switch (op1->ts.type)
810 if (mpz_sgn (op2->value.integer) == 0)
816 mpz_tdiv_q (result->value.integer, op1->value.integer,
821 if (mpfr_sgn (op2->value.real) == 0 && gfc_option.flag_range_check == 1)
827 mpfr_div (result->value.real, op1->value.real, op2->value.real,
834 mpc_cmp_si_si (op2->value.complex, 0, 0) == 0
836 mpfr_sgn (op2->value.complex.r) == 0
837 && mpfr_sgn (op2->value.complex.i) == 0
839 && gfc_option.flag_range_check == 1)
845 gfc_set_model (mpc_realref (op1->value.complex));
848 if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0)
850 /* In Fortran, return (NaN + NaN I) for any zero divisor. See
852 mpfr_set_nan (mpc_realref (result->value.complex));
853 mpfr_set_nan (mpc_imagref (result->value.complex));
856 mpc_div (result->value.complex, op1->value.complex, op2->value.complex,
865 mpfr_mul (x, op2->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
866 mpfr_mul (y, op2->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
867 mpfr_add (div, x, y, GFC_RND_MODE);
869 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
870 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
871 mpfr_add (result->value.complex.r, x, y, GFC_RND_MODE);
872 mpfr_div (result->value.complex.r, result->value.complex.r, div,
875 mpfr_mul (x, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
876 mpfr_mul (y, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
877 mpfr_sub (result->value.complex.i, x, y, GFC_RND_MODE);
878 mpfr_div (result->value.complex.i, result->value.complex.i, div,
881 mpfr_clears (x, y, div, NULL);
887 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
891 rc = gfc_range_check (result);
893 return check_result (rc, op1, result, resultp);
897 /* Compute the reciprocal of a complex number (guaranteed nonzero). */
899 #if ! defined(HAVE_mpc_pow)
901 complex_reciprocal (gfc_expr *op)
903 gfc_set_model (mpc_realref (op->value.complex));
905 mpc_ui_div (op->value.complex, 1, op->value.complex, GFC_MPC_RND_MODE);
913 mpfr_mul (mod, op->value.complex.r, op->value.complex.r, GFC_RND_MODE);
914 mpfr_mul (tmp, op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
915 mpfr_add (mod, mod, tmp, GFC_RND_MODE);
917 mpfr_div (op->value.complex.r, op->value.complex.r, mod, GFC_RND_MODE);
919 mpfr_neg (op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
920 mpfr_div (op->value.complex.i, op->value.complex.i, mod, GFC_RND_MODE);
922 mpfr_clears (tmp, mod, NULL);
926 #endif /* ! HAVE_mpc_pow */
929 /* Raise a complex number to positive power (power > 0).
930 This function will modify the content of power.
932 Use Binary Method, which is not an optimal but a simple and reasonable
933 arithmetic. See section 4.6.3, "Evaluation of Powers" of Donald E. Knuth,
934 "Seminumerical Algorithms", Vol. 2, "The Art of Computer Programming",
935 3rd Edition, 1998. */
937 #if ! defined(HAVE_mpc_pow)
939 complex_pow (gfc_expr *result, gfc_expr *base, mpz_t power)
941 mpfr_t x_r, x_i, tmp, re, im;
943 gfc_set_model (mpc_realref (base->value.complex));
952 mpc_set_ui (result->value.complex, 1, GFC_MPC_RND_MODE);
954 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
955 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
959 mpfr_set (x_r, mpc_realref (base->value.complex), GFC_RND_MODE);
960 mpfr_set (x_i, mpc_imagref (base->value.complex), GFC_RND_MODE);
962 /* Macro for complex multiplication. We have to take care that
963 res_r/res_i and a_r/a_i can (and will) be the same variable. */
964 #define CMULT(res_r,res_i,a_r,a_i,b_r,b_i) \
965 mpfr_mul (re, a_r, b_r, GFC_RND_MODE), \
966 mpfr_mul (tmp, a_i, b_i, GFC_RND_MODE), \
967 mpfr_sub (re, re, tmp, GFC_RND_MODE), \
969 mpfr_mul (im, a_r, b_i, GFC_RND_MODE), \
970 mpfr_mul (tmp, a_i, b_r, GFC_RND_MODE), \
971 mpfr_add (res_i, im, tmp, GFC_RND_MODE), \
972 mpfr_set (res_r, re, GFC_RND_MODE)
974 #define res_r mpc_realref (result->value.complex)
975 #define res_i mpc_imagref (result->value.complex)
977 /* for (; power > 0; x *= x) */
978 for (; mpz_cmp_si (power, 0) > 0; CMULT(x_r,x_i,x_r,x_i,x_r,x_i))
980 /* if (power & 1) res = res * x; */
981 if (mpz_congruent_ui_p (power, 1, 2))
982 CMULT(res_r,res_i,res_r,res_i,x_r,x_i);
985 mpz_fdiv_q_ui (power, power, 2);
992 mpfr_clears (x_r, x_i, tmp, re, im, NULL);
994 #endif /* ! HAVE_mpc_pow */
997 /* Raise a number to a power. */
1000 arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1005 extern bool init_flag;
1008 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
1010 switch (op2->ts.type)
1013 power_sign = mpz_sgn (op2->value.integer);
1015 if (power_sign == 0)
1017 /* Handle something to the zeroth power. Since we're dealing
1018 with integral exponents, there is no ambiguity in the
1019 limiting procedure used to determine the value of 0**0. */
1020 switch (op1->ts.type)
1023 mpz_set_ui (result->value.integer, 1);
1027 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
1032 mpc_set_ui (result->value.complex, 1, GFC_MPC_RND_MODE);
1034 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
1035 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
1040 gfc_internal_error ("arith_power(): Bad base");
1045 switch (op1->ts.type)
1051 /* First, we simplify the cases of op1 == 1, 0 or -1. */
1052 if (mpz_cmp_si (op1->value.integer, 1) == 0)
1055 mpz_set_si (result->value.integer, 1);
1057 else if (mpz_cmp_si (op1->value.integer, 0) == 0)
1059 /* 0**op2 == 0, if op2 > 0
1060 0**op2 overflow, if op2 < 0 ; in that case, we
1061 set the result to 0 and return ARITH_DIV0. */
1062 mpz_set_si (result->value.integer, 0);
1063 if (mpz_cmp_si (op2->value.integer, 0) < 0)
1066 else if (mpz_cmp_si (op1->value.integer, -1) == 0)
1068 /* (-1)**op2 == (-1)**(mod(op2,2)) */
1069 unsigned int odd = mpz_fdiv_ui (op2->value.integer, 2);
1071 mpz_set_si (result->value.integer, -1);
1073 mpz_set_si (result->value.integer, 1);
1075 /* Then, we take care of op2 < 0. */
1076 else if (mpz_cmp_si (op2->value.integer, 0) < 0)
1078 /* if op2 < 0, op1**op2 == 0 because abs(op1) > 1. */
1079 mpz_set_si (result->value.integer, 0);
1081 else if (gfc_extract_int (op2, &power) != NULL)
1083 /* If op2 doesn't fit in an int, the exponentiation will
1084 overflow, because op2 > 0 and abs(op1) > 1. */
1087 i = gfc_validate_kind (BT_INTEGER, result->ts.kind, false);
1089 if (gfc_option.flag_range_check)
1090 rc = ARITH_OVERFLOW;
1092 /* Still, we want to give the same value as the
1095 mpz_add_ui (max, gfc_integer_kinds[i].huge, 1);
1096 mpz_mul_ui (max, max, 2);
1097 mpz_powm (result->value.integer, op1->value.integer,
1098 op2->value.integer, max);
1102 mpz_pow_ui (result->value.integer, op1->value.integer,
1108 mpfr_pow_z (result->value.real, op1->value.real,
1109 op2->value.integer, GFC_RND_MODE);
1114 #ifdef HAVE_mpc_pow_z
1115 mpc_pow_z (result->value.complex, op1->value.complex,
1116 op2->value.integer, GFC_MPC_RND_MODE);
1117 #elif defined(HAVE_mpc_pow)
1119 gfc_set_model (mpc_realref (op1->value.complex));
1120 mpc_init2 (apower, mpfr_get_default_prec());
1121 mpc_set_z (apower, op2->value.integer, GFC_MPC_RND_MODE);
1122 mpc_pow(result->value.complex, op1->value.complex, apower,
1128 /* Compute op1**abs(op2) */
1130 mpz_abs (apower, op2->value.integer);
1131 complex_pow (result, op1, apower);
1134 /* If (op2 < 0), compute the inverse. */
1136 complex_reciprocal (result);
1137 #endif /* HAVE_mpc_pow */
1151 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1152 "exponent in an initialization "
1153 "expression at %L", &op2->where) == FAILURE)
1154 return ARITH_PROHIBIT;
1157 if (mpfr_cmp_si (op1->value.real, 0) < 0)
1159 gfc_error ("Raising a negative REAL at %L to "
1160 "a REAL power is prohibited", &op1->where);
1162 return ARITH_PROHIBIT;
1165 mpfr_pow (result->value.real, op1->value.real, op2->value.real,
1173 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1174 "exponent in an initialization "
1175 "expression at %L", &op2->where) == FAILURE)
1176 return ARITH_PROHIBIT;
1180 mpc_pow (result->value.complex, op1->value.complex,
1181 op2->value.complex, GFC_MPC_RND_MODE);
1186 gfc_set_model (mpc_realref (op1->value.complex));
1191 mpc_abs (r, op1->value.complex, GFC_RND_MODE);
1193 mpfr_hypot (r, op1->value.complex.r, op1->value.complex.i,
1196 if (mpfr_cmp_si (r, 0) == 0)
1199 mpc_set_ui (result->value.complex, 0, GFC_MPC_RND_MODE);
1201 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
1202 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
1207 mpfr_log (r, r, GFC_RND_MODE);
1212 mpc_arg (t, op1->value.complex, GFC_RND_MODE);
1214 mpfr_atan2 (t, op1->value.complex.i, op1->value.complex.r,
1221 mpfr_mul (x, mpc_realref (op2->value.complex), r, GFC_RND_MODE);
1222 mpfr_mul (y, mpc_imagref (op2->value.complex), t, GFC_RND_MODE);
1223 mpfr_sub (x, x, y, GFC_RND_MODE);
1224 mpfr_exp (x, x, GFC_RND_MODE);
1226 mpfr_mul (y, mpc_realref (op2->value.complex), t, GFC_RND_MODE);
1227 mpfr_mul (t, mpc_imagref (op2->value.complex), r, GFC_RND_MODE);
1228 mpfr_add (y, y, t, GFC_RND_MODE);
1229 mpfr_cos (t, y, GFC_RND_MODE);
1230 mpfr_sin (y, y, GFC_RND_MODE);
1231 mpfr_mul (mpc_realref (result->value.complex), x, t, GFC_RND_MODE);
1232 mpfr_mul (mpc_imagref (result->value.complex), x, y, GFC_RND_MODE);
1233 mpfr_clears (r, t, x, y, NULL);
1235 #endif /* HAVE_mpc_pow */
1239 gfc_internal_error ("arith_power(): unknown type");
1243 rc = gfc_range_check (result);
1245 return check_result (rc, op1, result, resultp);
1249 /* Concatenate two string constants. */
1252 gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1257 gcc_assert (op1->ts.kind == op2->ts.kind);
1258 result = gfc_constant_result (BT_CHARACTER, op1->ts.kind,
1261 len = op1->value.character.length + op2->value.character.length;
1263 result->value.character.string = gfc_get_wide_string (len + 1);
1264 result->value.character.length = len;
1266 memcpy (result->value.character.string, op1->value.character.string,
1267 op1->value.character.length * sizeof (gfc_char_t));
1269 memcpy (&result->value.character.string[op1->value.character.length],
1270 op2->value.character.string,
1271 op2->value.character.length * sizeof (gfc_char_t));
1273 result->value.character.string[len] = '\0';
1280 /* Comparison between real values; returns 0 if (op1 .op. op2) is true.
1281 This function mimics mpfr_cmp but takes NaN into account. */
1284 compare_real (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1290 rc = mpfr_equal_p (op1->value.real, op2->value.real) ? 0 : 1;
1293 rc = mpfr_greater_p (op1->value.real, op2->value.real) ? 1 : -1;
1296 rc = mpfr_greaterequal_p (op1->value.real, op2->value.real) ? 1 : -1;
1299 rc = mpfr_less_p (op1->value.real, op2->value.real) ? -1 : 1;
1302 rc = mpfr_lessequal_p (op1->value.real, op2->value.real) ? -1 : 1;
1305 gfc_internal_error ("compare_real(): Bad operator");
1311 /* Comparison operators. Assumes that the two expression nodes
1312 contain two constants of the same type. The op argument is
1313 needed to handle NaN correctly. */
1316 gfc_compare_expr (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1320 switch (op1->ts.type)
1323 rc = mpz_cmp (op1->value.integer, op2->value.integer);
1327 rc = compare_real (op1, op2, op);
1331 rc = gfc_compare_string (op1, op2);
1335 rc = ((!op1->value.logical && op2->value.logical)
1336 || (op1->value.logical && !op2->value.logical));
1340 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1347 /* Compare a pair of complex numbers. Naturally, this is only for
1348 equality and inequality. */
1351 compare_complex (gfc_expr *op1, gfc_expr *op2)
1354 return mpc_cmp (op1->value.complex, op2->value.complex) == 0;
1356 return (mpfr_equal_p (op1->value.complex.r, op2->value.complex.r)
1357 && mpfr_equal_p (op1->value.complex.i, op2->value.complex.i));
1362 /* Given two constant strings and the inverse collating sequence, compare the
1363 strings. We return -1 for a < b, 0 for a == b and 1 for a > b.
1364 We use the processor's default collating sequence. */
1367 gfc_compare_string (gfc_expr *a, gfc_expr *b)
1369 int len, alen, blen, i;
1372 alen = a->value.character.length;
1373 blen = b->value.character.length;
1375 len = MAX(alen, blen);
1377 for (i = 0; i < len; i++)
1379 ac = ((i < alen) ? a->value.character.string[i] : ' ');
1380 bc = ((i < blen) ? b->value.character.string[i] : ' ');
1388 /* Strings are equal */
1394 gfc_compare_with_Cstring (gfc_expr *a, const char *b, bool case_sensitive)
1396 int len, alen, blen, i;
1399 alen = a->value.character.length;
1402 len = MAX(alen, blen);
1404 for (i = 0; i < len; i++)
1406 ac = ((i < alen) ? a->value.character.string[i] : ' ');
1407 bc = ((i < blen) ? b[i] : ' ');
1409 if (!case_sensitive)
1421 /* Strings are equal */
1426 /* Specific comparison subroutines. */
1429 gfc_arith_eq (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1433 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1435 result->value.logical = (op1->ts.type == BT_COMPLEX)
1436 ? compare_complex (op1, op2)
1437 : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) == 0);
1445 gfc_arith_ne (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1449 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1451 result->value.logical = (op1->ts.type == BT_COMPLEX)
1452 ? !compare_complex (op1, op2)
1453 : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) != 0);
1461 gfc_arith_gt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1465 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1467 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GT) > 0);
1475 gfc_arith_ge (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1479 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1481 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GE) >= 0);
1489 gfc_arith_lt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1493 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1495 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LT) < 0);
1503 gfc_arith_le (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1507 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1509 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LE) <= 0);
1517 reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr *op,
1520 gfc_constructor *c, *head;
1524 if (op->expr_type == EXPR_CONSTANT)
1525 return eval (op, result);
1528 head = gfc_copy_constructor (op->value.constructor);
1530 for (c = head; c; c = c->next)
1532 rc = reduce_unary (eval, c->expr, &r);
1537 gfc_replace_expr (c->expr, r);
1541 gfc_free_constructor (head);
1544 r = gfc_get_expr ();
1545 r->expr_type = EXPR_ARRAY;
1546 r->value.constructor = head;
1547 r->shape = gfc_copy_shape (op->shape, op->rank);
1549 r->ts = head->expr->ts;
1550 r->where = op->where;
1561 reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1562 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1564 gfc_constructor *c, *head;
1568 head = gfc_copy_constructor (op1->value.constructor);
1571 for (c = head; c; c = c->next)
1573 if (c->expr->expr_type == EXPR_CONSTANT)
1574 rc = eval (c->expr, op2, &r);
1576 rc = reduce_binary_ac (eval, c->expr, op2, &r);
1581 gfc_replace_expr (c->expr, r);
1585 gfc_free_constructor (head);
1588 r = gfc_get_expr ();
1589 r->expr_type = EXPR_ARRAY;
1590 r->value.constructor = head;
1591 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1593 r->ts = head->expr->ts;
1594 r->where = op1->where;
1595 r->rank = op1->rank;
1605 reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1606 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1608 gfc_constructor *c, *head;
1612 head = gfc_copy_constructor (op2->value.constructor);
1615 for (c = head; c; c = c->next)
1617 if (c->expr->expr_type == EXPR_CONSTANT)
1618 rc = eval (op1, c->expr, &r);
1620 rc = reduce_binary_ca (eval, op1, c->expr, &r);
1625 gfc_replace_expr (c->expr, r);
1629 gfc_free_constructor (head);
1632 r = gfc_get_expr ();
1633 r->expr_type = EXPR_ARRAY;
1634 r->value.constructor = head;
1635 r->shape = gfc_copy_shape (op2->shape, op2->rank);
1637 r->ts = head->expr->ts;
1638 r->where = op2->where;
1639 r->rank = op2->rank;
1648 /* We need a forward declaration of reduce_binary. */
1649 static arith reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1650 gfc_expr *op1, gfc_expr *op2, gfc_expr **result);
1654 reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1655 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1657 gfc_constructor *c, *d, *head;
1661 head = gfc_copy_constructor (op1->value.constructor);
1664 d = op2->value.constructor;
1666 if (gfc_check_conformance (op1, op2, "elemental binary operation")
1668 rc = ARITH_INCOMMENSURATE;
1671 for (c = head; c; c = c->next, d = d->next)
1675 rc = ARITH_INCOMMENSURATE;
1679 rc = reduce_binary (eval, c->expr, d->expr, &r);
1683 gfc_replace_expr (c->expr, r);
1687 rc = ARITH_INCOMMENSURATE;
1691 gfc_free_constructor (head);
1694 r = gfc_get_expr ();
1695 r->expr_type = EXPR_ARRAY;
1696 r->value.constructor = head;
1697 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1699 r->ts = head->expr->ts;
1700 r->where = op1->where;
1701 r->rank = op1->rank;
1711 reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1712 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1714 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1715 return eval (op1, op2, result);
1717 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1718 return reduce_binary_ca (eval, op1, op2, result);
1720 if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1721 return reduce_binary_ac (eval, op1, op2, result);
1723 return reduce_binary_aa (eval, op1, op2, result);
1729 arith (*f2)(gfc_expr *, gfc_expr **);
1730 arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1734 /* High level arithmetic subroutines. These subroutines go into
1735 eval_intrinsic(), which can do one of several things to its
1736 operands. If the operands are incompatible with the intrinsic
1737 operation, we return a node pointing to the operands and hope that
1738 an operator interface is found during resolution.
1740 If the operands are compatible and are constants, then we try doing
1741 the arithmetic. We also handle the cases where either or both
1742 operands are array constructors. */
1745 eval_intrinsic (gfc_intrinsic_op op,
1746 eval_f eval, gfc_expr *op1, gfc_expr *op2)
1748 gfc_expr temp, *result;
1752 gfc_clear_ts (&temp.ts);
1758 if (op1->ts.type != BT_LOGICAL)
1761 temp.ts.type = BT_LOGICAL;
1762 temp.ts.kind = gfc_default_logical_kind;
1766 /* Logical binary operators */
1769 case INTRINSIC_NEQV:
1771 if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1774 temp.ts.type = BT_LOGICAL;
1775 temp.ts.kind = gfc_default_logical_kind;
1780 case INTRINSIC_UPLUS:
1781 case INTRINSIC_UMINUS:
1782 if (!gfc_numeric_ts (&op1->ts))
1789 case INTRINSIC_PARENTHESES:
1794 /* Additional restrictions for ordering relations. */
1796 case INTRINSIC_GE_OS:
1798 case INTRINSIC_LT_OS:
1800 case INTRINSIC_LE_OS:
1802 case INTRINSIC_GT_OS:
1803 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1805 temp.ts.type = BT_LOGICAL;
1806 temp.ts.kind = gfc_default_logical_kind;
1812 case INTRINSIC_EQ_OS:
1814 case INTRINSIC_NE_OS:
1815 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1818 temp.ts.type = BT_LOGICAL;
1819 temp.ts.kind = gfc_default_logical_kind;
1821 /* If kind mismatch, exit and we'll error out later. */
1822 if (op1->ts.kind != op2->ts.kind)
1829 /* Numeric binary */
1830 case INTRINSIC_PLUS:
1831 case INTRINSIC_MINUS:
1832 case INTRINSIC_TIMES:
1833 case INTRINSIC_DIVIDE:
1834 case INTRINSIC_POWER:
1835 if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1838 /* Insert any necessary type conversions to make the operands
1841 temp.expr_type = EXPR_OP;
1842 gfc_clear_ts (&temp.ts);
1843 temp.value.op.op = op;
1845 temp.value.op.op1 = op1;
1846 temp.value.op.op2 = op2;
1848 gfc_type_convert_binary (&temp);
1850 if (op == INTRINSIC_EQ || op == INTRINSIC_NE
1851 || op == INTRINSIC_GE || op == INTRINSIC_GT
1852 || op == INTRINSIC_LE || op == INTRINSIC_LT
1853 || op == INTRINSIC_EQ_OS || op == INTRINSIC_NE_OS
1854 || op == INTRINSIC_GE_OS || op == INTRINSIC_GT_OS
1855 || op == INTRINSIC_LE_OS || op == INTRINSIC_LT_OS)
1857 temp.ts.type = BT_LOGICAL;
1858 temp.ts.kind = gfc_default_logical_kind;
1864 /* Character binary */
1865 case INTRINSIC_CONCAT:
1866 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
1867 || op1->ts.kind != op2->ts.kind)
1870 temp.ts.type = BT_CHARACTER;
1871 temp.ts.kind = op1->ts.kind;
1875 case INTRINSIC_USER:
1879 gfc_internal_error ("eval_intrinsic(): Bad operator");
1882 if (op1->expr_type != EXPR_CONSTANT
1883 && (op1->expr_type != EXPR_ARRAY
1884 || !gfc_is_constant_expr (op1) || !gfc_expanded_ac (op1)))
1888 && op2->expr_type != EXPR_CONSTANT
1889 && (op2->expr_type != EXPR_ARRAY
1890 || !gfc_is_constant_expr (op2) || !gfc_expanded_ac (op2)))
1894 rc = reduce_unary (eval.f2, op1, &result);
1896 rc = reduce_binary (eval.f3, op1, op2, &result);
1899 /* Something went wrong. */
1900 if (op == INTRINSIC_POWER && rc == ARITH_PROHIBIT)
1905 gfc_error (gfc_arith_error (rc), &op1->where);
1909 gfc_free_expr (op1);
1910 gfc_free_expr (op2);
1914 /* Create a run-time expression. */
1915 result = gfc_get_expr ();
1916 result->ts = temp.ts;
1918 result->expr_type = EXPR_OP;
1919 result->value.op.op = op;
1921 result->value.op.op1 = op1;
1922 result->value.op.op2 = op2;
1924 result->where = op1->where;
1930 /* Modify type of expression for zero size array. */
1933 eval_type_intrinsic0 (gfc_intrinsic_op iop, gfc_expr *op)
1936 gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1941 case INTRINSIC_GE_OS:
1943 case INTRINSIC_LT_OS:
1945 case INTRINSIC_LE_OS:
1947 case INTRINSIC_GT_OS:
1949 case INTRINSIC_EQ_OS:
1951 case INTRINSIC_NE_OS:
1952 op->ts.type = BT_LOGICAL;
1953 op->ts.kind = gfc_default_logical_kind;
1964 /* Return nonzero if the expression is a zero size array. */
1967 gfc_zero_size_array (gfc_expr *e)
1969 if (e->expr_type != EXPR_ARRAY)
1972 return e->value.constructor == NULL;
1976 /* Reduce a binary expression where at least one of the operands
1977 involves a zero-length array. Returns NULL if neither of the
1978 operands is a zero-length array. */
1981 reduce_binary0 (gfc_expr *op1, gfc_expr *op2)
1983 if (gfc_zero_size_array (op1))
1985 gfc_free_expr (op2);
1989 if (gfc_zero_size_array (op2))
1991 gfc_free_expr (op1);
2000 eval_intrinsic_f2 (gfc_intrinsic_op op,
2001 arith (*eval) (gfc_expr *, gfc_expr **),
2002 gfc_expr *op1, gfc_expr *op2)
2009 if (gfc_zero_size_array (op1))
2010 return eval_type_intrinsic0 (op, op1);
2014 result = reduce_binary0 (op1, op2);
2016 return eval_type_intrinsic0 (op, result);
2020 return eval_intrinsic (op, f, op1, op2);
2025 eval_intrinsic_f3 (gfc_intrinsic_op op,
2026 arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
2027 gfc_expr *op1, gfc_expr *op2)
2032 result = reduce_binary0 (op1, op2);
2034 return eval_type_intrinsic0(op, result);
2037 return eval_intrinsic (op, f, op1, op2);
2042 gfc_parentheses (gfc_expr *op)
2044 if (gfc_is_constant_expr (op))
2047 return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity,
2052 gfc_uplus (gfc_expr *op)
2054 return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_identity, op, NULL);
2059 gfc_uminus (gfc_expr *op)
2061 return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
2066 gfc_add (gfc_expr *op1, gfc_expr *op2)
2068 return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
2073 gfc_subtract (gfc_expr *op1, gfc_expr *op2)
2075 return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
2080 gfc_multiply (gfc_expr *op1, gfc_expr *op2)
2082 return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
2087 gfc_divide (gfc_expr *op1, gfc_expr *op2)
2089 return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
2094 gfc_power (gfc_expr *op1, gfc_expr *op2)
2096 return eval_intrinsic_f3 (INTRINSIC_POWER, arith_power, op1, op2);
2101 gfc_concat (gfc_expr *op1, gfc_expr *op2)
2103 return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
2108 gfc_and (gfc_expr *op1, gfc_expr *op2)
2110 return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
2115 gfc_or (gfc_expr *op1, gfc_expr *op2)
2117 return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
2122 gfc_not (gfc_expr *op1)
2124 return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
2129 gfc_eqv (gfc_expr *op1, gfc_expr *op2)
2131 return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
2136 gfc_neqv (gfc_expr *op1, gfc_expr *op2)
2138 return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
2143 gfc_eq (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2145 return eval_intrinsic_f3 (op, gfc_arith_eq, op1, op2);
2150 gfc_ne (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2152 return eval_intrinsic_f3 (op, gfc_arith_ne, op1, op2);
2157 gfc_gt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2159 return eval_intrinsic_f3 (op, gfc_arith_gt, op1, op2);
2164 gfc_ge (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2166 return eval_intrinsic_f3 (op, gfc_arith_ge, op1, op2);
2171 gfc_lt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2173 return eval_intrinsic_f3 (op, gfc_arith_lt, op1, op2);
2178 gfc_le (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2180 return eval_intrinsic_f3 (op, gfc_arith_le, op1, op2);
2184 /* Convert an integer string to an expression node. */
2187 gfc_convert_integer (const char *buffer, int kind, int radix, locus *where)
2192 e = gfc_constant_result (BT_INTEGER, kind, where);
2193 /* A leading plus is allowed, but not by mpz_set_str. */
2194 if (buffer[0] == '+')
2198 mpz_set_str (e->value.integer, t, radix);
2204 /* Convert a real string to an expression node. */
2207 gfc_convert_real (const char *buffer, int kind, locus *where)
2211 e = gfc_constant_result (BT_REAL, kind, where);
2212 mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
2218 /* Convert a pair of real, constant expression nodes to a single
2219 complex expression node. */
2222 gfc_convert_complex (gfc_expr *real, gfc_expr *imag, int kind)
2226 e = gfc_constant_result (BT_COMPLEX, kind, &real->where);
2228 mpc_set_fr_fr (e->value.complex, real->value.real, imag->value.real,
2231 mpfr_set (e->value.complex.r, real->value.real, GFC_RND_MODE);
2232 mpfr_set (e->value.complex.i, imag->value.real, GFC_RND_MODE);
2239 /******* Simplification of intrinsic functions with constant arguments *****/
2242 /* Deal with an arithmetic error. */
2245 arith_error (arith rc, gfc_typespec *from, gfc_typespec *to, locus *where)
2250 gfc_error ("Arithmetic OK converting %s to %s at %L",
2251 gfc_typename (from), gfc_typename (to), where);
2253 case ARITH_OVERFLOW:
2254 gfc_error ("Arithmetic overflow converting %s to %s at %L. This check "
2255 "can be disabled with the option -fno-range-check",
2256 gfc_typename (from), gfc_typename (to), where);
2258 case ARITH_UNDERFLOW:
2259 gfc_error ("Arithmetic underflow converting %s to %s at %L. This check "
2260 "can be disabled with the option -fno-range-check",
2261 gfc_typename (from), gfc_typename (to), where);
2264 gfc_error ("Arithmetic NaN converting %s to %s at %L. This check "
2265 "can be disabled with the option -fno-range-check",
2266 gfc_typename (from), gfc_typename (to), where);
2269 gfc_error ("Division by zero converting %s to %s at %L",
2270 gfc_typename (from), gfc_typename (to), where);
2272 case ARITH_INCOMMENSURATE:
2273 gfc_error ("Array operands are incommensurate converting %s to %s at %L",
2274 gfc_typename (from), gfc_typename (to), where);
2276 case ARITH_ASYMMETRIC:
2277 gfc_error ("Integer outside symmetric range implied by Standard Fortran"
2278 " converting %s to %s at %L",
2279 gfc_typename (from), gfc_typename (to), where);
2282 gfc_internal_error ("gfc_arith_error(): Bad error code");
2285 /* TODO: Do something about the error, i.e., throw exception, return
2290 /* Convert integers to integers. */
2293 gfc_int2int (gfc_expr *src, int kind)
2298 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2300 mpz_set (result->value.integer, src->value.integer);
2302 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2304 if (rc == ARITH_ASYMMETRIC)
2306 gfc_warning (gfc_arith_error (rc), &src->where);
2310 arith_error (rc, &src->ts, &result->ts, &src->where);
2311 gfc_free_expr (result);
2320 /* Convert integers to reals. */
2323 gfc_int2real (gfc_expr *src, int kind)
2328 result = gfc_constant_result (BT_REAL, kind, &src->where);
2330 mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
2332 if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
2334 arith_error (rc, &src->ts, &result->ts, &src->where);
2335 gfc_free_expr (result);
2343 /* Convert default integer to default complex. */
2346 gfc_int2complex (gfc_expr *src, int kind)
2351 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2354 mpc_set_z (result->value.complex, src->value.integer, GFC_MPC_RND_MODE);
2356 mpfr_set_z (result->value.complex.r, src->value.integer, GFC_RND_MODE);
2357 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2360 if ((rc = gfc_check_real_range (mpc_realref (result->value.complex), kind))
2363 arith_error (rc, &src->ts, &result->ts, &src->where);
2364 gfc_free_expr (result);
2372 /* Convert default real to default integer. */
2375 gfc_real2int (gfc_expr *src, int kind)
2380 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2382 gfc_mpfr_to_mpz (result->value.integer, src->value.real, &src->where);
2384 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2386 arith_error (rc, &src->ts, &result->ts, &src->where);
2387 gfc_free_expr (result);
2395 /* Convert real to real. */
2398 gfc_real2real (gfc_expr *src, int kind)
2403 result = gfc_constant_result (BT_REAL, kind, &src->where);
2405 mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
2407 rc = gfc_check_real_range (result->value.real, kind);
2409 if (rc == ARITH_UNDERFLOW)
2411 if (gfc_option.warn_underflow)
2412 gfc_warning (gfc_arith_error (rc), &src->where);
2413 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2415 else if (rc != ARITH_OK)
2417 arith_error (rc, &src->ts, &result->ts, &src->where);
2418 gfc_free_expr (result);
2426 /* Convert real to complex. */
2429 gfc_real2complex (gfc_expr *src, int kind)
2434 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2437 mpc_set_fr (result->value.complex, src->value.real, GFC_MPC_RND_MODE);
2439 mpfr_set (result->value.complex.r, src->value.real, GFC_RND_MODE);
2440 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2443 rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
2445 if (rc == ARITH_UNDERFLOW)
2447 if (gfc_option.warn_underflow)
2448 gfc_warning (gfc_arith_error (rc), &src->where);
2449 mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
2451 else if (rc != ARITH_OK)
2453 arith_error (rc, &src->ts, &result->ts, &src->where);
2454 gfc_free_expr (result);
2462 /* Convert complex to integer. */
2465 gfc_complex2int (gfc_expr *src, int kind)
2470 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2472 gfc_mpfr_to_mpz (result->value.integer, mpc_realref (src->value.complex),
2475 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2477 arith_error (rc, &src->ts, &result->ts, &src->where);
2478 gfc_free_expr (result);
2486 /* Convert complex to real. */
2489 gfc_complex2real (gfc_expr *src, int kind)
2494 result = gfc_constant_result (BT_REAL, kind, &src->where);
2497 mpc_real (result->value.real, src->value.complex, GFC_RND_MODE);
2499 mpfr_set (result->value.real, src->value.complex.r, GFC_RND_MODE);
2502 rc = gfc_check_real_range (result->value.real, kind);
2504 if (rc == ARITH_UNDERFLOW)
2506 if (gfc_option.warn_underflow)
2507 gfc_warning (gfc_arith_error (rc), &src->where);
2508 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2512 arith_error (rc, &src->ts, &result->ts, &src->where);
2513 gfc_free_expr (result);
2521 /* Convert complex to complex. */
2524 gfc_complex2complex (gfc_expr *src, int kind)
2529 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2532 mpc_set (result->value.complex, src->value.complex, GFC_MPC_RND_MODE);
2534 mpfr_set (result->value.complex.r, src->value.complex.r, GFC_RND_MODE);
2535 mpfr_set (result->value.complex.i, src->value.complex.i, GFC_RND_MODE);
2538 rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
2540 if (rc == ARITH_UNDERFLOW)
2542 if (gfc_option.warn_underflow)
2543 gfc_warning (gfc_arith_error (rc), &src->where);
2544 mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
2546 else if (rc != ARITH_OK)
2548 arith_error (rc, &src->ts, &result->ts, &src->where);
2549 gfc_free_expr (result);
2553 rc = gfc_check_real_range (mpc_imagref (result->value.complex), kind);
2555 if (rc == ARITH_UNDERFLOW)
2557 if (gfc_option.warn_underflow)
2558 gfc_warning (gfc_arith_error (rc), &src->where);
2559 mpfr_set_ui (mpc_imagref (result->value.complex), 0, GFC_RND_MODE);
2561 else if (rc != ARITH_OK)
2563 arith_error (rc, &src->ts, &result->ts, &src->where);
2564 gfc_free_expr (result);
2572 /* Logical kind conversion. */
2575 gfc_log2log (gfc_expr *src, int kind)
2579 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2580 result->value.logical = src->value.logical;
2586 /* Convert logical to integer. */
2589 gfc_log2int (gfc_expr *src, int kind)
2593 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2594 mpz_set_si (result->value.integer, src->value.logical);
2600 /* Convert integer to logical. */
2603 gfc_int2log (gfc_expr *src, int kind)
2607 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2608 result->value.logical = (mpz_cmp_si (src->value.integer, 0) != 0);
2614 /* Helper function to set the representation in a Hollerith conversion.
2615 This assumes that the ts.type and ts.kind of the result have already
2619 hollerith2representation (gfc_expr *result, gfc_expr *src)
2621 int src_len, result_len;
2623 src_len = src->representation.length;
2624 result_len = gfc_target_expr_size (result);
2626 if (src_len > result_len)
2628 gfc_warning ("The Hollerith constant at %L is too long to convert to %s",
2629 &src->where, gfc_typename(&result->ts));
2632 result->representation.string = XCNEWVEC (char, result_len + 1);
2633 memcpy (result->representation.string, src->representation.string,
2634 MIN (result_len, src_len));
2636 if (src_len < result_len)
2637 memset (&result->representation.string[src_len], ' ', result_len - src_len);
2639 result->representation.string[result_len] = '\0'; /* For debugger */
2640 result->representation.length = result_len;
2644 /* Convert Hollerith to integer. The constant will be padded or truncated. */
2647 gfc_hollerith2int (gfc_expr *src, int kind)
2651 result = gfc_get_expr ();
2652 result->expr_type = EXPR_CONSTANT;
2653 result->ts.type = BT_INTEGER;
2654 result->ts.kind = kind;
2655 result->where = src->where;
2657 hollerith2representation (result, src);
2658 gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
2659 result->representation.length, result->value.integer);
2665 /* Convert Hollerith to real. The constant will be padded or truncated. */
2668 gfc_hollerith2real (gfc_expr *src, int kind)
2672 result = gfc_get_expr ();
2673 result->expr_type = EXPR_CONSTANT;
2674 result->ts.type = BT_REAL;
2675 result->ts.kind = kind;
2676 result->where = src->where;
2678 hollerith2representation (result, src);
2679 gfc_interpret_float (kind, (unsigned char *) result->representation.string,
2680 result->representation.length, result->value.real);
2686 /* Convert Hollerith to complex. The constant will be padded or truncated. */
2689 gfc_hollerith2complex (gfc_expr *src, int kind)
2693 result = gfc_get_expr ();
2694 result->expr_type = EXPR_CONSTANT;
2695 result->ts.type = BT_COMPLEX;
2696 result->ts.kind = kind;
2697 result->where = src->where;
2699 hollerith2representation (result, src);
2700 gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
2701 result->representation.length,
2703 result->value.complex
2705 result->value.complex.r, result->value.complex.i
2713 /* Convert Hollerith to character. */
2716 gfc_hollerith2character (gfc_expr *src, int kind)
2720 result = gfc_copy_expr (src);
2721 result->ts.type = BT_CHARACTER;
2722 result->ts.kind = kind;
2724 result->value.character.length = result->representation.length;
2725 result->value.character.string
2726 = gfc_char_to_widechar (result->representation.string);
2732 /* Convert Hollerith to logical. The constant will be padded or truncated. */
2735 gfc_hollerith2logical (gfc_expr *src, int kind)
2739 result = gfc_get_expr ();
2740 result->expr_type = EXPR_CONSTANT;
2741 result->ts.type = BT_LOGICAL;
2742 result->ts.kind = kind;
2743 result->where = src->where;
2745 hollerith2representation (result, src);
2746 gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
2747 result->representation.length, &result->value.logical);