2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
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);
432 mpfr_init (result->value.complex.r);
433 mpfr_init (result->value.complex.i);
444 /* Low-level arithmetic functions. All of these subroutines assume
445 that all operands are of the same type and return an operand of the
446 same type. The other thing about these subroutines is that they
447 can fail in various ways -- overflow, underflow, division by zero,
448 zero raised to the zero, etc. */
451 gfc_arith_not (gfc_expr *op1, gfc_expr **resultp)
455 result = gfc_constant_result (BT_LOGICAL, op1->ts.kind, &op1->where);
456 result->value.logical = !op1->value.logical;
464 gfc_arith_and (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
468 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
470 result->value.logical = op1->value.logical && op2->value.logical;
478 gfc_arith_or (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
482 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
484 result->value.logical = op1->value.logical || op2->value.logical;
492 gfc_arith_eqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
496 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
498 result->value.logical = op1->value.logical == op2->value.logical;
506 gfc_arith_neqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
510 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
512 result->value.logical = op1->value.logical != op2->value.logical;
519 /* Make sure a constant numeric expression is within the range for
520 its type and kind. Note that there's also a gfc_check_range(),
521 but that one deals with the intrinsic RANGE function. */
524 gfc_range_check (gfc_expr *e)
532 rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
536 rc = gfc_check_real_range (e->value.real, e->ts.kind);
537 if (rc == ARITH_UNDERFLOW)
538 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
539 if (rc == ARITH_OVERFLOW)
540 mpfr_set_inf (e->value.real, mpfr_sgn (e->value.real));
542 mpfr_set_nan (e->value.real);
546 rc = gfc_check_real_range (e->value.complex.r, e->ts.kind);
547 if (rc == ARITH_UNDERFLOW)
548 mpfr_set_ui (e->value.complex.r, 0, GFC_RND_MODE);
549 if (rc == ARITH_OVERFLOW)
550 mpfr_set_inf (e->value.complex.r, mpfr_sgn (e->value.complex.r));
552 mpfr_set_nan (e->value.complex.r);
554 rc2 = gfc_check_real_range (e->value.complex.i, e->ts.kind);
555 if (rc == ARITH_UNDERFLOW)
556 mpfr_set_ui (e->value.complex.i, 0, GFC_RND_MODE);
557 if (rc == ARITH_OVERFLOW)
558 mpfr_set_inf (e->value.complex.i, mpfr_sgn (e->value.complex.i));
560 mpfr_set_nan (e->value.complex.i);
567 gfc_internal_error ("gfc_range_check(): Bad type");
574 /* Several of the following routines use the same set of statements to
575 check the validity of the result. Encapsulate the checking here. */
578 check_result (arith rc, gfc_expr *x, gfc_expr *r, gfc_expr **rp)
582 if (val == ARITH_UNDERFLOW)
584 if (gfc_option.warn_underflow)
585 gfc_warning (gfc_arith_error (val), &x->where);
589 if (val == ARITH_ASYMMETRIC)
591 gfc_warning (gfc_arith_error (val), &x->where);
604 /* It may seem silly to have a subroutine that actually computes the
605 unary plus of a constant, but it prevents us from making exceptions
606 in the code elsewhere. Used for unary plus and parenthesized
610 gfc_arith_identity (gfc_expr *op1, gfc_expr **resultp)
612 *resultp = gfc_copy_expr (op1);
618 gfc_arith_uminus (gfc_expr *op1, gfc_expr **resultp)
623 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
625 switch (op1->ts.type)
628 mpz_neg (result->value.integer, op1->value.integer);
632 mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
636 mpfr_neg (result->value.complex.r, op1->value.complex.r, GFC_RND_MODE);
637 mpfr_neg (result->value.complex.i, op1->value.complex.i, GFC_RND_MODE);
641 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
644 rc = gfc_range_check (result);
646 return check_result (rc, op1, result, resultp);
651 gfc_arith_plus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
656 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
658 switch (op1->ts.type)
661 mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
665 mpfr_add (result->value.real, op1->value.real, op2->value.real,
670 mpfr_add (result->value.complex.r, op1->value.complex.r,
671 op2->value.complex.r, GFC_RND_MODE);
673 mpfr_add (result->value.complex.i, op1->value.complex.i,
674 op2->value.complex.i, GFC_RND_MODE);
678 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
681 rc = gfc_range_check (result);
683 return check_result (rc, op1, result, resultp);
688 gfc_arith_minus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
693 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
695 switch (op1->ts.type)
698 mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
702 mpfr_sub (result->value.real, op1->value.real, op2->value.real,
707 mpfr_sub (result->value.complex.r, op1->value.complex.r,
708 op2->value.complex.r, GFC_RND_MODE);
710 mpfr_sub (result->value.complex.i, op1->value.complex.i,
711 op2->value.complex.i, GFC_RND_MODE);
715 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
718 rc = gfc_range_check (result);
720 return check_result (rc, op1, result, resultp);
725 gfc_arith_times (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
731 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
733 switch (op1->ts.type)
736 mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
740 mpfr_mul (result->value.real, op1->value.real, op2->value.real,
745 gfc_set_model (op1->value.complex.r);
749 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
750 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
751 mpfr_sub (result->value.complex.r, x, y, GFC_RND_MODE);
753 mpfr_mul (x, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
754 mpfr_mul (y, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
755 mpfr_add (result->value.complex.i, x, y, GFC_RND_MODE);
757 mpfr_clears (x, y, NULL);
761 gfc_internal_error ("gfc_arith_times(): Bad basic type");
764 rc = gfc_range_check (result);
766 return check_result (rc, op1, result, resultp);
771 gfc_arith_divide (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
779 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
781 switch (op1->ts.type)
784 if (mpz_sgn (op2->value.integer) == 0)
790 mpz_tdiv_q (result->value.integer, op1->value.integer,
795 if (mpfr_sgn (op2->value.real) == 0 && gfc_option.flag_range_check == 1)
801 mpfr_div (result->value.real, op1->value.real, op2->value.real,
806 if (mpfr_sgn (op2->value.complex.r) == 0
807 && mpfr_sgn (op2->value.complex.i) == 0
808 && gfc_option.flag_range_check == 1)
814 gfc_set_model (op1->value.complex.r);
819 mpfr_mul (x, op2->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
820 mpfr_mul (y, op2->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
821 mpfr_add (div, x, y, GFC_RND_MODE);
823 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
824 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
825 mpfr_add (result->value.complex.r, x, y, GFC_RND_MODE);
826 mpfr_div (result->value.complex.r, result->value.complex.r, div,
829 mpfr_mul (x, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
830 mpfr_mul (y, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
831 mpfr_sub (result->value.complex.i, x, y, GFC_RND_MODE);
832 mpfr_div (result->value.complex.i, result->value.complex.i, div,
835 mpfr_clears (x, y, div, NULL);
839 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
843 rc = gfc_range_check (result);
845 return check_result (rc, op1, result, resultp);
849 /* Compute the reciprocal of a complex number (guaranteed nonzero). */
852 complex_reciprocal (gfc_expr *op)
856 gfc_set_model (op->value.complex.r);
860 mpfr_mul (mod, op->value.complex.r, op->value.complex.r, GFC_RND_MODE);
861 mpfr_mul (tmp, op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
862 mpfr_add (mod, mod, tmp, GFC_RND_MODE);
864 mpfr_div (op->value.complex.r, op->value.complex.r, mod, GFC_RND_MODE);
866 mpfr_neg (op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
867 mpfr_div (op->value.complex.i, op->value.complex.i, mod, GFC_RND_MODE);
869 mpfr_clears (tmp, mod, NULL);
873 /* Raise a complex number to positive power (power > 0).
874 This function will modify the content of power.
876 Use Binary Method, which is not an optimal but a simple and reasonable
877 arithmetic. See section 4.6.3, "Evaluation of Powers" of Donald E. Knuth,
878 "Seminumerical Algorithms", Vol. 2, "The Art of Computer Programming",
879 3rd Edition, 1998. */
882 complex_pow (gfc_expr *result, gfc_expr *base, mpz_t power)
884 mpfr_t x_r, x_i, tmp, re, im;
886 gfc_set_model (base->value.complex.r);
894 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
895 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
898 mpfr_set (x_r, base->value.complex.r, GFC_RND_MODE);
899 mpfr_set (x_i, base->value.complex.i, GFC_RND_MODE);
901 /* Macro for complex multiplication. We have to take care that
902 res_r/res_i and a_r/a_i can (and will) be the same variable. */
903 #define CMULT(res_r,res_i,a_r,a_i,b_r,b_i) \
904 mpfr_mul (re, a_r, b_r, GFC_RND_MODE), \
905 mpfr_mul (tmp, a_i, b_i, GFC_RND_MODE), \
906 mpfr_sub (re, re, tmp, GFC_RND_MODE), \
908 mpfr_mul (im, a_r, b_i, GFC_RND_MODE), \
909 mpfr_mul (tmp, a_i, b_r, GFC_RND_MODE), \
910 mpfr_add (res_i, im, tmp, GFC_RND_MODE), \
911 mpfr_set (res_r, re, GFC_RND_MODE)
913 #define res_r result->value.complex.r
914 #define res_i result->value.complex.i
916 /* for (; power > 0; x *= x) */
917 for (; mpz_cmp_si (power, 0) > 0; CMULT(x_r,x_i,x_r,x_i,x_r,x_i))
919 /* if (power & 1) res = res * x; */
920 if (mpz_congruent_ui_p (power, 1, 2))
921 CMULT(res_r,res_i,res_r,res_i,x_r,x_i);
924 mpz_fdiv_q_ui (power, power, 2);
931 mpfr_clears (x_r, x_i, tmp, re, im, NULL);
935 /* Raise a number to a power. */
938 arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
943 extern bool init_flag;
946 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
948 switch (op2->ts.type)
951 power_sign = mpz_sgn (op2->value.integer);
955 /* Handle something to the zeroth power. Since we're dealing
956 with integral exponents, there is no ambiguity in the
957 limiting procedure used to determine the value of 0**0. */
958 switch (op1->ts.type)
961 mpz_set_ui (result->value.integer, 1);
965 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
969 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
970 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
974 gfc_internal_error ("arith_power(): Bad base");
979 switch (op1->ts.type)
985 /* First, we simplify the cases of op1 == 1, 0 or -1. */
986 if (mpz_cmp_si (op1->value.integer, 1) == 0)
989 mpz_set_si (result->value.integer, 1);
991 else if (mpz_cmp_si (op1->value.integer, 0) == 0)
993 /* 0**op2 == 0, if op2 > 0
994 0**op2 overflow, if op2 < 0 ; in that case, we
995 set the result to 0 and return ARITH_DIV0. */
996 mpz_set_si (result->value.integer, 0);
997 if (mpz_cmp_si (op2->value.integer, 0) < 0)
1000 else if (mpz_cmp_si (op1->value.integer, -1) == 0)
1002 /* (-1)**op2 == (-1)**(mod(op2,2)) */
1003 unsigned int odd = mpz_fdiv_ui (op2->value.integer, 2);
1005 mpz_set_si (result->value.integer, -1);
1007 mpz_set_si (result->value.integer, 1);
1009 /* Then, we take care of op2 < 0. */
1010 else if (mpz_cmp_si (op2->value.integer, 0) < 0)
1012 /* if op2 < 0, op1**op2 == 0 because abs(op1) > 1. */
1013 mpz_set_si (result->value.integer, 0);
1015 else if (gfc_extract_int (op2, &power) != NULL)
1017 /* If op2 doesn't fit in an int, the exponentiation will
1018 overflow, because op2 > 0 and abs(op1) > 1. */
1021 i = gfc_validate_kind (BT_INTEGER, result->ts.kind, false);
1023 if (gfc_option.flag_range_check)
1024 rc = ARITH_OVERFLOW;
1026 /* Still, we want to give the same value as the
1029 mpz_add_ui (max, gfc_integer_kinds[i].huge, 1);
1030 mpz_mul_ui (max, max, 2);
1031 mpz_powm (result->value.integer, op1->value.integer,
1032 op2->value.integer, max);
1036 mpz_pow_ui (result->value.integer, op1->value.integer,
1042 mpfr_pow_z (result->value.real, op1->value.real,
1043 op2->value.integer, GFC_RND_MODE);
1050 /* Compute op1**abs(op2) */
1052 mpz_abs (apower, op2->value.integer);
1053 complex_pow (result, op1, apower);
1056 /* If (op2 < 0), compute the inverse. */
1058 complex_reciprocal (result);
1072 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1073 "exponent in an initialization "
1074 "expression at %L", &op2->where) == FAILURE)
1075 return ARITH_PROHIBIT;
1078 if (mpfr_cmp_si (op1->value.real, 0) < 0)
1080 gfc_error ("Raising a negative REAL at %L to "
1081 "a REAL power is prohibited", &op1->where);
1083 return ARITH_PROHIBIT;
1086 mpfr_pow (result->value.real, op1->value.real, op2->value.real,
1096 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1097 "exponent in an initialization "
1098 "expression at %L", &op2->where) == FAILURE)
1099 return ARITH_PROHIBIT;
1102 gfc_set_model (op1->value.complex.r);
1106 mpfr_hypot (r, op1->value.complex.r, op1->value.complex.i,
1108 if (mpfr_cmp_si (r, 0) == 0)
1110 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
1111 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
1115 mpfr_log (r, r, GFC_RND_MODE);
1119 mpfr_atan2 (t, op1->value.complex.i, op1->value.complex.r,
1125 mpfr_mul (x, op2->value.complex.r, r, GFC_RND_MODE);
1126 mpfr_mul (y, op2->value.complex.i, t, GFC_RND_MODE);
1127 mpfr_sub (x, x, y, GFC_RND_MODE);
1128 mpfr_exp (x, x, GFC_RND_MODE);
1130 mpfr_mul (y, op2->value.complex.r, t, GFC_RND_MODE);
1131 mpfr_mul (t, op2->value.complex.i, r, GFC_RND_MODE);
1132 mpfr_add (y, y, t, GFC_RND_MODE);
1133 mpfr_cos (t, y, GFC_RND_MODE);
1134 mpfr_sin (y, y, GFC_RND_MODE);
1135 mpfr_mul (result->value.complex.r, x, t, GFC_RND_MODE);
1136 mpfr_mul (result->value.complex.i, x, y, GFC_RND_MODE);
1137 mpfr_clears (r, t, x, y, NULL);
1141 gfc_internal_error ("arith_power(): unknown type");
1145 rc = gfc_range_check (result);
1147 return check_result (rc, op1, result, resultp);
1151 /* Concatenate two string constants. */
1154 gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1159 gcc_assert (op1->ts.kind == op2->ts.kind);
1160 result = gfc_constant_result (BT_CHARACTER, op1->ts.kind,
1163 len = op1->value.character.length + op2->value.character.length;
1165 result->value.character.string = gfc_get_wide_string (len + 1);
1166 result->value.character.length = len;
1168 memcpy (result->value.character.string, op1->value.character.string,
1169 op1->value.character.length * sizeof (gfc_char_t));
1171 memcpy (&result->value.character.string[op1->value.character.length],
1172 op2->value.character.string,
1173 op2->value.character.length * sizeof (gfc_char_t));
1175 result->value.character.string[len] = '\0';
1182 /* Comparison between real values; returns 0 if (op1 .op. op2) is true.
1183 This function mimics mpfr_cmp but takes NaN into account. */
1186 compare_real (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1192 rc = mpfr_equal_p (op1->value.real, op2->value.real) ? 0 : 1;
1195 rc = mpfr_greater_p (op1->value.real, op2->value.real) ? 1 : -1;
1198 rc = mpfr_greaterequal_p (op1->value.real, op2->value.real) ? 1 : -1;
1201 rc = mpfr_less_p (op1->value.real, op2->value.real) ? -1 : 1;
1204 rc = mpfr_lessequal_p (op1->value.real, op2->value.real) ? -1 : 1;
1207 gfc_internal_error ("compare_real(): Bad operator");
1213 /* Comparison operators. Assumes that the two expression nodes
1214 contain two constants of the same type. The op argument is
1215 needed to handle NaN correctly. */
1218 gfc_compare_expr (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1222 switch (op1->ts.type)
1225 rc = mpz_cmp (op1->value.integer, op2->value.integer);
1229 rc = compare_real (op1, op2, op);
1233 rc = gfc_compare_string (op1, op2);
1237 rc = ((!op1->value.logical && op2->value.logical)
1238 || (op1->value.logical && !op2->value.logical));
1242 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1249 /* Compare a pair of complex numbers. Naturally, this is only for
1250 equality and inequality. */
1253 compare_complex (gfc_expr *op1, gfc_expr *op2)
1255 return (mpfr_equal_p (op1->value.complex.r, op2->value.complex.r)
1256 && mpfr_equal_p (op1->value.complex.i, op2->value.complex.i));
1260 /* Given two constant strings and the inverse collating sequence, compare the
1261 strings. We return -1 for a < b, 0 for a == b and 1 for a > b.
1262 We use the processor's default collating sequence. */
1265 gfc_compare_string (gfc_expr *a, gfc_expr *b)
1267 int len, alen, blen, i;
1270 alen = a->value.character.length;
1271 blen = b->value.character.length;
1273 len = MAX(alen, blen);
1275 for (i = 0; i < len; i++)
1277 ac = ((i < alen) ? a->value.character.string[i] : ' ');
1278 bc = ((i < blen) ? b->value.character.string[i] : ' ');
1286 /* Strings are equal */
1292 gfc_compare_with_Cstring (gfc_expr *a, const char *b, bool case_sensitive)
1294 int len, alen, blen, i;
1297 alen = a->value.character.length;
1300 len = MAX(alen, blen);
1302 for (i = 0; i < len; i++)
1304 ac = ((i < alen) ? a->value.character.string[i] : ' ');
1305 bc = ((i < blen) ? b[i] : ' ');
1307 if (!case_sensitive)
1319 /* Strings are equal */
1324 /* Specific comparison subroutines. */
1327 gfc_arith_eq (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1331 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1333 result->value.logical = (op1->ts.type == BT_COMPLEX)
1334 ? compare_complex (op1, op2)
1335 : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) == 0);
1343 gfc_arith_ne (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1347 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1349 result->value.logical = (op1->ts.type == BT_COMPLEX)
1350 ? !compare_complex (op1, op2)
1351 : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) != 0);
1359 gfc_arith_gt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1363 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1365 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GT) > 0);
1373 gfc_arith_ge (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1377 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1379 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GE) >= 0);
1387 gfc_arith_lt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1391 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1393 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LT) < 0);
1401 gfc_arith_le (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1405 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1407 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LE) <= 0);
1415 reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr *op,
1418 gfc_constructor *c, *head;
1422 if (op->expr_type == EXPR_CONSTANT)
1423 return eval (op, result);
1426 head = gfc_copy_constructor (op->value.constructor);
1428 for (c = head; c; c = c->next)
1430 rc = reduce_unary (eval, c->expr, &r);
1435 gfc_replace_expr (c->expr, r);
1439 gfc_free_constructor (head);
1442 r = gfc_get_expr ();
1443 r->expr_type = EXPR_ARRAY;
1444 r->value.constructor = head;
1445 r->shape = gfc_copy_shape (op->shape, op->rank);
1447 r->ts = head->expr->ts;
1448 r->where = op->where;
1459 reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1460 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1462 gfc_constructor *c, *head;
1466 head = gfc_copy_constructor (op1->value.constructor);
1469 for (c = head; c; c = c->next)
1471 if (c->expr->expr_type == EXPR_CONSTANT)
1472 rc = eval (c->expr, op2, &r);
1474 rc = reduce_binary_ac (eval, c->expr, op2, &r);
1479 gfc_replace_expr (c->expr, r);
1483 gfc_free_constructor (head);
1486 r = gfc_get_expr ();
1487 r->expr_type = EXPR_ARRAY;
1488 r->value.constructor = head;
1489 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1491 r->ts = head->expr->ts;
1492 r->where = op1->where;
1493 r->rank = op1->rank;
1503 reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1504 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1506 gfc_constructor *c, *head;
1510 head = gfc_copy_constructor (op2->value.constructor);
1513 for (c = head; c; c = c->next)
1515 if (c->expr->expr_type == EXPR_CONSTANT)
1516 rc = eval (op1, c->expr, &r);
1518 rc = reduce_binary_ca (eval, op1, c->expr, &r);
1523 gfc_replace_expr (c->expr, r);
1527 gfc_free_constructor (head);
1530 r = gfc_get_expr ();
1531 r->expr_type = EXPR_ARRAY;
1532 r->value.constructor = head;
1533 r->shape = gfc_copy_shape (op2->shape, op2->rank);
1535 r->ts = head->expr->ts;
1536 r->where = op2->where;
1537 r->rank = op2->rank;
1546 /* We need a forward declaration of reduce_binary. */
1547 static arith reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1548 gfc_expr *op1, gfc_expr *op2, gfc_expr **result);
1552 reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1553 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1555 gfc_constructor *c, *d, *head;
1559 head = gfc_copy_constructor (op1->value.constructor);
1562 d = op2->value.constructor;
1564 if (gfc_check_conformance (op1, op2, "elemental binary operation")
1566 rc = ARITH_INCOMMENSURATE;
1569 for (c = head; c; c = c->next, d = d->next)
1573 rc = ARITH_INCOMMENSURATE;
1577 rc = reduce_binary (eval, c->expr, d->expr, &r);
1581 gfc_replace_expr (c->expr, r);
1585 rc = ARITH_INCOMMENSURATE;
1589 gfc_free_constructor (head);
1592 r = gfc_get_expr ();
1593 r->expr_type = EXPR_ARRAY;
1594 r->value.constructor = head;
1595 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1597 r->ts = head->expr->ts;
1598 r->where = op1->where;
1599 r->rank = op1->rank;
1609 reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1610 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1612 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1613 return eval (op1, op2, result);
1615 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1616 return reduce_binary_ca (eval, op1, op2, result);
1618 if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1619 return reduce_binary_ac (eval, op1, op2, result);
1621 return reduce_binary_aa (eval, op1, op2, result);
1627 arith (*f2)(gfc_expr *, gfc_expr **);
1628 arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1632 /* High level arithmetic subroutines. These subroutines go into
1633 eval_intrinsic(), which can do one of several things to its
1634 operands. If the operands are incompatible with the intrinsic
1635 operation, we return a node pointing to the operands and hope that
1636 an operator interface is found during resolution.
1638 If the operands are compatible and are constants, then we try doing
1639 the arithmetic. We also handle the cases where either or both
1640 operands are array constructors. */
1643 eval_intrinsic (gfc_intrinsic_op op,
1644 eval_f eval, gfc_expr *op1, gfc_expr *op2)
1646 gfc_expr temp, *result;
1650 gfc_clear_ts (&temp.ts);
1656 if (op1->ts.type != BT_LOGICAL)
1659 temp.ts.type = BT_LOGICAL;
1660 temp.ts.kind = gfc_default_logical_kind;
1664 /* Logical binary operators */
1667 case INTRINSIC_NEQV:
1669 if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1672 temp.ts.type = BT_LOGICAL;
1673 temp.ts.kind = gfc_default_logical_kind;
1678 case INTRINSIC_UPLUS:
1679 case INTRINSIC_UMINUS:
1680 if (!gfc_numeric_ts (&op1->ts))
1687 case INTRINSIC_PARENTHESES:
1692 /* Additional restrictions for ordering relations. */
1694 case INTRINSIC_GE_OS:
1696 case INTRINSIC_LT_OS:
1698 case INTRINSIC_LE_OS:
1700 case INTRINSIC_GT_OS:
1701 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1703 temp.ts.type = BT_LOGICAL;
1704 temp.ts.kind = gfc_default_logical_kind;
1710 case INTRINSIC_EQ_OS:
1712 case INTRINSIC_NE_OS:
1713 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1716 temp.ts.type = BT_LOGICAL;
1717 temp.ts.kind = gfc_default_logical_kind;
1719 /* If kind mismatch, exit and we'll error out later. */
1720 if (op1->ts.kind != op2->ts.kind)
1727 /* Numeric binary */
1728 case INTRINSIC_PLUS:
1729 case INTRINSIC_MINUS:
1730 case INTRINSIC_TIMES:
1731 case INTRINSIC_DIVIDE:
1732 case INTRINSIC_POWER:
1733 if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1736 /* Insert any necessary type conversions to make the operands
1739 temp.expr_type = EXPR_OP;
1740 gfc_clear_ts (&temp.ts);
1741 temp.value.op.op = op;
1743 temp.value.op.op1 = op1;
1744 temp.value.op.op2 = op2;
1746 gfc_type_convert_binary (&temp);
1748 if (op == INTRINSIC_EQ || op == INTRINSIC_NE
1749 || op == INTRINSIC_GE || op == INTRINSIC_GT
1750 || op == INTRINSIC_LE || op == INTRINSIC_LT
1751 || op == INTRINSIC_EQ_OS || op == INTRINSIC_NE_OS
1752 || op == INTRINSIC_GE_OS || op == INTRINSIC_GT_OS
1753 || op == INTRINSIC_LE_OS || op == INTRINSIC_LT_OS)
1755 temp.ts.type = BT_LOGICAL;
1756 temp.ts.kind = gfc_default_logical_kind;
1762 /* Character binary */
1763 case INTRINSIC_CONCAT:
1764 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
1765 || op1->ts.kind != op2->ts.kind)
1768 temp.ts.type = BT_CHARACTER;
1769 temp.ts.kind = op1->ts.kind;
1773 case INTRINSIC_USER:
1777 gfc_internal_error ("eval_intrinsic(): Bad operator");
1780 if (op1->expr_type != EXPR_CONSTANT
1781 && (op1->expr_type != EXPR_ARRAY
1782 || !gfc_is_constant_expr (op1) || !gfc_expanded_ac (op1)))
1786 && op2->expr_type != EXPR_CONSTANT
1787 && (op2->expr_type != EXPR_ARRAY
1788 || !gfc_is_constant_expr (op2) || !gfc_expanded_ac (op2)))
1792 rc = reduce_unary (eval.f2, op1, &result);
1794 rc = reduce_binary (eval.f3, op1, op2, &result);
1797 /* Something went wrong. */
1798 if (op == INTRINSIC_POWER && rc == ARITH_PROHIBIT)
1803 gfc_error (gfc_arith_error (rc), &op1->where);
1807 gfc_free_expr (op1);
1808 gfc_free_expr (op2);
1812 /* Create a run-time expression. */
1813 result = gfc_get_expr ();
1814 result->ts = temp.ts;
1816 result->expr_type = EXPR_OP;
1817 result->value.op.op = op;
1819 result->value.op.op1 = op1;
1820 result->value.op.op2 = op2;
1822 result->where = op1->where;
1828 /* Modify type of expression for zero size array. */
1831 eval_type_intrinsic0 (gfc_intrinsic_op iop, gfc_expr *op)
1834 gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1839 case INTRINSIC_GE_OS:
1841 case INTRINSIC_LT_OS:
1843 case INTRINSIC_LE_OS:
1845 case INTRINSIC_GT_OS:
1847 case INTRINSIC_EQ_OS:
1849 case INTRINSIC_NE_OS:
1850 op->ts.type = BT_LOGICAL;
1851 op->ts.kind = gfc_default_logical_kind;
1862 /* Return nonzero if the expression is a zero size array. */
1865 gfc_zero_size_array (gfc_expr *e)
1867 if (e->expr_type != EXPR_ARRAY)
1870 return e->value.constructor == NULL;
1874 /* Reduce a binary expression where at least one of the operands
1875 involves a zero-length array. Returns NULL if neither of the
1876 operands is a zero-length array. */
1879 reduce_binary0 (gfc_expr *op1, gfc_expr *op2)
1881 if (gfc_zero_size_array (op1))
1883 gfc_free_expr (op2);
1887 if (gfc_zero_size_array (op2))
1889 gfc_free_expr (op1);
1898 eval_intrinsic_f2 (gfc_intrinsic_op op,
1899 arith (*eval) (gfc_expr *, gfc_expr **),
1900 gfc_expr *op1, gfc_expr *op2)
1907 if (gfc_zero_size_array (op1))
1908 return eval_type_intrinsic0 (op, op1);
1912 result = reduce_binary0 (op1, op2);
1914 return eval_type_intrinsic0 (op, result);
1918 return eval_intrinsic (op, f, op1, op2);
1923 eval_intrinsic_f3 (gfc_intrinsic_op op,
1924 arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1925 gfc_expr *op1, gfc_expr *op2)
1930 result = reduce_binary0 (op1, op2);
1932 return eval_type_intrinsic0(op, result);
1935 return eval_intrinsic (op, f, op1, op2);
1940 gfc_parentheses (gfc_expr *op)
1942 if (gfc_is_constant_expr (op))
1945 return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity,
1950 gfc_uplus (gfc_expr *op)
1952 return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_identity, op, NULL);
1957 gfc_uminus (gfc_expr *op)
1959 return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
1964 gfc_add (gfc_expr *op1, gfc_expr *op2)
1966 return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
1971 gfc_subtract (gfc_expr *op1, gfc_expr *op2)
1973 return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
1978 gfc_multiply (gfc_expr *op1, gfc_expr *op2)
1980 return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
1985 gfc_divide (gfc_expr *op1, gfc_expr *op2)
1987 return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
1992 gfc_power (gfc_expr *op1, gfc_expr *op2)
1994 return eval_intrinsic_f3 (INTRINSIC_POWER, arith_power, op1, op2);
1999 gfc_concat (gfc_expr *op1, gfc_expr *op2)
2001 return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
2006 gfc_and (gfc_expr *op1, gfc_expr *op2)
2008 return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
2013 gfc_or (gfc_expr *op1, gfc_expr *op2)
2015 return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
2020 gfc_not (gfc_expr *op1)
2022 return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
2027 gfc_eqv (gfc_expr *op1, gfc_expr *op2)
2029 return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
2034 gfc_neqv (gfc_expr *op1, gfc_expr *op2)
2036 return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
2041 gfc_eq (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2043 return eval_intrinsic_f3 (op, gfc_arith_eq, op1, op2);
2048 gfc_ne (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2050 return eval_intrinsic_f3 (op, gfc_arith_ne, op1, op2);
2055 gfc_gt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2057 return eval_intrinsic_f3 (op, gfc_arith_gt, op1, op2);
2062 gfc_ge (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2064 return eval_intrinsic_f3 (op, gfc_arith_ge, op1, op2);
2069 gfc_lt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2071 return eval_intrinsic_f3 (op, gfc_arith_lt, op1, op2);
2076 gfc_le (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
2078 return eval_intrinsic_f3 (op, gfc_arith_le, op1, op2);
2082 /* Convert an integer string to an expression node. */
2085 gfc_convert_integer (const char *buffer, int kind, int radix, locus *where)
2090 e = gfc_constant_result (BT_INTEGER, kind, where);
2091 /* A leading plus is allowed, but not by mpz_set_str. */
2092 if (buffer[0] == '+')
2096 mpz_set_str (e->value.integer, t, radix);
2102 /* Convert a real string to an expression node. */
2105 gfc_convert_real (const char *buffer, int kind, locus *where)
2109 e = gfc_constant_result (BT_REAL, kind, where);
2110 mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
2116 /* Convert a pair of real, constant expression nodes to a single
2117 complex expression node. */
2120 gfc_convert_complex (gfc_expr *real, gfc_expr *imag, int kind)
2124 e = gfc_constant_result (BT_COMPLEX, kind, &real->where);
2125 mpfr_set (e->value.complex.r, real->value.real, GFC_RND_MODE);
2126 mpfr_set (e->value.complex.i, imag->value.real, GFC_RND_MODE);
2132 /******* Simplification of intrinsic functions with constant arguments *****/
2135 /* Deal with an arithmetic error. */
2138 arith_error (arith rc, gfc_typespec *from, gfc_typespec *to, locus *where)
2143 gfc_error ("Arithmetic OK converting %s to %s at %L",
2144 gfc_typename (from), gfc_typename (to), where);
2146 case ARITH_OVERFLOW:
2147 gfc_error ("Arithmetic overflow converting %s to %s at %L. This check "
2148 "can be disabled with the option -fno-range-check",
2149 gfc_typename (from), gfc_typename (to), where);
2151 case ARITH_UNDERFLOW:
2152 gfc_error ("Arithmetic underflow converting %s to %s at %L. This check "
2153 "can be disabled with the option -fno-range-check",
2154 gfc_typename (from), gfc_typename (to), where);
2157 gfc_error ("Arithmetic NaN converting %s to %s at %L. This check "
2158 "can be disabled with the option -fno-range-check",
2159 gfc_typename (from), gfc_typename (to), where);
2162 gfc_error ("Division by zero converting %s to %s at %L",
2163 gfc_typename (from), gfc_typename (to), where);
2165 case ARITH_INCOMMENSURATE:
2166 gfc_error ("Array operands are incommensurate converting %s to %s at %L",
2167 gfc_typename (from), gfc_typename (to), where);
2169 case ARITH_ASYMMETRIC:
2170 gfc_error ("Integer outside symmetric range implied by Standard Fortran"
2171 " converting %s to %s at %L",
2172 gfc_typename (from), gfc_typename (to), where);
2175 gfc_internal_error ("gfc_arith_error(): Bad error code");
2178 /* TODO: Do something about the error, i.e., throw exception, return
2183 /* Convert integers to integers. */
2186 gfc_int2int (gfc_expr *src, int kind)
2191 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2193 mpz_set (result->value.integer, src->value.integer);
2195 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2197 if (rc == ARITH_ASYMMETRIC)
2199 gfc_warning (gfc_arith_error (rc), &src->where);
2203 arith_error (rc, &src->ts, &result->ts, &src->where);
2204 gfc_free_expr (result);
2213 /* Convert integers to reals. */
2216 gfc_int2real (gfc_expr *src, int kind)
2221 result = gfc_constant_result (BT_REAL, kind, &src->where);
2223 mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
2225 if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
2227 arith_error (rc, &src->ts, &result->ts, &src->where);
2228 gfc_free_expr (result);
2236 /* Convert default integer to default complex. */
2239 gfc_int2complex (gfc_expr *src, int kind)
2244 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2246 mpfr_set_z (result->value.complex.r, src->value.integer, GFC_RND_MODE);
2247 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2249 if ((rc = gfc_check_real_range (result->value.complex.r, kind)) != ARITH_OK)
2251 arith_error (rc, &src->ts, &result->ts, &src->where);
2252 gfc_free_expr (result);
2260 /* Convert default real to default integer. */
2263 gfc_real2int (gfc_expr *src, int kind)
2268 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2270 gfc_mpfr_to_mpz (result->value.integer, src->value.real, &src->where);
2272 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2274 arith_error (rc, &src->ts, &result->ts, &src->where);
2275 gfc_free_expr (result);
2283 /* Convert real to real. */
2286 gfc_real2real (gfc_expr *src, int kind)
2291 result = gfc_constant_result (BT_REAL, kind, &src->where);
2293 mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
2295 rc = gfc_check_real_range (result->value.real, kind);
2297 if (rc == ARITH_UNDERFLOW)
2299 if (gfc_option.warn_underflow)
2300 gfc_warning (gfc_arith_error (rc), &src->where);
2301 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2303 else if (rc != ARITH_OK)
2305 arith_error (rc, &src->ts, &result->ts, &src->where);
2306 gfc_free_expr (result);
2314 /* Convert real to complex. */
2317 gfc_real2complex (gfc_expr *src, int kind)
2322 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2324 mpfr_set (result->value.complex.r, src->value.real, GFC_RND_MODE);
2325 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2327 rc = gfc_check_real_range (result->value.complex.r, kind);
2329 if (rc == ARITH_UNDERFLOW)
2331 if (gfc_option.warn_underflow)
2332 gfc_warning (gfc_arith_error (rc), &src->where);
2333 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
2335 else if (rc != ARITH_OK)
2337 arith_error (rc, &src->ts, &result->ts, &src->where);
2338 gfc_free_expr (result);
2346 /* Convert complex to integer. */
2349 gfc_complex2int (gfc_expr *src, int kind)
2354 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2356 gfc_mpfr_to_mpz (result->value.integer, src->value.complex.r, &src->where);
2358 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2360 arith_error (rc, &src->ts, &result->ts, &src->where);
2361 gfc_free_expr (result);
2369 /* Convert complex to real. */
2372 gfc_complex2real (gfc_expr *src, int kind)
2377 result = gfc_constant_result (BT_REAL, kind, &src->where);
2379 mpfr_set (result->value.real, src->value.complex.r, GFC_RND_MODE);
2381 rc = gfc_check_real_range (result->value.real, kind);
2383 if (rc == ARITH_UNDERFLOW)
2385 if (gfc_option.warn_underflow)
2386 gfc_warning (gfc_arith_error (rc), &src->where);
2387 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2391 arith_error (rc, &src->ts, &result->ts, &src->where);
2392 gfc_free_expr (result);
2400 /* Convert complex to complex. */
2403 gfc_complex2complex (gfc_expr *src, int kind)
2408 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2410 mpfr_set (result->value.complex.r, src->value.complex.r, GFC_RND_MODE);
2411 mpfr_set (result->value.complex.i, src->value.complex.i, GFC_RND_MODE);
2413 rc = gfc_check_real_range (result->value.complex.r, kind);
2415 if (rc == ARITH_UNDERFLOW)
2417 if (gfc_option.warn_underflow)
2418 gfc_warning (gfc_arith_error (rc), &src->where);
2419 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
2421 else if (rc != ARITH_OK)
2423 arith_error (rc, &src->ts, &result->ts, &src->where);
2424 gfc_free_expr (result);
2428 rc = gfc_check_real_range (result->value.complex.i, kind);
2430 if (rc == ARITH_UNDERFLOW)
2432 if (gfc_option.warn_underflow)
2433 gfc_warning (gfc_arith_error (rc), &src->where);
2434 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2436 else if (rc != ARITH_OK)
2438 arith_error (rc, &src->ts, &result->ts, &src->where);
2439 gfc_free_expr (result);
2447 /* Logical kind conversion. */
2450 gfc_log2log (gfc_expr *src, int kind)
2454 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2455 result->value.logical = src->value.logical;
2461 /* Convert logical to integer. */
2464 gfc_log2int (gfc_expr *src, int kind)
2468 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2469 mpz_set_si (result->value.integer, src->value.logical);
2475 /* Convert integer to logical. */
2478 gfc_int2log (gfc_expr *src, int kind)
2482 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2483 result->value.logical = (mpz_cmp_si (src->value.integer, 0) != 0);
2489 /* Helper function to set the representation in a Hollerith conversion.
2490 This assumes that the ts.type and ts.kind of the result have already
2494 hollerith2representation (gfc_expr *result, gfc_expr *src)
2496 int src_len, result_len;
2498 src_len = src->representation.length;
2499 result_len = gfc_target_expr_size (result);
2501 if (src_len > result_len)
2503 gfc_warning ("The Hollerith constant at %L is too long to convert to %s",
2504 &src->where, gfc_typename(&result->ts));
2507 result->representation.string = XCNEWVEC (char, result_len + 1);
2508 memcpy (result->representation.string, src->representation.string,
2509 MIN (result_len, src_len));
2511 if (src_len < result_len)
2512 memset (&result->representation.string[src_len], ' ', result_len - src_len);
2514 result->representation.string[result_len] = '\0'; /* For debugger */
2515 result->representation.length = result_len;
2519 /* Convert Hollerith to integer. The constant will be padded or truncated. */
2522 gfc_hollerith2int (gfc_expr *src, int kind)
2526 result = gfc_get_expr ();
2527 result->expr_type = EXPR_CONSTANT;
2528 result->ts.type = BT_INTEGER;
2529 result->ts.kind = kind;
2530 result->where = src->where;
2532 hollerith2representation (result, src);
2533 gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
2534 result->representation.length, result->value.integer);
2540 /* Convert Hollerith to real. The constant will be padded or truncated. */
2543 gfc_hollerith2real (gfc_expr *src, int kind)
2548 len = src->value.character.length;
2550 result = gfc_get_expr ();
2551 result->expr_type = EXPR_CONSTANT;
2552 result->ts.type = BT_REAL;
2553 result->ts.kind = kind;
2554 result->where = src->where;
2556 hollerith2representation (result, src);
2557 gfc_interpret_float (kind, (unsigned char *) result->representation.string,
2558 result->representation.length, result->value.real);
2564 /* Convert Hollerith to complex. The constant will be padded or truncated. */
2567 gfc_hollerith2complex (gfc_expr *src, int kind)
2572 len = src->value.character.length;
2574 result = gfc_get_expr ();
2575 result->expr_type = EXPR_CONSTANT;
2576 result->ts.type = BT_COMPLEX;
2577 result->ts.kind = kind;
2578 result->where = src->where;
2580 hollerith2representation (result, src);
2581 gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
2582 result->representation.length, result->value.complex.r,
2583 result->value.complex.i);
2589 /* Convert Hollerith to character. */
2592 gfc_hollerith2character (gfc_expr *src, int kind)
2596 result = gfc_copy_expr (src);
2597 result->ts.type = BT_CHARACTER;
2598 result->ts.kind = kind;
2600 result->value.character.length = result->representation.length;
2601 result->value.character.string
2602 = gfc_char_to_widechar (result->representation.string);
2608 /* Convert Hollerith to logical. The constant will be padded or truncated. */
2611 gfc_hollerith2logical (gfc_expr *src, int kind)
2616 len = src->value.character.length;
2618 result = gfc_get_expr ();
2619 result->expr_type = EXPR_CONSTANT;
2620 result->ts.type = BT_LOGICAL;
2621 result->ts.kind = kind;
2622 result->where = src->where;
2624 hollerith2representation (result, src);
2625 gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
2626 result->representation.length, &result->value.logical);