2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
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)
42 e = mpfr_get_z_exp (z, x);
43 /* MPFR 2.0.1 (included with GMP 4.1) has a bug whereby mpfr_get_z_exp
44 may set the sign of z incorrectly. Work around that here. */
45 if (mpfr_sgn (x) != mpz_sgn (z))
49 mpz_mul_2exp (z, z, e);
51 mpz_tdiv_q_2exp (z, z, -e);
55 /* Set the model number precision by the requested KIND. */
58 gfc_set_model_kind (int kind)
60 int index = gfc_validate_kind (BT_REAL, kind, false);
63 base2prec = gfc_real_kinds[index].digits;
64 if (gfc_real_kinds[index].radix != 2)
65 base2prec *= gfc_real_kinds[index].radix / 2;
66 mpfr_set_default_prec (base2prec);
70 /* Set the model number precision from mpfr_t x. */
73 gfc_set_model (mpfr_t x)
75 mpfr_set_default_prec (mpfr_get_prec (x));
79 /* Given an arithmetic error code, return a pointer to a string that
80 explains the error. */
83 gfc_arith_error (arith code)
90 p = _("Arithmetic OK at %L");
93 p = _("Arithmetic overflow at %L");
96 p = _("Arithmetic underflow at %L");
99 p = _("Arithmetic NaN at %L");
102 p = _("Division by zero at %L");
104 case ARITH_INCOMMENSURATE:
105 p = _("Array operands are incommensurate at %L");
107 case ARITH_ASYMMETRIC:
109 _("Integer outside symmetric range implied by Standard Fortran at %L");
112 gfc_internal_error ("gfc_arith_error(): Bad error code");
119 /* Get things ready to do math. */
122 gfc_arith_init_1 (void)
124 gfc_integer_info *int_info;
125 gfc_real_info *real_info;
130 mpfr_set_default_prec (128);
134 /* Convert the minimum and maximum values for each kind into their
135 GNU MP representation. */
136 for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
139 mpz_set_ui (r, int_info->radix);
140 mpz_pow_ui (r, r, int_info->digits);
142 mpz_init (int_info->huge);
143 mpz_sub_ui (int_info->huge, r, 1);
145 /* These are the numbers that are actually representable by the
146 target. For bases other than two, this needs to be changed. */
147 if (int_info->radix != 2)
148 gfc_internal_error ("Fix min_int calculation");
150 /* See PRs 13490 and 17912, related to integer ranges.
151 The pedantic_min_int exists for range checking when a program
152 is compiled with -pedantic, and reflects the belief that
153 Standard Fortran requires integers to be symmetrical, i.e.
154 every negative integer must have a representable positive
155 absolute value, and vice versa. */
157 mpz_init (int_info->pedantic_min_int);
158 mpz_neg (int_info->pedantic_min_int, int_info->huge);
160 mpz_init (int_info->min_int);
161 mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
164 mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
165 mpfr_log10 (a, a, GFC_RND_MODE);
167 gfc_mpfr_to_mpz (r, a);
168 int_info->range = mpz_get_si (r);
173 for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
175 gfc_set_model_kind (real_info->kind);
181 /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
182 /* a = 1 - b**(-p) */
183 mpfr_set_ui (a, 1, GFC_RND_MODE);
184 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
185 mpfr_pow_si (b, b, -real_info->digits, GFC_RND_MODE);
186 mpfr_sub (a, a, b, GFC_RND_MODE);
188 /* c = b**(emax-1) */
189 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
190 mpfr_pow_ui (c, b, real_info->max_exponent - 1, GFC_RND_MODE);
192 /* a = a * c = (1 - b**(-p)) * b**(emax-1) */
193 mpfr_mul (a, a, c, GFC_RND_MODE);
195 /* a = (1 - b**(-p)) * b**(emax-1) * b */
196 mpfr_mul_ui (a, a, real_info->radix, GFC_RND_MODE);
198 mpfr_init (real_info->huge);
199 mpfr_set (real_info->huge, a, GFC_RND_MODE);
201 /* tiny(x) = b**(emin-1) */
202 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
203 mpfr_pow_si (b, b, real_info->min_exponent - 1, GFC_RND_MODE);
205 mpfr_init (real_info->tiny);
206 mpfr_set (real_info->tiny, b, GFC_RND_MODE);
208 /* subnormal (x) = b**(emin - digit) */
209 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
210 mpfr_pow_si (b, b, real_info->min_exponent - real_info->digits,
213 mpfr_init (real_info->subnormal);
214 mpfr_set (real_info->subnormal, b, GFC_RND_MODE);
216 /* epsilon(x) = b**(1-p) */
217 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
218 mpfr_pow_si (b, b, 1 - real_info->digits, GFC_RND_MODE);
220 mpfr_init (real_info->epsilon);
221 mpfr_set (real_info->epsilon, b, GFC_RND_MODE);
223 /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
224 mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
225 mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
226 mpfr_neg (b, b, GFC_RND_MODE);
229 mpfr_min (a, a, b, GFC_RND_MODE);
232 gfc_mpfr_to_mpz (r, a);
233 real_info->range = mpz_get_si (r);
235 /* precision(x) = int((p - 1) * log10(b)) + k */
236 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
237 mpfr_log10 (a, a, GFC_RND_MODE);
239 mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
241 gfc_mpfr_to_mpz (r, a);
242 real_info->precision = mpz_get_si (r);
244 /* If the radix is an integral power of 10, add one to the precision. */
245 for (i = 10; i <= real_info->radix; i *= 10)
246 if (i == real_info->radix)
247 real_info->precision++;
258 /* Clean up, get rid of numeric constants. */
261 gfc_arith_done_1 (void)
263 gfc_integer_info *ip;
266 for (ip = gfc_integer_kinds; ip->kind; ip++)
268 mpz_clear (ip->min_int);
269 mpz_clear (ip->pedantic_min_int);
270 mpz_clear (ip->huge);
273 for (rp = gfc_real_kinds; rp->kind; rp++)
275 mpfr_clear (rp->epsilon);
276 mpfr_clear (rp->huge);
277 mpfr_clear (rp->tiny);
278 mpfr_clear (rp->subnormal);
283 /* Given an integer and a kind, make sure that the integer lies within
284 the range of the kind. Returns ARITH_OK, ARITH_ASYMMETRIC or
288 gfc_check_integer_range (mpz_t p, int kind)
293 i = gfc_validate_kind (BT_INTEGER, kind, false);
298 if (mpz_cmp (p, gfc_integer_kinds[i].pedantic_min_int) < 0)
299 result = ARITH_ASYMMETRIC;
303 if (gfc_option.flag_range_check == 0)
306 if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
307 || mpz_cmp (p, gfc_integer_kinds[i].huge) > 0)
308 result = ARITH_OVERFLOW;
314 /* Given a real and a kind, make sure that the real lies within the
315 range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
319 gfc_check_real_range (mpfr_t p, int kind)
325 i = gfc_validate_kind (BT_REAL, kind, false);
329 mpfr_abs (q, p, GFC_RND_MODE);
333 if (gfc_option.flag_range_check == 0)
336 retval = ARITH_OVERFLOW;
338 else if (mpfr_nan_p (p))
340 if (gfc_option.flag_range_check == 0)
345 else if (mpfr_sgn (q) == 0)
347 else if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
349 if (gfc_option.flag_range_check == 0)
351 mpfr_set_inf (p, mpfr_sgn (p));
355 retval = ARITH_OVERFLOW;
357 else if (mpfr_cmp (q, gfc_real_kinds[i].subnormal) < 0)
359 if (gfc_option.flag_range_check == 0)
361 if (mpfr_sgn (p) < 0)
363 mpfr_set_ui (p, 0, GFC_RND_MODE);
364 mpfr_set_si (q, -1, GFC_RND_MODE);
365 mpfr_copysign (p, p, q, GFC_RND_MODE);
368 mpfr_set_ui (p, 0, GFC_RND_MODE);
372 retval = ARITH_UNDERFLOW;
374 else if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
379 /* Save current values of emin and emax. */
380 emin = mpfr_get_emin ();
381 emax = mpfr_get_emax ();
383 /* Set emin and emax for the current model number. */
384 en = gfc_real_kinds[i].min_exponent - gfc_real_kinds[i].digits + 1;
385 mpfr_set_emin ((mp_exp_t) en);
386 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[i].max_exponent);
387 mpfr_subnormalize (q, 0, GFC_RND_MODE);
389 /* Reset emin and emax. */
390 mpfr_set_emin (emin);
391 mpfr_set_emax (emax);
393 /* Copy sign if needed. */
394 if (mpfr_sgn (p) < 0)
395 mpfr_neg (p, q, GMP_RNDN);
397 mpfr_set (p, q, GMP_RNDN);
410 /* Function to return a constant expression node of a given type and kind. */
413 gfc_constant_result (bt type, int kind, locus *where)
418 gfc_internal_error ("gfc_constant_result(): locus 'where' cannot be NULL");
420 result = gfc_get_expr ();
422 result->expr_type = EXPR_CONSTANT;
423 result->ts.type = type;
424 result->ts.kind = kind;
425 result->where = *where;
430 mpz_init (result->value.integer);
434 gfc_set_model_kind (kind);
435 mpfr_init (result->value.real);
439 gfc_set_model_kind (kind);
440 mpfr_init (result->value.complex.r);
441 mpfr_init (result->value.complex.i);
452 /* Low-level arithmetic functions. All of these subroutines assume
453 that all operands are of the same type and return an operand of the
454 same type. The other thing about these subroutines is that they
455 can fail in various ways -- overflow, underflow, division by zero,
456 zero raised to the zero, etc. */
459 gfc_arith_not (gfc_expr *op1, gfc_expr **resultp)
463 result = gfc_constant_result (BT_LOGICAL, op1->ts.kind, &op1->where);
464 result->value.logical = !op1->value.logical;
472 gfc_arith_and (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
476 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
478 result->value.logical = op1->value.logical && op2->value.logical;
486 gfc_arith_or (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
490 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
492 result->value.logical = op1->value.logical || op2->value.logical;
500 gfc_arith_eqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
504 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
506 result->value.logical = op1->value.logical == op2->value.logical;
514 gfc_arith_neqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
518 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
520 result->value.logical = op1->value.logical != op2->value.logical;
527 /* Make sure a constant numeric expression is within the range for
528 its type and kind. Note that there's also a gfc_check_range(),
529 but that one deals with the intrinsic RANGE function. */
532 gfc_range_check (gfc_expr *e)
539 rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
543 rc = gfc_check_real_range (e->value.real, e->ts.kind);
544 if (rc == ARITH_UNDERFLOW)
545 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
546 if (rc == ARITH_OVERFLOW)
547 mpfr_set_inf (e->value.real, mpfr_sgn (e->value.real));
549 mpfr_set_nan (e->value.real);
553 rc = gfc_check_real_range (e->value.complex.r, e->ts.kind);
554 if (rc == ARITH_UNDERFLOW)
555 mpfr_set_ui (e->value.complex.r, 0, GFC_RND_MODE);
556 if (rc == ARITH_OVERFLOW)
557 mpfr_set_inf (e->value.complex.r, mpfr_sgn (e->value.complex.r));
559 mpfr_set_nan (e->value.complex.r);
561 rc = gfc_check_real_range (e->value.complex.i, e->ts.kind);
562 if (rc == ARITH_UNDERFLOW)
563 mpfr_set_ui (e->value.complex.i, 0, GFC_RND_MODE);
564 if (rc == ARITH_OVERFLOW)
565 mpfr_set_inf (e->value.complex.i, mpfr_sgn (e->value.complex.i));
567 mpfr_set_nan (e->value.complex.i);
571 gfc_internal_error ("gfc_range_check(): Bad type");
578 /* Several of the following routines use the same set of statements to
579 check the validity of the result. Encapsulate the checking here. */
582 check_result (arith rc, gfc_expr *x, gfc_expr *r, gfc_expr **rp)
586 if (val == ARITH_UNDERFLOW)
588 if (gfc_option.warn_underflow)
589 gfc_warning (gfc_arith_error (val), &x->where);
593 if (val == ARITH_ASYMMETRIC)
595 gfc_warning (gfc_arith_error (val), &x->where);
608 /* It may seem silly to have a subroutine that actually computes the
609 unary plus of a constant, but it prevents us from making exceptions
610 in the code elsewhere. Used for unary plus and parenthesized
614 gfc_arith_identity (gfc_expr *op1, gfc_expr **resultp)
616 *resultp = gfc_copy_expr (op1);
622 gfc_arith_uminus (gfc_expr *op1, gfc_expr **resultp)
627 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
629 switch (op1->ts.type)
632 mpz_neg (result->value.integer, op1->value.integer);
636 mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
640 mpfr_neg (result->value.complex.r, op1->value.complex.r, GFC_RND_MODE);
641 mpfr_neg (result->value.complex.i, op1->value.complex.i, GFC_RND_MODE);
645 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
648 rc = gfc_range_check (result);
650 return check_result (rc, op1, result, resultp);
655 gfc_arith_plus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
660 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
662 switch (op1->ts.type)
665 mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
669 mpfr_add (result->value.real, op1->value.real, op2->value.real,
674 mpfr_add (result->value.complex.r, op1->value.complex.r,
675 op2->value.complex.r, GFC_RND_MODE);
677 mpfr_add (result->value.complex.i, op1->value.complex.i,
678 op2->value.complex.i, GFC_RND_MODE);
682 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
685 rc = gfc_range_check (result);
687 return check_result (rc, op1, result, resultp);
692 gfc_arith_minus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
697 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
699 switch (op1->ts.type)
702 mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
706 mpfr_sub (result->value.real, op1->value.real, op2->value.real,
711 mpfr_sub (result->value.complex.r, op1->value.complex.r,
712 op2->value.complex.r, GFC_RND_MODE);
714 mpfr_sub (result->value.complex.i, op1->value.complex.i,
715 op2->value.complex.i, GFC_RND_MODE);
719 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
722 rc = gfc_range_check (result);
724 return check_result (rc, op1, result, resultp);
729 gfc_arith_times (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
735 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
737 switch (op1->ts.type)
740 mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
744 mpfr_mul (result->value.real, op1->value.real, op2->value.real,
749 gfc_set_model (op1->value.complex.r);
753 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
754 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
755 mpfr_sub (result->value.complex.r, x, y, GFC_RND_MODE);
757 mpfr_mul (x, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
758 mpfr_mul (y, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
759 mpfr_add (result->value.complex.i, x, y, GFC_RND_MODE);
766 gfc_internal_error ("gfc_arith_times(): Bad basic type");
769 rc = gfc_range_check (result);
771 return check_result (rc, op1, result, resultp);
776 gfc_arith_divide (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
784 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
786 switch (op1->ts.type)
789 if (mpz_sgn (op2->value.integer) == 0)
795 mpz_tdiv_q (result->value.integer, op1->value.integer,
800 if (mpfr_sgn (op2->value.real) == 0 && gfc_option.flag_range_check == 1)
806 mpfr_div (result->value.real, op1->value.real, op2->value.real,
811 if (mpfr_sgn (op2->value.complex.r) == 0
812 && mpfr_sgn (op2->value.complex.i) == 0
813 && gfc_option.flag_range_check == 1)
819 gfc_set_model (op1->value.complex.r);
824 mpfr_mul (x, op2->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
825 mpfr_mul (y, op2->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
826 mpfr_add (div, x, y, GFC_RND_MODE);
828 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
829 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
830 mpfr_add (result->value.complex.r, x, y, GFC_RND_MODE);
831 mpfr_div (result->value.complex.r, result->value.complex.r, div,
834 mpfr_mul (x, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
835 mpfr_mul (y, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
836 mpfr_sub (result->value.complex.i, x, y, GFC_RND_MODE);
837 mpfr_div (result->value.complex.i, result->value.complex.i, div,
846 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
850 rc = gfc_range_check (result);
852 return check_result (rc, op1, result, resultp);
856 /* Compute the reciprocal of a complex number (guaranteed nonzero). */
859 complex_reciprocal (gfc_expr *op)
861 mpfr_t mod, a, re, im;
863 gfc_set_model (op->value.complex.r);
869 mpfr_mul (mod, op->value.complex.r, op->value.complex.r, GFC_RND_MODE);
870 mpfr_mul (a, op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
871 mpfr_add (mod, mod, a, GFC_RND_MODE);
873 mpfr_div (re, op->value.complex.r, mod, GFC_RND_MODE);
875 mpfr_neg (im, op->value.complex.i, GFC_RND_MODE);
876 mpfr_div (im, im, mod, GFC_RND_MODE);
878 mpfr_set (op->value.complex.r, re, GFC_RND_MODE);
879 mpfr_set (op->value.complex.i, im, GFC_RND_MODE);
888 /* Raise a complex number to positive power (power > 0).
889 This function will modify the content of power.
891 Use Binary Method, which is not an optimal but a simple and reasonable
892 arithmetic. See section 4.6.3, "Evaluation of Powers" of Donald E. Knuth,
893 "Seminumerical Algorithms", Vol. 2, "The Art of Computer Programming",
894 3rd Edition, 1998. */
897 complex_pow (gfc_expr *result, gfc_expr *base, mpz_t power)
899 mpfr_t x_r, x_i, tmp, re, im;
901 gfc_set_model (base->value.complex.r);
909 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
910 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
913 mpfr_set (x_r, base->value.complex.r, GFC_RND_MODE);
914 mpfr_set (x_i, base->value.complex.i, GFC_RND_MODE);
916 /* Macro for complex multiplication. We have to take care that
917 res_r/res_i and a_r/a_i can (and will) be the same variable. */
918 #define CMULT(res_r,res_i,a_r,a_i,b_r,b_i) \
919 mpfr_mul (re, a_r, b_r, GFC_RND_MODE), \
920 mpfr_mul (tmp, a_i, b_i, GFC_RND_MODE), \
921 mpfr_sub (re, re, tmp, GFC_RND_MODE), \
923 mpfr_mul (im, a_r, b_i, GFC_RND_MODE), \
924 mpfr_mul (tmp, a_i, b_r, GFC_RND_MODE), \
925 mpfr_add (res_i, im, tmp, GFC_RND_MODE), \
926 mpfr_set (res_r, re, GFC_RND_MODE)
928 #define res_r result->value.complex.r
929 #define res_i result->value.complex.i
931 /* for (; power > 0; x *= x) */
932 for (; mpz_cmp_si (power, 0) > 0; CMULT(x_r,x_i,x_r,x_i,x_r,x_i))
934 /* if (power & 1) res = res * x; */
935 if (mpz_congruent_ui_p (power, 1, 2))
936 CMULT(res_r,res_i,res_r,res_i,x_r,x_i);
939 mpz_fdiv_q_ui (power, power, 2);
954 /* Raise a number to an integer power. */
957 gfc_arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
963 gcc_assert (op2->expr_type == EXPR_CONSTANT && op2->ts.type == BT_INTEGER);
966 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
967 power_sign = mpz_sgn (op2->value.integer);
971 /* Handle something to the zeroth power. Since we're dealing
972 with integral exponents, there is no ambiguity in the
973 limiting procedure used to determine the value of 0**0. */
974 switch (op1->ts.type)
977 mpz_set_ui (result->value.integer, 1);
981 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
985 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
986 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
990 gfc_internal_error ("gfc_arith_power(): Bad base");
995 switch (op1->ts.type)
1001 /* First, we simplify the cases of op1 == 1, 0 or -1. */
1002 if (mpz_cmp_si (op1->value.integer, 1) == 0)
1005 mpz_set_si (result->value.integer, 1);
1007 else if (mpz_cmp_si (op1->value.integer, 0) == 0)
1009 /* 0**op2 == 0, if op2 > 0
1010 0**op2 overflow, if op2 < 0 ; in that case, we
1011 set the result to 0 and return ARITH_DIV0. */
1012 mpz_set_si (result->value.integer, 0);
1013 if (mpz_cmp_si (op2->value.integer, 0) < 0)
1016 else if (mpz_cmp_si (op1->value.integer, -1) == 0)
1018 /* (-1)**op2 == (-1)**(mod(op2,2)) */
1019 unsigned int odd = mpz_fdiv_ui (op2->value.integer, 2);
1021 mpz_set_si (result->value.integer, -1);
1023 mpz_set_si (result->value.integer, 1);
1025 /* Then, we take care of op2 < 0. */
1026 else if (mpz_cmp_si (op2->value.integer, 0) < 0)
1028 /* if op2 < 0, op1**op2 == 0 because abs(op1) > 1. */
1029 mpz_set_si (result->value.integer, 0);
1031 else if (gfc_extract_int (op2, &power) != NULL)
1033 /* If op2 doesn't fit in an int, the exponentiation will
1034 overflow, because op2 > 0 and abs(op1) > 1. */
1036 int i = gfc_validate_kind (BT_INTEGER, result->ts.kind, false);
1038 if (gfc_option.flag_range_check)
1039 rc = ARITH_OVERFLOW;
1041 /* Still, we want to give the same value as the processor. */
1043 mpz_add_ui (max, gfc_integer_kinds[i].huge, 1);
1044 mpz_mul_ui (max, max, 2);
1045 mpz_powm (result->value.integer, op1->value.integer,
1046 op2->value.integer, max);
1050 mpz_pow_ui (result->value.integer, op1->value.integer, power);
1055 mpfr_pow_z (result->value.real, op1->value.real, op2->value.integer,
1063 /* Compute op1**abs(op2) */
1065 mpz_abs (apower, op2->value.integer);
1066 complex_pow (result, op1, apower);
1069 /* If (op2 < 0), compute the inverse. */
1071 complex_reciprocal (result);
1082 rc = gfc_range_check (result);
1084 return check_result (rc, op1, result, resultp);
1088 /* Concatenate two string constants. */
1091 gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1096 result = gfc_constant_result (BT_CHARACTER, gfc_default_character_kind,
1099 len = op1->value.character.length + op2->value.character.length;
1101 result->value.character.string = gfc_getmem (len + 1);
1102 result->value.character.length = len;
1104 memcpy (result->value.character.string, op1->value.character.string,
1105 op1->value.character.length);
1107 memcpy (result->value.character.string + op1->value.character.length,
1108 op2->value.character.string, op2->value.character.length);
1110 result->value.character.string[len] = '\0';
1117 /* Comparison between real values; returns 0 if (op1 .op. op2) is true.
1118 This function mimics mpr_cmp but takes NaN into account. */
1121 compare_real (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1127 rc = mpfr_equal_p (op1->value.real, op2->value.real) ? 0 : 1;
1130 rc = mpfr_greater_p (op1->value.real, op2->value.real) ? 1 : -1;
1133 rc = mpfr_greaterequal_p (op1->value.real, op2->value.real) ? 1 : -1;
1136 rc = mpfr_less_p (op1->value.real, op2->value.real) ? -1 : 1;
1139 rc = mpfr_lessequal_p (op1->value.real, op2->value.real) ? -1 : 1;
1142 gfc_internal_error ("compare_real(): Bad operator");
1148 /* Comparison operators. Assumes that the two expression nodes
1149 contain two constants of the same type. The op argument is
1150 needed to handle NaN correctly. */
1153 gfc_compare_expr (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1157 switch (op1->ts.type)
1160 rc = mpz_cmp (op1->value.integer, op2->value.integer);
1164 rc = compare_real (op1, op2, op);
1168 rc = gfc_compare_string (op1, op2);
1172 rc = ((!op1->value.logical && op2->value.logical)
1173 || (op1->value.logical && !op2->value.logical));
1177 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1184 /* Compare a pair of complex numbers. Naturally, this is only for
1185 equality and nonequality. */
1188 compare_complex (gfc_expr *op1, gfc_expr *op2)
1190 return (mpfr_equal_p (op1->value.complex.r, op2->value.complex.r)
1191 && mpfr_equal_p (op1->value.complex.i, op2->value.complex.i));
1195 /* Given two constant strings and the inverse collating sequence, compare the
1196 strings. We return -1 for a < b, 0 for a == b and 1 for a > b.
1197 We use the processor's default collating sequence. */
1200 gfc_compare_string (gfc_expr *a, gfc_expr *b)
1202 int len, alen, blen, i, ac, bc;
1204 alen = a->value.character.length;
1205 blen = b->value.character.length;
1207 len = (alen > blen) ? alen : blen;
1209 for (i = 0; i < len; i++)
1211 /* We cast to unsigned char because default char, if it is signed,
1212 would lead to ac < 0 for string[i] > 127. */
1213 ac = (unsigned char) ((i < alen) ? a->value.character.string[i] : ' ');
1214 bc = (unsigned char) ((i < blen) ? b->value.character.string[i] : ' ');
1222 /* Strings are equal */
1228 /* Specific comparison subroutines. */
1231 gfc_arith_eq (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1235 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1237 result->value.logical = (op1->ts.type == BT_COMPLEX)
1238 ? compare_complex (op1, op2)
1239 : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) == 0);
1247 gfc_arith_ne (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1251 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1253 result->value.logical = (op1->ts.type == BT_COMPLEX)
1254 ? !compare_complex (op1, op2)
1255 : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) != 0);
1263 gfc_arith_gt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1267 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1269 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GT) > 0);
1277 gfc_arith_ge (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1281 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1283 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GE) >= 0);
1291 gfc_arith_lt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1295 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1297 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LT) < 0);
1305 gfc_arith_le (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1309 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1311 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LE) <= 0);
1319 reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr *op,
1322 gfc_constructor *c, *head;
1326 if (op->expr_type == EXPR_CONSTANT)
1327 return eval (op, result);
1330 head = gfc_copy_constructor (op->value.constructor);
1332 for (c = head; c; c = c->next)
1334 rc = reduce_unary (eval, c->expr, &r);
1339 gfc_replace_expr (c->expr, r);
1343 gfc_free_constructor (head);
1346 r = gfc_get_expr ();
1347 r->expr_type = EXPR_ARRAY;
1348 r->value.constructor = head;
1349 r->shape = gfc_copy_shape (op->shape, op->rank);
1351 r->ts = head->expr->ts;
1352 r->where = op->where;
1363 reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1364 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1366 gfc_constructor *c, *head;
1370 head = gfc_copy_constructor (op1->value.constructor);
1373 for (c = head; c; c = c->next)
1375 if (c->expr->expr_type == EXPR_CONSTANT)
1376 rc = eval (c->expr, op2, &r);
1378 rc = reduce_binary_ac (eval, c->expr, op2, &r);
1383 gfc_replace_expr (c->expr, r);
1387 gfc_free_constructor (head);
1390 r = gfc_get_expr ();
1391 r->expr_type = EXPR_ARRAY;
1392 r->value.constructor = head;
1393 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1395 r->ts = head->expr->ts;
1396 r->where = op1->where;
1397 r->rank = op1->rank;
1407 reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1408 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1410 gfc_constructor *c, *head;
1414 head = gfc_copy_constructor (op2->value.constructor);
1417 for (c = head; c; c = c->next)
1419 if (c->expr->expr_type == EXPR_CONSTANT)
1420 rc = eval (op1, c->expr, &r);
1422 rc = reduce_binary_ca (eval, op1, c->expr, &r);
1427 gfc_replace_expr (c->expr, r);
1431 gfc_free_constructor (head);
1434 r = gfc_get_expr ();
1435 r->expr_type = EXPR_ARRAY;
1436 r->value.constructor = head;
1437 r->shape = gfc_copy_shape (op2->shape, op2->rank);
1439 r->ts = head->expr->ts;
1440 r->where = op2->where;
1441 r->rank = op2->rank;
1450 /* We need a forward declaration of reduce_binary. */
1451 static arith reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1452 gfc_expr *op1, gfc_expr *op2, gfc_expr **result);
1456 reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1457 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1459 gfc_constructor *c, *d, *head;
1463 head = gfc_copy_constructor (op1->value.constructor);
1466 d = op2->value.constructor;
1468 if (gfc_check_conformance ("elemental binary operation", op1, op2)
1470 rc = ARITH_INCOMMENSURATE;
1473 for (c = head; c; c = c->next, d = d->next)
1477 rc = ARITH_INCOMMENSURATE;
1481 rc = reduce_binary (eval, c->expr, d->expr, &r);
1485 gfc_replace_expr (c->expr, r);
1489 rc = ARITH_INCOMMENSURATE;
1493 gfc_free_constructor (head);
1496 r = gfc_get_expr ();
1497 r->expr_type = EXPR_ARRAY;
1498 r->value.constructor = head;
1499 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1501 r->ts = head->expr->ts;
1502 r->where = op1->where;
1503 r->rank = op1->rank;
1513 reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1514 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1516 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1517 return eval (op1, op2, result);
1519 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1520 return reduce_binary_ca (eval, op1, op2, result);
1522 if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1523 return reduce_binary_ac (eval, op1, op2, result);
1525 return reduce_binary_aa (eval, op1, op2, result);
1531 arith (*f2)(gfc_expr *, gfc_expr **);
1532 arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1536 /* High level arithmetic subroutines. These subroutines go into
1537 eval_intrinsic(), which can do one of several things to its
1538 operands. If the operands are incompatible with the intrinsic
1539 operation, we return a node pointing to the operands and hope that
1540 an operator interface is found during resolution.
1542 If the operands are compatible and are constants, then we try doing
1543 the arithmetic. We also handle the cases where either or both
1544 operands are array constructors. */
1547 eval_intrinsic (gfc_intrinsic_op operator,
1548 eval_f eval, gfc_expr *op1, gfc_expr *op2)
1550 gfc_expr temp, *result;
1554 gfc_clear_ts (&temp.ts);
1560 if (op1->ts.type != BT_LOGICAL)
1563 temp.ts.type = BT_LOGICAL;
1564 temp.ts.kind = gfc_default_logical_kind;
1568 /* Logical binary operators */
1571 case INTRINSIC_NEQV:
1573 if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1576 temp.ts.type = BT_LOGICAL;
1577 temp.ts.kind = gfc_default_logical_kind;
1582 case INTRINSIC_UPLUS:
1583 case INTRINSIC_UMINUS:
1584 if (!gfc_numeric_ts (&op1->ts))
1591 case INTRINSIC_PARENTHESES:
1596 /* Additional restrictions for ordering relations. */
1598 case INTRINSIC_GE_OS:
1600 case INTRINSIC_LT_OS:
1602 case INTRINSIC_LE_OS:
1604 case INTRINSIC_GT_OS:
1605 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1607 temp.ts.type = BT_LOGICAL;
1608 temp.ts.kind = gfc_default_logical_kind;
1614 case INTRINSIC_EQ_OS:
1616 case INTRINSIC_NE_OS:
1617 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1620 temp.ts.type = BT_LOGICAL;
1621 temp.ts.kind = gfc_default_logical_kind;
1626 /* Numeric binary */
1627 case INTRINSIC_PLUS:
1628 case INTRINSIC_MINUS:
1629 case INTRINSIC_TIMES:
1630 case INTRINSIC_DIVIDE:
1631 case INTRINSIC_POWER:
1632 if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1635 /* Insert any necessary type conversions to make the operands
1638 temp.expr_type = EXPR_OP;
1639 gfc_clear_ts (&temp.ts);
1640 temp.value.op.operator = operator;
1642 temp.value.op.op1 = op1;
1643 temp.value.op.op2 = op2;
1645 gfc_type_convert_binary (&temp);
1647 if (operator == INTRINSIC_EQ || operator == INTRINSIC_NE
1648 || operator == INTRINSIC_GE || operator == INTRINSIC_GT
1649 || operator == INTRINSIC_LE || operator == INTRINSIC_LT
1650 || operator == INTRINSIC_EQ_OS || operator == INTRINSIC_NE_OS
1651 || operator == INTRINSIC_GE_OS || operator == INTRINSIC_GT_OS
1652 || operator == INTRINSIC_LE_OS || operator == INTRINSIC_LT_OS)
1654 temp.ts.type = BT_LOGICAL;
1655 temp.ts.kind = gfc_default_logical_kind;
1661 /* Character binary */
1662 case INTRINSIC_CONCAT:
1663 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER)
1666 temp.ts.type = BT_CHARACTER;
1667 temp.ts.kind = gfc_default_character_kind;
1671 case INTRINSIC_USER:
1675 gfc_internal_error ("eval_intrinsic(): Bad operator");
1678 /* Try to combine the operators. */
1679 if (operator == INTRINSIC_POWER && op2->ts.type != BT_INTEGER)
1682 if (op1->expr_type != EXPR_CONSTANT
1683 && (op1->expr_type != EXPR_ARRAY
1684 || !gfc_is_constant_expr (op1) || !gfc_expanded_ac (op1)))
1688 && op2->expr_type != EXPR_CONSTANT
1689 && (op2->expr_type != EXPR_ARRAY
1690 || !gfc_is_constant_expr (op2) || !gfc_expanded_ac (op2)))
1694 rc = reduce_unary (eval.f2, op1, &result);
1696 rc = reduce_binary (eval.f3, op1, op2, &result);
1699 { /* Something went wrong. */
1700 gfc_error (gfc_arith_error (rc), &op1->where);
1704 gfc_free_expr (op1);
1705 gfc_free_expr (op2);
1709 /* Create a run-time expression. */
1710 result = gfc_get_expr ();
1711 result->ts = temp.ts;
1713 result->expr_type = EXPR_OP;
1714 result->value.op.operator = operator;
1716 result->value.op.op1 = op1;
1717 result->value.op.op2 = op2;
1719 result->where = op1->where;
1725 /* Modify type of expression for zero size array. */
1728 eval_type_intrinsic0 (gfc_intrinsic_op operator, gfc_expr *op)
1731 gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1736 case INTRINSIC_GE_OS:
1738 case INTRINSIC_LT_OS:
1740 case INTRINSIC_LE_OS:
1742 case INTRINSIC_GT_OS:
1744 case INTRINSIC_EQ_OS:
1746 case INTRINSIC_NE_OS:
1747 op->ts.type = BT_LOGICAL;
1748 op->ts.kind = gfc_default_logical_kind;
1759 /* Return nonzero if the expression is a zero size array. */
1762 gfc_zero_size_array (gfc_expr *e)
1764 if (e->expr_type != EXPR_ARRAY)
1767 return e->value.constructor == NULL;
1771 /* Reduce a binary expression where at least one of the operands
1772 involves a zero-length array. Returns NULL if neither of the
1773 operands is a zero-length array. */
1776 reduce_binary0 (gfc_expr *op1, gfc_expr *op2)
1778 if (gfc_zero_size_array (op1))
1780 gfc_free_expr (op2);
1784 if (gfc_zero_size_array (op2))
1786 gfc_free_expr (op1);
1795 eval_intrinsic_f2 (gfc_intrinsic_op operator,
1796 arith (*eval) (gfc_expr *, gfc_expr **),
1797 gfc_expr *op1, gfc_expr *op2)
1804 if (gfc_zero_size_array (op1))
1805 return eval_type_intrinsic0 (operator, op1);
1809 result = reduce_binary0 (op1, op2);
1811 return eval_type_intrinsic0 (operator, result);
1815 return eval_intrinsic (operator, f, op1, op2);
1820 eval_intrinsic_f3 (gfc_intrinsic_op operator,
1821 arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1822 gfc_expr *op1, gfc_expr *op2)
1827 result = reduce_binary0 (op1, op2);
1829 return eval_type_intrinsic0(operator, result);
1832 return eval_intrinsic (operator, f, op1, op2);
1837 gfc_parentheses (gfc_expr *op)
1839 if (gfc_is_constant_expr (op))
1842 return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity,
1847 gfc_uplus (gfc_expr *op)
1849 return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_identity, op, NULL);
1854 gfc_uminus (gfc_expr *op)
1856 return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
1861 gfc_add (gfc_expr *op1, gfc_expr *op2)
1863 return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
1868 gfc_subtract (gfc_expr *op1, gfc_expr *op2)
1870 return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
1875 gfc_multiply (gfc_expr *op1, gfc_expr *op2)
1877 return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
1882 gfc_divide (gfc_expr *op1, gfc_expr *op2)
1884 return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
1889 gfc_power (gfc_expr *op1, gfc_expr *op2)
1891 return eval_intrinsic_f3 (INTRINSIC_POWER, gfc_arith_power, op1, op2);
1896 gfc_concat (gfc_expr *op1, gfc_expr *op2)
1898 return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
1903 gfc_and (gfc_expr *op1, gfc_expr *op2)
1905 return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
1910 gfc_or (gfc_expr *op1, gfc_expr *op2)
1912 return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
1917 gfc_not (gfc_expr *op1)
1919 return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
1924 gfc_eqv (gfc_expr *op1, gfc_expr *op2)
1926 return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
1931 gfc_neqv (gfc_expr *op1, gfc_expr *op2)
1933 return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
1938 gfc_eq (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1940 return eval_intrinsic_f3 (op, gfc_arith_eq, op1, op2);
1945 gfc_ne (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1947 return eval_intrinsic_f3 (op, gfc_arith_ne, op1, op2);
1952 gfc_gt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1954 return eval_intrinsic_f3 (op, gfc_arith_gt, op1, op2);
1959 gfc_ge (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1961 return eval_intrinsic_f3 (op, gfc_arith_ge, op1, op2);
1966 gfc_lt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1968 return eval_intrinsic_f3 (op, gfc_arith_lt, op1, op2);
1973 gfc_le (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1975 return eval_intrinsic_f3 (op, gfc_arith_le, op1, op2);
1979 /* Convert an integer string to an expression node. */
1982 gfc_convert_integer (const char *buffer, int kind, int radix, locus *where)
1987 e = gfc_constant_result (BT_INTEGER, kind, where);
1988 /* A leading plus is allowed, but not by mpz_set_str. */
1989 if (buffer[0] == '+')
1993 mpz_set_str (e->value.integer, t, radix);
1999 /* Convert a real string to an expression node. */
2002 gfc_convert_real (const char *buffer, int kind, locus *where)
2006 e = gfc_constant_result (BT_REAL, kind, where);
2007 mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
2013 /* Convert a pair of real, constant expression nodes to a single
2014 complex expression node. */
2017 gfc_convert_complex (gfc_expr *real, gfc_expr *imag, int kind)
2021 e = gfc_constant_result (BT_COMPLEX, kind, &real->where);
2022 mpfr_set (e->value.complex.r, real->value.real, GFC_RND_MODE);
2023 mpfr_set (e->value.complex.i, imag->value.real, GFC_RND_MODE);
2029 /******* Simplification of intrinsic functions with constant arguments *****/
2032 /* Deal with an arithmetic error. */
2035 arith_error (arith rc, gfc_typespec *from, gfc_typespec *to, locus *where)
2040 gfc_error ("Arithmetic OK converting %s to %s at %L",
2041 gfc_typename (from), gfc_typename (to), where);
2043 case ARITH_OVERFLOW:
2044 gfc_error ("Arithmetic overflow converting %s to %s at %L. This check "
2045 "can be disabled with the option -fno-range-check",
2046 gfc_typename (from), gfc_typename (to), where);
2048 case ARITH_UNDERFLOW:
2049 gfc_error ("Arithmetic underflow converting %s to %s at %L",
2050 gfc_typename (from), gfc_typename (to), where);
2053 gfc_error ("Arithmetic NaN converting %s to %s at %L",
2054 gfc_typename (from), gfc_typename (to), where);
2057 gfc_error ("Division by zero converting %s to %s at %L",
2058 gfc_typename (from), gfc_typename (to), where);
2060 case ARITH_INCOMMENSURATE:
2061 gfc_error ("Array operands are incommensurate converting %s to %s at %L",
2062 gfc_typename (from), gfc_typename (to), where);
2064 case ARITH_ASYMMETRIC:
2065 gfc_error ("Integer outside symmetric range implied by Standard Fortran"
2066 " converting %s to %s at %L",
2067 gfc_typename (from), gfc_typename (to), where);
2070 gfc_internal_error ("gfc_arith_error(): Bad error code");
2073 /* TODO: Do something about the error, ie, throw exception, return
2078 /* Convert integers to integers. */
2081 gfc_int2int (gfc_expr *src, int kind)
2086 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2088 mpz_set (result->value.integer, src->value.integer);
2090 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2092 if (rc == ARITH_ASYMMETRIC)
2094 gfc_warning (gfc_arith_error (rc), &src->where);
2098 arith_error (rc, &src->ts, &result->ts, &src->where);
2099 gfc_free_expr (result);
2108 /* Convert integers to reals. */
2111 gfc_int2real (gfc_expr *src, int kind)
2116 result = gfc_constant_result (BT_REAL, kind, &src->where);
2118 mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
2120 if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
2122 arith_error (rc, &src->ts, &result->ts, &src->where);
2123 gfc_free_expr (result);
2131 /* Convert default integer to default complex. */
2134 gfc_int2complex (gfc_expr *src, int kind)
2139 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2141 mpfr_set_z (result->value.complex.r, src->value.integer, GFC_RND_MODE);
2142 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2144 if ((rc = gfc_check_real_range (result->value.complex.r, kind)) != ARITH_OK)
2146 arith_error (rc, &src->ts, &result->ts, &src->where);
2147 gfc_free_expr (result);
2155 /* Convert default real to default integer. */
2158 gfc_real2int (gfc_expr *src, int kind)
2163 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2165 gfc_mpfr_to_mpz (result->value.integer, src->value.real);
2167 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2169 arith_error (rc, &src->ts, &result->ts, &src->where);
2170 gfc_free_expr (result);
2178 /* Convert real to real. */
2181 gfc_real2real (gfc_expr *src, int kind)
2186 result = gfc_constant_result (BT_REAL, kind, &src->where);
2188 mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
2190 rc = gfc_check_real_range (result->value.real, kind);
2192 if (rc == ARITH_UNDERFLOW)
2194 if (gfc_option.warn_underflow)
2195 gfc_warning (gfc_arith_error (rc), &src->where);
2196 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2198 else if (rc != ARITH_OK)
2200 arith_error (rc, &src->ts, &result->ts, &src->where);
2201 gfc_free_expr (result);
2209 /* Convert real to complex. */
2212 gfc_real2complex (gfc_expr *src, int kind)
2217 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2219 mpfr_set (result->value.complex.r, src->value.real, GFC_RND_MODE);
2220 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2222 rc = gfc_check_real_range (result->value.complex.r, kind);
2224 if (rc == ARITH_UNDERFLOW)
2226 if (gfc_option.warn_underflow)
2227 gfc_warning (gfc_arith_error (rc), &src->where);
2228 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
2230 else if (rc != ARITH_OK)
2232 arith_error (rc, &src->ts, &result->ts, &src->where);
2233 gfc_free_expr (result);
2241 /* Convert complex to integer. */
2244 gfc_complex2int (gfc_expr *src, int kind)
2249 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2251 gfc_mpfr_to_mpz (result->value.integer, src->value.complex.r);
2253 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2255 arith_error (rc, &src->ts, &result->ts, &src->where);
2256 gfc_free_expr (result);
2264 /* Convert complex to real. */
2267 gfc_complex2real (gfc_expr *src, int kind)
2272 result = gfc_constant_result (BT_REAL, kind, &src->where);
2274 mpfr_set (result->value.real, src->value.complex.r, GFC_RND_MODE);
2276 rc = gfc_check_real_range (result->value.real, kind);
2278 if (rc == ARITH_UNDERFLOW)
2280 if (gfc_option.warn_underflow)
2281 gfc_warning (gfc_arith_error (rc), &src->where);
2282 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2286 arith_error (rc, &src->ts, &result->ts, &src->where);
2287 gfc_free_expr (result);
2295 /* Convert complex to complex. */
2298 gfc_complex2complex (gfc_expr *src, int kind)
2303 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2305 mpfr_set (result->value.complex.r, src->value.complex.r, GFC_RND_MODE);
2306 mpfr_set (result->value.complex.i, src->value.complex.i, GFC_RND_MODE);
2308 rc = gfc_check_real_range (result->value.complex.r, kind);
2310 if (rc == ARITH_UNDERFLOW)
2312 if (gfc_option.warn_underflow)
2313 gfc_warning (gfc_arith_error (rc), &src->where);
2314 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
2316 else if (rc != ARITH_OK)
2318 arith_error (rc, &src->ts, &result->ts, &src->where);
2319 gfc_free_expr (result);
2323 rc = gfc_check_real_range (result->value.complex.i, kind);
2325 if (rc == ARITH_UNDERFLOW)
2327 if (gfc_option.warn_underflow)
2328 gfc_warning (gfc_arith_error (rc), &src->where);
2329 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2331 else if (rc != ARITH_OK)
2333 arith_error (rc, &src->ts, &result->ts, &src->where);
2334 gfc_free_expr (result);
2342 /* Logical kind conversion. */
2345 gfc_log2log (gfc_expr *src, int kind)
2349 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2350 result->value.logical = src->value.logical;
2356 /* Convert logical to integer. */
2359 gfc_log2int (gfc_expr *src, int kind)
2363 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2364 mpz_set_si (result->value.integer, src->value.logical);
2370 /* Convert integer to logical. */
2373 gfc_int2log (gfc_expr *src, int kind)
2377 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2378 result->value.logical = (mpz_cmp_si (src->value.integer, 0) != 0);
2384 /* Helper function to set the representation in a Hollerith conversion.
2385 This assumes that the ts.type and ts.kind of the result have already
2389 hollerith2representation (gfc_expr *result, gfc_expr *src)
2391 int src_len, result_len;
2393 src_len = src->representation.length;
2394 result_len = gfc_target_expr_size (result);
2396 if (src_len > result_len)
2398 gfc_warning ("The Hollerith constant at %L is too long to convert to %s",
2399 &src->where, gfc_typename(&result->ts));
2402 result->representation.string = gfc_getmem (result_len + 1);
2403 memcpy (result->representation.string, src->representation.string,
2404 MIN (result_len, src_len));
2406 if (src_len < result_len)
2407 memset (&result->representation.string[src_len], ' ', result_len - src_len);
2409 result->representation.string[result_len] = '\0'; /* For debugger */
2410 result->representation.length = result_len;
2414 /* Convert Hollerith to integer. The constant will be padded or truncated. */
2417 gfc_hollerith2int (gfc_expr *src, int kind)
2421 result = gfc_get_expr ();
2422 result->expr_type = EXPR_CONSTANT;
2423 result->ts.type = BT_INTEGER;
2424 result->ts.kind = kind;
2425 result->where = src->where;
2427 hollerith2representation (result, src);
2428 gfc_interpret_integer(kind, (unsigned char *) result->representation.string,
2429 result->representation.length, result->value.integer);
2435 /* Convert Hollerith to real. The constant will be padded or truncated. */
2438 gfc_hollerith2real (gfc_expr *src, int kind)
2443 len = src->value.character.length;
2445 result = gfc_get_expr ();
2446 result->expr_type = EXPR_CONSTANT;
2447 result->ts.type = BT_REAL;
2448 result->ts.kind = kind;
2449 result->where = src->where;
2451 hollerith2representation (result, src);
2452 gfc_interpret_float(kind, (unsigned char *) result->representation.string,
2453 result->representation.length, result->value.real);
2459 /* Convert Hollerith to complex. The constant will be padded or truncated. */
2462 gfc_hollerith2complex (gfc_expr *src, int kind)
2467 len = src->value.character.length;
2469 result = gfc_get_expr ();
2470 result->expr_type = EXPR_CONSTANT;
2471 result->ts.type = BT_COMPLEX;
2472 result->ts.kind = kind;
2473 result->where = src->where;
2475 hollerith2representation (result, src);
2476 gfc_interpret_complex(kind, (unsigned char *) result->representation.string,
2477 result->representation.length, result->value.complex.r,
2478 result->value.complex.i);
2484 /* Convert Hollerith to character. */
2487 gfc_hollerith2character (gfc_expr *src, int kind)
2491 result = gfc_copy_expr (src);
2492 result->ts.type = BT_CHARACTER;
2493 result->ts.kind = kind;
2495 result->value.character.string = result->representation.string;
2496 result->value.character.length = result->representation.length;
2502 /* Convert Hollerith to logical. The constant will be padded or truncated. */
2505 gfc_hollerith2logical (gfc_expr *src, int kind)
2510 len = src->value.character.length;
2512 result = gfc_get_expr ();
2513 result->expr_type = EXPR_CONSTANT;
2514 result->ts.type = BT_LOGICAL;
2515 result->ts.kind = kind;
2516 result->where = src->where;
2518 hollerith2representation (result, src);
2519 gfc_interpret_logical(kind, (unsigned char *) result->representation.string,
2520 result->representation.length, &result->value.logical);
2526 /* Returns an initializer whose value is one higher than the value of the
2527 LAST_INITIALIZER argument. If the argument is NULL, the
2528 initializers value will be set to zero. The initializer's kind
2529 will be set to gfc_c_int_kind.
2531 If -fshort-enums is given, the appropriate kind will be selected
2532 later after all enumerators have been parsed. A warning is issued
2533 here if an initializer exceeds gfc_c_int_kind. */
2536 gfc_enum_initializer (gfc_expr *last_initializer, locus where)
2540 result = gfc_get_expr ();
2541 result->expr_type = EXPR_CONSTANT;
2542 result->ts.type = BT_INTEGER;
2543 result->ts.kind = gfc_c_int_kind;
2544 result->where = where;
2546 mpz_init (result->value.integer);
2548 if (last_initializer != NULL)
2550 mpz_add_ui (result->value.integer, last_initializer->value.integer, 1);
2551 result->where = last_initializer->where;
2553 if (gfc_check_integer_range (result->value.integer,
2554 gfc_c_int_kind) != ARITH_OK)
2556 gfc_error ("Enumerator exceeds the C integer type at %C");
2562 /* Control comes here, if it's the very first enumerator and no
2563 initializer has been given. It will be initialized to zero. */
2564 mpz_set_si (result->value.integer, 0);