Merge from the pain train
[official-gcc.git] / gcc / fortran / arith.c
bloba219ed20675da11c1e1fa8d9a31b54c7d09de196
1 /* Compiler arithmetic
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
3 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 2, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
23 /* Since target arithmetic must be done on the host, there has to
24 be some way of evaluating arithmetic expressions as the host
25 would evaluate them. We use the GNU MP library to do arithmetic,
26 and this file provides the interface. */
28 #include "config.h"
29 #include "system.h"
30 #include "flags.h"
31 #include "gfortran.h"
32 #include "arith.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. */
37 void
38 gfc_mpfr_to_mpz (mpz_t z, mpfr_t x)
40 mp_exp_t e;
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))
46 mpz_neg (z, z);
48 if (e > 0)
49 mpz_mul_2exp (z, z, e);
50 else
51 mpz_tdiv_q_2exp (z, z, -e);
55 /* Set the model number precision by the requested KIND. */
57 void
58 gfc_set_model_kind (int kind)
60 int index = gfc_validate_kind (BT_REAL, kind, false);
61 int base2prec;
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. */
72 void
73 gfc_set_model (mpfr_t x)
75 mpfr_set_default_prec (mpfr_get_prec (x));
78 /* Calculate atan2 (y, x)
80 atan2(y, x) = atan(y/x) if x > 0,
81 sign(y)*(pi - atan(|y/x|)) if x < 0,
82 0 if x = 0 && y == 0,
83 sign(y)*pi/2 if x = 0 && y != 0.
86 void
87 arctangent2 (mpfr_t y, mpfr_t x, mpfr_t result)
89 int i;
90 mpfr_t t;
92 gfc_set_model (y);
93 mpfr_init (t);
95 i = mpfr_sgn (x);
97 if (i > 0)
99 mpfr_div (t, y, x, GFC_RND_MODE);
100 mpfr_atan (result, t, GFC_RND_MODE);
102 else if (i < 0)
104 mpfr_const_pi (result, GFC_RND_MODE);
105 mpfr_div (t, y, x, GFC_RND_MODE);
106 mpfr_abs (t, t, GFC_RND_MODE);
107 mpfr_atan (t, t, GFC_RND_MODE);
108 mpfr_sub (result, result, t, GFC_RND_MODE);
109 if (mpfr_sgn (y) < 0)
110 mpfr_neg (result, result, GFC_RND_MODE);
112 else
114 if (mpfr_sgn (y) == 0)
115 mpfr_set_ui (result, 0, GFC_RND_MODE);
116 else
118 mpfr_const_pi (result, GFC_RND_MODE);
119 mpfr_div_ui (result, result, 2, GFC_RND_MODE);
120 if (mpfr_sgn (y) < 0)
121 mpfr_neg (result, result, GFC_RND_MODE);
125 mpfr_clear (t);
130 /* Given an arithmetic error code, return a pointer to a string that
131 explains the error. */
133 static const char *
134 gfc_arith_error (arith code)
136 const char *p;
138 switch (code)
140 case ARITH_OK:
141 p = "Arithmetic OK";
142 break;
143 case ARITH_OVERFLOW:
144 p = "Arithmetic overflow";
145 break;
146 case ARITH_UNDERFLOW:
147 p = "Arithmetic underflow";
148 break;
149 case ARITH_NAN:
150 p = "Arithmetic NaN";
151 break;
152 case ARITH_DIV0:
153 p = "Division by zero";
154 break;
155 case ARITH_0TO0:
156 p = "Indeterminate form 0 ** 0";
157 break;
158 case ARITH_INCOMMENSURATE:
159 p = "Array operands are incommensurate";
160 break;
161 case ARITH_ASYMMETRIC:
162 p = "Integer outside symmetric range implied by Standard Fortran";
163 break;
164 default:
165 gfc_internal_error ("gfc_arith_error(): Bad error code");
168 return p;
172 /* Get things ready to do math. */
174 void
175 gfc_arith_init_1 (void)
177 gfc_integer_info *int_info;
178 gfc_real_info *real_info;
179 mpfr_t a, b, c;
180 mpz_t r;
181 int i;
183 mpfr_set_default_prec (128);
184 mpfr_init (a);
185 mpz_init (r);
187 /* Convert the minimum/maximum values for each kind into their
188 GNU MP representation. */
189 for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
191 /* Huge */
192 mpz_set_ui (r, int_info->radix);
193 mpz_pow_ui (r, r, int_info->digits);
195 mpz_init (int_info->huge);
196 mpz_sub_ui (int_info->huge, r, 1);
198 /* These are the numbers that are actually representable by the
199 target. For bases other than two, this needs to be changed. */
200 if (int_info->radix != 2)
201 gfc_internal_error ("Fix min_int, max_int calculation");
203 /* See PRs 13490 and 17912, related to integer ranges.
204 The pedantic_min_int exists for range checking when a program
205 is compiled with -pedantic, and reflects the belief that
206 Standard Fortran requires integers to be symmetrical, i.e.
207 every negative integer must have a representable positive
208 absolute value, and vice versa. */
210 mpz_init (int_info->pedantic_min_int);
211 mpz_neg (int_info->pedantic_min_int, int_info->huge);
213 mpz_init (int_info->min_int);
214 mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
216 mpz_init (int_info->max_int);
217 mpz_add (int_info->max_int, int_info->huge, int_info->huge);
218 mpz_add_ui (int_info->max_int, int_info->max_int, 1);
220 /* Range */
221 mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
222 mpfr_log10 (a, a, GFC_RND_MODE);
223 mpfr_trunc (a, a);
224 gfc_mpfr_to_mpz (r, a);
225 int_info->range = mpz_get_si (r);
228 mpfr_clear (a);
230 for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
232 gfc_set_model_kind (real_info->kind);
234 mpfr_init (a);
235 mpfr_init (b);
236 mpfr_init (c);
238 /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
239 /* a = 1 - b**(-p) */
240 mpfr_set_ui (a, 1, GFC_RND_MODE);
241 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
242 mpfr_pow_si (b, b, -real_info->digits, GFC_RND_MODE);
243 mpfr_sub (a, a, b, GFC_RND_MODE);
245 /* c = b**(emax-1) */
246 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
247 mpfr_pow_ui (c, b, real_info->max_exponent - 1, GFC_RND_MODE);
249 /* a = a * c = (1 - b**(-p)) * b**(emax-1) */
250 mpfr_mul (a, a, c, GFC_RND_MODE);
252 /* a = (1 - b**(-p)) * b**(emax-1) * b */
253 mpfr_mul_ui (a, a, real_info->radix, GFC_RND_MODE);
255 mpfr_init (real_info->huge);
256 mpfr_set (real_info->huge, a, GFC_RND_MODE);
258 /* tiny(x) = b**(emin-1) */
259 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
260 mpfr_pow_si (b, b, real_info->min_exponent - 1, GFC_RND_MODE);
262 mpfr_init (real_info->tiny);
263 mpfr_set (real_info->tiny, b, GFC_RND_MODE);
265 /* epsilon(x) = b**(1-p) */
266 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
267 mpfr_pow_si (b, b, 1 - real_info->digits, GFC_RND_MODE);
269 mpfr_init (real_info->epsilon);
270 mpfr_set (real_info->epsilon, b, GFC_RND_MODE);
272 /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
273 mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
274 mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
275 mpfr_neg (b, b, GFC_RND_MODE);
277 if (mpfr_cmp (a, b) > 0)
278 mpfr_set (a, b, GFC_RND_MODE); /* a = min(a, b) */
280 mpfr_trunc (a, a);
281 gfc_mpfr_to_mpz (r, a);
282 real_info->range = mpz_get_si (r);
284 /* precision(x) = int((p - 1) * log10(b)) + k */
285 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
286 mpfr_log10 (a, a, GFC_RND_MODE);
288 mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
289 mpfr_trunc (a, a);
290 gfc_mpfr_to_mpz (r, a);
291 real_info->precision = mpz_get_si (r);
293 /* If the radix is an integral power of 10, add one to the
294 precision. */
295 for (i = 10; i <= real_info->radix; i *= 10)
296 if (i == real_info->radix)
297 real_info->precision++;
299 mpfr_clear (a);
300 mpfr_clear (b);
301 mpfr_clear (c);
304 mpz_clear (r);
308 /* Clean up, get rid of numeric constants. */
310 void
311 gfc_arith_done_1 (void)
313 gfc_integer_info *ip;
314 gfc_real_info *rp;
316 for (ip = gfc_integer_kinds; ip->kind; ip++)
318 mpz_clear (ip->min_int);
319 mpz_clear (ip->max_int);
320 mpz_clear (ip->huge);
323 for (rp = gfc_real_kinds; rp->kind; rp++)
325 mpfr_clear (rp->epsilon);
326 mpfr_clear (rp->huge);
327 mpfr_clear (rp->tiny);
332 /* Given an integer and a kind, make sure that the integer lies within
333 the range of the kind. Returns ARITH_OK, ARITH_ASYMMETRIC or
334 ARITH_OVERFLOW. */
336 static arith
337 gfc_check_integer_range (mpz_t p, int kind)
339 arith result;
340 int i;
342 i = gfc_validate_kind (BT_INTEGER, kind, false);
343 result = ARITH_OK;
345 if (pedantic)
347 if (mpz_cmp (p, gfc_integer_kinds[i].pedantic_min_int) < 0)
348 result = ARITH_ASYMMETRIC;
351 if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
352 || mpz_cmp (p, gfc_integer_kinds[i].max_int) > 0)
353 result = ARITH_OVERFLOW;
355 return result;
359 /* Given a real and a kind, make sure that the real lies within the
360 range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
361 ARITH_UNDERFLOW. */
363 static arith
364 gfc_check_real_range (mpfr_t p, int kind)
366 arith retval;
367 mpfr_t q;
368 int i;
370 i = gfc_validate_kind (BT_REAL, kind, false);
372 gfc_set_model (p);
373 mpfr_init (q);
374 mpfr_abs (q, p, GFC_RND_MODE);
376 retval = ARITH_OK;
377 if (mpfr_sgn (q) == 0)
378 goto done;
380 if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
382 retval = ARITH_OVERFLOW;
383 goto done;
386 if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
387 retval = ARITH_UNDERFLOW;
389 done:
390 mpfr_clear (q);
392 return retval;
396 /* Function to return a constant expression node of a given type and
397 kind. */
399 gfc_expr *
400 gfc_constant_result (bt type, int kind, locus * where)
402 gfc_expr *result;
404 if (!where)
405 gfc_internal_error
406 ("gfc_constant_result(): locus 'where' cannot be NULL");
408 result = gfc_get_expr ();
410 result->expr_type = EXPR_CONSTANT;
411 result->ts.type = type;
412 result->ts.kind = kind;
413 result->where = *where;
415 switch (type)
417 case BT_INTEGER:
418 mpz_init (result->value.integer);
419 break;
421 case BT_REAL:
422 gfc_set_model_kind (kind);
423 mpfr_init (result->value.real);
424 break;
426 case BT_COMPLEX:
427 gfc_set_model_kind (kind);
428 mpfr_init (result->value.complex.r);
429 mpfr_init (result->value.complex.i);
430 break;
432 default:
433 break;
436 return result;
440 /* Low-level arithmetic functions. All of these subroutines assume
441 that all operands are of the same type and return an operand of the
442 same type. The other thing about these subroutines is that they
443 can fail in various ways -- overflow, underflow, division by zero,
444 zero raised to the zero, etc. */
446 static arith
447 gfc_arith_not (gfc_expr * op1, gfc_expr ** resultp)
449 gfc_expr *result;
451 result = gfc_constant_result (BT_LOGICAL, op1->ts.kind, &op1->where);
452 result->value.logical = !op1->value.logical;
453 *resultp = result;
455 return ARITH_OK;
459 static arith
460 gfc_arith_and (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
462 gfc_expr *result;
464 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
465 &op1->where);
466 result->value.logical = op1->value.logical && op2->value.logical;
467 *resultp = result;
469 return ARITH_OK;
473 static arith
474 gfc_arith_or (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
476 gfc_expr *result;
478 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
479 &op1->where);
480 result->value.logical = op1->value.logical || op2->value.logical;
481 *resultp = result;
483 return ARITH_OK;
487 static arith
488 gfc_arith_eqv (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
490 gfc_expr *result;
492 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
493 &op1->where);
494 result->value.logical = op1->value.logical == op2->value.logical;
495 *resultp = result;
497 return ARITH_OK;
501 static arith
502 gfc_arith_neqv (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
504 gfc_expr *result;
506 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
507 &op1->where);
508 result->value.logical = op1->value.logical != op2->value.logical;
509 *resultp = result;
511 return ARITH_OK;
515 /* Make sure a constant numeric expression is within the range for
516 its type and kind. Note that there's also a gfc_check_range(),
517 but that one deals with the intrinsic RANGE function. */
519 arith
520 gfc_range_check (gfc_expr * e)
522 arith rc;
524 switch (e->ts.type)
526 case BT_INTEGER:
527 rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
528 break;
530 case BT_REAL:
531 rc = gfc_check_real_range (e->value.real, e->ts.kind);
532 if (rc == ARITH_UNDERFLOW)
533 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
534 break;
536 case BT_COMPLEX:
537 rc = gfc_check_real_range (e->value.complex.r, e->ts.kind);
538 if (rc == ARITH_UNDERFLOW)
539 mpfr_set_ui (e->value.complex.r, 0, GFC_RND_MODE);
540 if (rc == ARITH_OK || rc == ARITH_UNDERFLOW)
542 rc = gfc_check_real_range (e->value.complex.i, e->ts.kind);
543 if (rc == ARITH_UNDERFLOW)
544 mpfr_set_ui (e->value.complex.i, 0, GFC_RND_MODE);
547 break;
549 default:
550 gfc_internal_error ("gfc_range_check(): Bad type");
553 return rc;
557 /* It may seem silly to have a subroutine that actually computes the
558 unary plus of a constant, but it prevents us from making exceptions
559 in the code elsewhere. */
561 static arith
562 gfc_arith_uplus (gfc_expr * op1, gfc_expr ** resultp)
564 *resultp = gfc_copy_expr (op1);
565 return ARITH_OK;
569 static arith
570 gfc_arith_uminus (gfc_expr * op1, gfc_expr ** resultp)
572 gfc_expr *result;
573 arith rc;
575 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
577 switch (op1->ts.type)
579 case BT_INTEGER:
580 mpz_neg (result->value.integer, op1->value.integer);
581 break;
583 case BT_REAL:
584 mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
585 break;
587 case BT_COMPLEX:
588 mpfr_neg (result->value.complex.r, op1->value.complex.r, GFC_RND_MODE);
589 mpfr_neg (result->value.complex.i, op1->value.complex.i, GFC_RND_MODE);
590 break;
592 default:
593 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
596 rc = gfc_range_check (result);
598 if (rc == ARITH_UNDERFLOW)
600 if (gfc_option.warn_underflow)
601 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
602 rc = ARITH_OK;
603 *resultp = result;
605 else if (rc == ARITH_ASYMMETRIC)
607 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
608 rc = ARITH_OK;
609 *resultp = result;
611 else if (rc != ARITH_OK)
612 gfc_free_expr (result);
613 else
614 *resultp = result;
616 return rc;
620 static arith
621 gfc_arith_plus (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
623 gfc_expr *result;
624 arith rc;
626 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
628 switch (op1->ts.type)
630 case BT_INTEGER:
631 mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
632 break;
634 case BT_REAL:
635 mpfr_add (result->value.real, op1->value.real, op2->value.real,
636 GFC_RND_MODE);
637 break;
639 case BT_COMPLEX:
640 mpfr_add (result->value.complex.r, op1->value.complex.r,
641 op2->value.complex.r, GFC_RND_MODE);
643 mpfr_add (result->value.complex.i, op1->value.complex.i,
644 op2->value.complex.i, GFC_RND_MODE);
645 break;
647 default:
648 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
651 rc = gfc_range_check (result);
653 if (rc == ARITH_UNDERFLOW)
655 if (gfc_option.warn_underflow)
656 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
657 rc = ARITH_OK;
658 *resultp = result;
660 else if (rc == ARITH_ASYMMETRIC)
662 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
663 rc = ARITH_OK;
664 *resultp = result;
666 else if (rc != ARITH_OK)
667 gfc_free_expr (result);
668 else
669 *resultp = result;
671 return rc;
675 static arith
676 gfc_arith_minus (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
678 gfc_expr *result;
679 arith rc;
681 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
683 switch (op1->ts.type)
685 case BT_INTEGER:
686 mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
687 break;
689 case BT_REAL:
690 mpfr_sub (result->value.real, op1->value.real, op2->value.real,
691 GFC_RND_MODE);
692 break;
694 case BT_COMPLEX:
695 mpfr_sub (result->value.complex.r, op1->value.complex.r,
696 op2->value.complex.r, GFC_RND_MODE);
698 mpfr_sub (result->value.complex.i, op1->value.complex.i,
699 op2->value.complex.i, GFC_RND_MODE);
700 break;
702 default:
703 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
706 rc = gfc_range_check (result);
708 if (rc == ARITH_UNDERFLOW)
710 if (gfc_option.warn_underflow)
711 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
712 rc = ARITH_OK;
713 *resultp = result;
715 else if (rc == ARITH_ASYMMETRIC)
717 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
718 rc = ARITH_OK;
719 *resultp = result;
721 else if (rc != ARITH_OK)
722 gfc_free_expr (result);
723 else
724 *resultp = result;
726 return rc;
730 static arith
731 gfc_arith_times (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
733 gfc_expr *result;
734 mpfr_t x, y;
735 arith rc;
737 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
739 switch (op1->ts.type)
741 case BT_INTEGER:
742 mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
743 break;
745 case BT_REAL:
746 mpfr_mul (result->value.real, op1->value.real, op2->value.real,
747 GFC_RND_MODE);
748 break;
750 case BT_COMPLEX:
752 /* FIXME: possible numericals problem. */
754 gfc_set_model (op1->value.complex.r);
755 mpfr_init (x);
756 mpfr_init (y);
758 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
759 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
760 mpfr_sub (result->value.complex.r, x, y, GFC_RND_MODE);
762 mpfr_mul (x, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
763 mpfr_mul (y, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
764 mpfr_add (result->value.complex.i, x, y, GFC_RND_MODE);
766 mpfr_clear (x);
767 mpfr_clear (y);
769 break;
771 default:
772 gfc_internal_error ("gfc_arith_times(): Bad basic type");
775 rc = gfc_range_check (result);
777 if (rc == ARITH_UNDERFLOW)
779 if (gfc_option.warn_underflow)
780 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
781 rc = ARITH_OK;
782 *resultp = result;
784 else if (rc == ARITH_ASYMMETRIC)
786 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
787 rc = ARITH_OK;
788 *resultp = result;
790 else if (rc != ARITH_OK)
791 gfc_free_expr (result);
792 else
793 *resultp = result;
795 return rc;
799 static arith
800 gfc_arith_divide (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
802 gfc_expr *result;
803 mpfr_t x, y, div;
804 arith rc;
806 rc = ARITH_OK;
808 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
810 switch (op1->ts.type)
812 case BT_INTEGER:
813 if (mpz_sgn (op2->value.integer) == 0)
815 rc = ARITH_DIV0;
816 break;
819 mpz_tdiv_q (result->value.integer, op1->value.integer,
820 op2->value.integer);
821 break;
823 case BT_REAL:
824 /* FIXME: MPFR correctly generates NaN. This may not be needed. */
825 if (mpfr_sgn (op2->value.real) == 0)
827 rc = ARITH_DIV0;
828 break;
831 mpfr_div (result->value.real, op1->value.real, op2->value.real,
832 GFC_RND_MODE);
833 break;
835 case BT_COMPLEX:
836 /* FIXME: MPFR correctly generates NaN. This may not be needed. */
837 if (mpfr_sgn (op2->value.complex.r) == 0
838 && mpfr_sgn (op2->value.complex.i) == 0)
840 rc = ARITH_DIV0;
841 break;
844 gfc_set_model (op1->value.complex.r);
845 mpfr_init (x);
846 mpfr_init (y);
847 mpfr_init (div);
849 /* FIXME: possible numerical problems. */
850 mpfr_mul (x, op2->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
851 mpfr_mul (y, op2->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
852 mpfr_add (div, x, y, GFC_RND_MODE);
854 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
855 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
856 mpfr_add (result->value.complex.r, x, y, GFC_RND_MODE);
857 mpfr_div (result->value.complex.r, result->value.complex.r, div,
858 GFC_RND_MODE);
860 mpfr_mul (x, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
861 mpfr_mul (y, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
862 mpfr_sub (result->value.complex.i, x, y, GFC_RND_MODE);
863 mpfr_div (result->value.complex.i, result->value.complex.i, div,
864 GFC_RND_MODE);
866 mpfr_clear (x);
867 mpfr_clear (y);
868 mpfr_clear (div);
870 break;
872 default:
873 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
876 if (rc == ARITH_OK)
877 rc = gfc_range_check (result);
879 if (rc == ARITH_UNDERFLOW)
881 if (gfc_option.warn_underflow)
882 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
883 rc = ARITH_OK;
884 *resultp = result;
886 else if (rc == ARITH_ASYMMETRIC)
888 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
889 rc = ARITH_OK;
890 *resultp = result;
892 else if (rc != ARITH_OK)
893 gfc_free_expr (result);
894 else
895 *resultp = result;
897 return rc;
901 /* Compute the reciprocal of a complex number (guaranteed nonzero). */
903 static void
904 complex_reciprocal (gfc_expr * op)
906 mpfr_t mod, a, re, im;
908 gfc_set_model (op->value.complex.r);
909 mpfr_init (mod);
910 mpfr_init (a);
911 mpfr_init (re);
912 mpfr_init (im);
914 /* FIXME: another possible numerical problem. */
915 mpfr_mul (mod, op->value.complex.r, op->value.complex.r, GFC_RND_MODE);
916 mpfr_mul (a, op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
917 mpfr_add (mod, mod, a, GFC_RND_MODE);
919 mpfr_div (re, op->value.complex.r, mod, GFC_RND_MODE);
921 mpfr_neg (im, op->value.complex.i, GFC_RND_MODE);
922 mpfr_div (im, im, mod, GFC_RND_MODE);
924 mpfr_set (op->value.complex.r, re, GFC_RND_MODE);
925 mpfr_set (op->value.complex.i, im, GFC_RND_MODE);
927 mpfr_clear (re);
928 mpfr_clear (im);
929 mpfr_clear (mod);
930 mpfr_clear (a);
934 /* Raise a complex number to positive power. */
936 static void
937 complex_pow_ui (gfc_expr * base, int power, gfc_expr * result)
939 mpfr_t re, im, a;
941 gfc_set_model (base->value.complex.r);
942 mpfr_init (re);
943 mpfr_init (im);
944 mpfr_init (a);
946 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
947 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
949 for (; power > 0; power--)
951 mpfr_mul (re, base->value.complex.r, result->value.complex.r,
952 GFC_RND_MODE);
953 mpfr_mul (a, base->value.complex.i, result->value.complex.i,
954 GFC_RND_MODE);
955 mpfr_sub (re, re, a, GFC_RND_MODE);
957 mpfr_mul (im, base->value.complex.r, result->value.complex.i,
958 GFC_RND_MODE);
959 mpfr_mul (a, base->value.complex.i, result->value.complex.r,
960 GFC_RND_MODE);
961 mpfr_add (im, im, a, GFC_RND_MODE);
963 mpfr_set (result->value.complex.r, re, GFC_RND_MODE);
964 mpfr_set (result->value.complex.i, im, GFC_RND_MODE);
967 mpfr_clear (re);
968 mpfr_clear (im);
969 mpfr_clear (a);
973 /* Raise a number to an integer power. */
975 static arith
976 gfc_arith_power (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
978 int power, apower;
979 gfc_expr *result;
980 mpz_t unity_z;
981 mpfr_t unity_f;
982 arith rc;
984 rc = ARITH_OK;
986 if (gfc_extract_int (op2, &power) != NULL)
987 gfc_internal_error ("gfc_arith_power(): Bad exponent");
989 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
991 if (power == 0)
992 { /* Handle something to the zeroth power */
993 switch (op1->ts.type)
995 case BT_INTEGER:
996 if (mpz_sgn (op1->value.integer) == 0)
997 rc = ARITH_0TO0;
998 else
999 mpz_set_ui (result->value.integer, 1);
1000 break;
1002 case BT_REAL:
1003 if (mpfr_sgn (op1->value.real) == 0)
1004 rc = ARITH_0TO0;
1005 else
1006 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
1007 break;
1009 case BT_COMPLEX:
1010 if (mpfr_sgn (op1->value.complex.r) == 0
1011 && mpfr_sgn (op1->value.complex.i) == 0)
1012 rc = ARITH_0TO0;
1013 else
1015 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
1016 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
1019 break;
1021 default:
1022 gfc_internal_error ("gfc_arith_power(): Bad base");
1025 else
1027 apower = power;
1028 if (power < 0)
1029 apower = -power;
1031 switch (op1->ts.type)
1033 case BT_INTEGER:
1034 mpz_pow_ui (result->value.integer, op1->value.integer, apower);
1036 if (power < 0)
1038 mpz_init_set_ui (unity_z, 1);
1039 mpz_tdiv_q (result->value.integer, unity_z,
1040 result->value.integer);
1041 mpz_clear (unity_z);
1044 break;
1046 case BT_REAL:
1047 mpfr_pow_ui (result->value.real, op1->value.real, apower,
1048 GFC_RND_MODE);
1050 if (power < 0)
1052 gfc_set_model (op1->value.real);
1053 mpfr_init (unity_f);
1054 mpfr_set_ui (unity_f, 1, GFC_RND_MODE);
1055 mpfr_div (result->value.real, unity_f, result->value.real,
1056 GFC_RND_MODE);
1057 mpfr_clear (unity_f);
1059 break;
1061 case BT_COMPLEX:
1062 complex_pow_ui (op1, apower, result);
1063 if (power < 0)
1064 complex_reciprocal (result);
1065 break;
1067 default:
1068 break;
1072 if (rc == ARITH_OK)
1073 rc = gfc_range_check (result);
1075 if (rc == ARITH_UNDERFLOW)
1077 if (gfc_option.warn_underflow)
1078 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
1079 rc = ARITH_OK;
1080 *resultp = result;
1082 else if (rc == ARITH_ASYMMETRIC)
1084 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
1085 rc = ARITH_OK;
1086 *resultp = result;
1088 else if (rc != ARITH_OK)
1089 gfc_free_expr (result);
1090 else
1091 *resultp = result;
1093 return rc;
1097 /* Concatenate two string constants. */
1099 static arith
1100 gfc_arith_concat (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1102 gfc_expr *result;
1103 int len;
1105 result = gfc_constant_result (BT_CHARACTER, gfc_default_character_kind,
1106 &op1->where);
1108 len = op1->value.character.length + op2->value.character.length;
1110 result->value.character.string = gfc_getmem (len + 1);
1111 result->value.character.length = len;
1113 memcpy (result->value.character.string, op1->value.character.string,
1114 op1->value.character.length);
1116 memcpy (result->value.character.string + op1->value.character.length,
1117 op2->value.character.string, op2->value.character.length);
1119 result->value.character.string[len] = '\0';
1121 *resultp = result;
1123 return ARITH_OK;
1127 /* Comparison operators. Assumes that the two expression nodes
1128 contain two constants of the same type. */
1131 gfc_compare_expr (gfc_expr * op1, gfc_expr * op2)
1133 int rc;
1135 switch (op1->ts.type)
1137 case BT_INTEGER:
1138 rc = mpz_cmp (op1->value.integer, op2->value.integer);
1139 break;
1141 case BT_REAL:
1142 rc = mpfr_cmp (op1->value.real, op2->value.real);
1143 break;
1145 case BT_CHARACTER:
1146 rc = gfc_compare_string (op1, op2, NULL);
1147 break;
1149 case BT_LOGICAL:
1150 rc = ((!op1->value.logical && op2->value.logical)
1151 || (op1->value.logical && !op2->value.logical));
1152 break;
1154 default:
1155 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1158 return rc;
1162 /* Compare a pair of complex numbers. Naturally, this is only for
1163 equality/nonequality. */
1165 static int
1166 compare_complex (gfc_expr * op1, gfc_expr * op2)
1168 return (mpfr_cmp (op1->value.complex.r, op2->value.complex.r) == 0
1169 && mpfr_cmp (op1->value.complex.i, op2->value.complex.i) == 0);
1173 /* Given two constant strings and the inverse collating sequence,
1174 compare the strings. We return -1 for a<b, 0 for a==b and 1 for
1175 a>b. If the xcoll_table is NULL, we use the processor's default
1176 collating sequence. */
1179 gfc_compare_string (gfc_expr * a, gfc_expr * b, const int *xcoll_table)
1181 int len, alen, blen, i, ac, bc;
1183 alen = a->value.character.length;
1184 blen = b->value.character.length;
1186 len = (alen > blen) ? alen : blen;
1188 for (i = 0; i < len; i++)
1190 ac = (i < alen) ? a->value.character.string[i] : ' ';
1191 bc = (i < blen) ? b->value.character.string[i] : ' ';
1193 if (xcoll_table != NULL)
1195 ac = xcoll_table[ac];
1196 bc = xcoll_table[bc];
1199 if (ac < bc)
1200 return -1;
1201 if (ac > bc)
1202 return 1;
1205 /* Strings are equal */
1207 return 0;
1211 /* Specific comparison subroutines. */
1213 static arith
1214 gfc_arith_eq (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1216 gfc_expr *result;
1218 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1219 &op1->where);
1220 result->value.logical = (op1->ts.type == BT_COMPLEX) ?
1221 compare_complex (op1, op2) : (gfc_compare_expr (op1, op2) == 0);
1223 *resultp = result;
1224 return ARITH_OK;
1228 static arith
1229 gfc_arith_ne (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1231 gfc_expr *result;
1233 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1234 &op1->where);
1235 result->value.logical = (op1->ts.type == BT_COMPLEX) ?
1236 !compare_complex (op1, op2) : (gfc_compare_expr (op1, op2) != 0);
1238 *resultp = result;
1239 return ARITH_OK;
1243 static arith
1244 gfc_arith_gt (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1246 gfc_expr *result;
1248 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1249 &op1->where);
1250 result->value.logical = (gfc_compare_expr (op1, op2) > 0);
1251 *resultp = result;
1253 return ARITH_OK;
1257 static arith
1258 gfc_arith_ge (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1260 gfc_expr *result;
1262 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1263 &op1->where);
1264 result->value.logical = (gfc_compare_expr (op1, op2) >= 0);
1265 *resultp = result;
1267 return ARITH_OK;
1271 static arith
1272 gfc_arith_lt (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1274 gfc_expr *result;
1276 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1277 &op1->where);
1278 result->value.logical = (gfc_compare_expr (op1, op2) < 0);
1279 *resultp = result;
1281 return ARITH_OK;
1285 static arith
1286 gfc_arith_le (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1288 gfc_expr *result;
1290 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1291 &op1->where);
1292 result->value.logical = (gfc_compare_expr (op1, op2) <= 0);
1293 *resultp = result;
1295 return ARITH_OK;
1299 static arith
1300 reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr * op,
1301 gfc_expr ** result)
1303 gfc_constructor *c, *head;
1304 gfc_expr *r;
1305 arith rc;
1307 if (op->expr_type == EXPR_CONSTANT)
1308 return eval (op, result);
1310 rc = ARITH_OK;
1311 head = gfc_copy_constructor (op->value.constructor);
1313 for (c = head; c; c = c->next)
1315 rc = eval (c->expr, &r);
1316 if (rc != ARITH_OK)
1317 break;
1319 gfc_replace_expr (c->expr, r);
1322 if (rc != ARITH_OK)
1323 gfc_free_constructor (head);
1324 else
1326 r = gfc_get_expr ();
1327 r->expr_type = EXPR_ARRAY;
1328 r->value.constructor = head;
1329 r->shape = gfc_copy_shape (op->shape, op->rank);
1331 r->ts = head->expr->ts;
1332 r->where = op->where;
1333 r->rank = op->rank;
1335 *result = r;
1338 return rc;
1342 static arith
1343 reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1344 gfc_expr * op1, gfc_expr * op2,
1345 gfc_expr ** result)
1347 gfc_constructor *c, *head;
1348 gfc_expr *r;
1349 arith rc;
1351 head = gfc_copy_constructor (op1->value.constructor);
1352 rc = ARITH_OK;
1354 for (c = head; c; c = c->next)
1356 rc = eval (c->expr, op2, &r);
1357 if (rc != ARITH_OK)
1358 break;
1360 gfc_replace_expr (c->expr, r);
1363 if (rc != ARITH_OK)
1364 gfc_free_constructor (head);
1365 else
1367 r = gfc_get_expr ();
1368 r->expr_type = EXPR_ARRAY;
1369 r->value.constructor = head;
1370 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1372 r->ts = head->expr->ts;
1373 r->where = op1->where;
1374 r->rank = op1->rank;
1376 *result = r;
1379 return rc;
1383 static arith
1384 reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1385 gfc_expr * op1, gfc_expr * op2,
1386 gfc_expr ** result)
1388 gfc_constructor *c, *head;
1389 gfc_expr *r;
1390 arith rc;
1392 head = gfc_copy_constructor (op2->value.constructor);
1393 rc = ARITH_OK;
1395 for (c = head; c; c = c->next)
1397 rc = eval (op1, c->expr, &r);
1398 if (rc != ARITH_OK)
1399 break;
1401 gfc_replace_expr (c->expr, r);
1404 if (rc != ARITH_OK)
1405 gfc_free_constructor (head);
1406 else
1408 r = gfc_get_expr ();
1409 r->expr_type = EXPR_ARRAY;
1410 r->value.constructor = head;
1411 r->shape = gfc_copy_shape (op2->shape, op2->rank);
1413 r->ts = head->expr->ts;
1414 r->where = op2->where;
1415 r->rank = op2->rank;
1417 *result = r;
1420 return rc;
1424 static arith
1425 reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1426 gfc_expr * op1, gfc_expr * op2,
1427 gfc_expr ** result)
1429 gfc_constructor *c, *d, *head;
1430 gfc_expr *r;
1431 arith rc;
1433 head = gfc_copy_constructor (op1->value.constructor);
1435 rc = ARITH_OK;
1436 d = op2->value.constructor;
1438 if (gfc_check_conformance ("Elemental binary operation", op1, op2)
1439 != SUCCESS)
1440 rc = ARITH_INCOMMENSURATE;
1441 else
1444 for (c = head; c; c = c->next, d = d->next)
1446 if (d == NULL)
1448 rc = ARITH_INCOMMENSURATE;
1449 break;
1452 rc = eval (c->expr, d->expr, &r);
1453 if (rc != ARITH_OK)
1454 break;
1456 gfc_replace_expr (c->expr, r);
1459 if (d != NULL)
1460 rc = ARITH_INCOMMENSURATE;
1463 if (rc != ARITH_OK)
1464 gfc_free_constructor (head);
1465 else
1467 r = gfc_get_expr ();
1468 r->expr_type = EXPR_ARRAY;
1469 r->value.constructor = head;
1470 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1472 r->ts = head->expr->ts;
1473 r->where = op1->where;
1474 r->rank = op1->rank;
1476 *result = r;
1479 return rc;
1483 static arith
1484 reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1485 gfc_expr * op1, gfc_expr * op2,
1486 gfc_expr ** result)
1488 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1489 return eval (op1, op2, result);
1491 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1492 return reduce_binary_ca (eval, op1, op2, result);
1494 if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1495 return reduce_binary_ac (eval, op1, op2, result);
1497 return reduce_binary_aa (eval, op1, op2, result);
1501 typedef union
1503 arith (*f2)(gfc_expr *, gfc_expr **);
1504 arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1506 eval_f;
1508 /* High level arithmetic subroutines. These subroutines go into
1509 eval_intrinsic(), which can do one of several things to its
1510 operands. If the operands are incompatible with the intrinsic
1511 operation, we return a node pointing to the operands and hope that
1512 an operator interface is found during resolution.
1514 If the operands are compatible and are constants, then we try doing
1515 the arithmetic. We also handle the cases where either or both
1516 operands are array constructors. */
1518 static gfc_expr *
1519 eval_intrinsic (gfc_intrinsic_op operator,
1520 eval_f eval, gfc_expr * op1, gfc_expr * op2)
1522 gfc_expr temp, *result;
1523 int unary;
1524 arith rc;
1526 gfc_clear_ts (&temp.ts);
1528 switch (operator)
1530 case INTRINSIC_NOT: /* Logical unary */
1531 if (op1->ts.type != BT_LOGICAL)
1532 goto runtime;
1534 temp.ts.type = BT_LOGICAL;
1535 temp.ts.kind = gfc_default_logical_kind;
1537 unary = 1;
1538 break;
1540 /* Logical binary operators */
1541 case INTRINSIC_OR:
1542 case INTRINSIC_AND:
1543 case INTRINSIC_NEQV:
1544 case INTRINSIC_EQV:
1545 if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1546 goto runtime;
1548 temp.ts.type = BT_LOGICAL;
1549 temp.ts.kind = gfc_default_logical_kind;
1551 unary = 0;
1552 break;
1554 case INTRINSIC_UPLUS:
1555 case INTRINSIC_UMINUS: /* Numeric unary */
1556 if (!gfc_numeric_ts (&op1->ts))
1557 goto runtime;
1559 temp.ts = op1->ts;
1561 unary = 1;
1562 break;
1564 case INTRINSIC_GE:
1565 case INTRINSIC_LT: /* Additional restrictions */
1566 case INTRINSIC_LE: /* for ordering relations. */
1567 case INTRINSIC_GT:
1568 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1570 temp.ts.type = BT_LOGICAL;
1571 temp.ts.kind = gfc_default_logical_kind;
1572 goto runtime;
1575 /* else fall through */
1577 case INTRINSIC_EQ:
1578 case INTRINSIC_NE:
1579 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1581 unary = 0;
1582 temp.ts.type = BT_LOGICAL;
1583 temp.ts.kind = gfc_default_logical_kind;
1584 break;
1587 /* else fall through */
1589 case INTRINSIC_PLUS:
1590 case INTRINSIC_MINUS:
1591 case INTRINSIC_TIMES:
1592 case INTRINSIC_DIVIDE:
1593 case INTRINSIC_POWER: /* Numeric binary */
1594 if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1595 goto runtime;
1597 /* Insert any necessary type conversions to make the operands compatible. */
1599 temp.expr_type = EXPR_OP;
1600 gfc_clear_ts (&temp.ts);
1601 temp.value.op.operator = operator;
1603 temp.value.op.op1 = op1;
1604 temp.value.op.op2 = op2;
1606 gfc_type_convert_binary (&temp);
1608 if (operator == INTRINSIC_EQ || operator == INTRINSIC_NE
1609 || operator == INTRINSIC_GE || operator == INTRINSIC_GT
1610 || operator == INTRINSIC_LE || operator == INTRINSIC_LT)
1612 temp.ts.type = BT_LOGICAL;
1613 temp.ts.kind = gfc_default_logical_kind;
1616 unary = 0;
1617 break;
1619 case INTRINSIC_CONCAT: /* Character binary */
1620 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER)
1621 goto runtime;
1623 temp.ts.type = BT_CHARACTER;
1624 temp.ts.kind = gfc_default_character_kind;
1626 unary = 0;
1627 break;
1629 case INTRINSIC_USER:
1630 goto runtime;
1632 default:
1633 gfc_internal_error ("eval_intrinsic(): Bad operator");
1636 /* Try to combine the operators. */
1637 if (operator == INTRINSIC_POWER && op2->ts.type != BT_INTEGER)
1638 goto runtime;
1640 if (op1->expr_type != EXPR_CONSTANT
1641 && (op1->expr_type != EXPR_ARRAY
1642 || !gfc_is_constant_expr (op1)
1643 || !gfc_expanded_ac (op1)))
1644 goto runtime;
1646 if (op2 != NULL
1647 && op2->expr_type != EXPR_CONSTANT
1648 && (op2->expr_type != EXPR_ARRAY
1649 || !gfc_is_constant_expr (op2)
1650 || !gfc_expanded_ac (op2)))
1651 goto runtime;
1653 if (unary)
1654 rc = reduce_unary (eval.f2, op1, &result);
1655 else
1656 rc = reduce_binary (eval.f3, op1, op2, &result);
1658 if (rc != ARITH_OK)
1659 { /* Something went wrong */
1660 gfc_error ("%s at %L", gfc_arith_error (rc), &op1->where);
1661 return NULL;
1664 gfc_free_expr (op1);
1665 gfc_free_expr (op2);
1666 return result;
1668 runtime:
1669 /* Create a run-time expression */
1670 result = gfc_get_expr ();
1671 result->ts = temp.ts;
1673 result->expr_type = EXPR_OP;
1674 result->value.op.operator = operator;
1676 result->value.op.op1 = op1;
1677 result->value.op.op2 = op2;
1679 result->where = op1->where;
1681 return result;
1685 /* Modify type of expression for zero size array. */
1686 static gfc_expr *
1687 eval_type_intrinsic0 (gfc_intrinsic_op operator, gfc_expr *op)
1689 if (op == NULL)
1690 gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1692 switch (operator)
1694 case INTRINSIC_GE:
1695 case INTRINSIC_LT:
1696 case INTRINSIC_LE:
1697 case INTRINSIC_GT:
1698 case INTRINSIC_EQ:
1699 case INTRINSIC_NE:
1700 op->ts.type = BT_LOGICAL;
1701 op->ts.kind = gfc_default_logical_kind;
1702 break;
1704 default:
1705 break;
1708 return op;
1712 /* Return nonzero if the expression is a zero size array. */
1714 static int
1715 gfc_zero_size_array (gfc_expr * e)
1717 if (e->expr_type != EXPR_ARRAY)
1718 return 0;
1720 return e->value.constructor == NULL;
1724 /* Reduce a binary expression where at least one of the operands
1725 involves a zero-length array. Returns NULL if neither of the
1726 operands is a zero-length array. */
1728 static gfc_expr *
1729 reduce_binary0 (gfc_expr * op1, gfc_expr * op2)
1731 if (gfc_zero_size_array (op1))
1733 gfc_free_expr (op2);
1734 return op1;
1737 if (gfc_zero_size_array (op2))
1739 gfc_free_expr (op1);
1740 return op2;
1743 return NULL;
1747 static gfc_expr *
1748 eval_intrinsic_f2 (gfc_intrinsic_op operator,
1749 arith (*eval) (gfc_expr *, gfc_expr **),
1750 gfc_expr * op1, gfc_expr * op2)
1752 gfc_expr *result;
1753 eval_f f;
1755 if (op2 == NULL)
1757 if (gfc_zero_size_array (op1))
1758 return eval_type_intrinsic0 (operator, op1);
1760 else
1762 result = reduce_binary0 (op1, op2);
1763 if (result != NULL)
1764 return eval_type_intrinsic0 (operator, result);
1767 f.f2 = eval;
1768 return eval_intrinsic (operator, f, op1, op2);
1772 static gfc_expr *
1773 eval_intrinsic_f3 (gfc_intrinsic_op operator,
1774 arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1775 gfc_expr * op1, gfc_expr * op2)
1777 gfc_expr *result;
1778 eval_f f;
1780 result = reduce_binary0 (op1, op2);
1781 if (result != NULL)
1782 return eval_type_intrinsic0(operator, result);
1784 f.f3 = eval;
1785 return eval_intrinsic (operator, f, op1, op2);
1790 gfc_expr *
1791 gfc_uplus (gfc_expr * op)
1793 return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_uplus, op, NULL);
1796 gfc_expr *
1797 gfc_uminus (gfc_expr * op)
1799 return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
1802 gfc_expr *
1803 gfc_add (gfc_expr * op1, gfc_expr * op2)
1805 return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
1808 gfc_expr *
1809 gfc_subtract (gfc_expr * op1, gfc_expr * op2)
1811 return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
1814 gfc_expr *
1815 gfc_multiply (gfc_expr * op1, gfc_expr * op2)
1817 return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
1820 gfc_expr *
1821 gfc_divide (gfc_expr * op1, gfc_expr * op2)
1823 return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
1826 gfc_expr *
1827 gfc_power (gfc_expr * op1, gfc_expr * op2)
1829 return eval_intrinsic_f3 (INTRINSIC_POWER, gfc_arith_power, op1, op2);
1832 gfc_expr *
1833 gfc_concat (gfc_expr * op1, gfc_expr * op2)
1835 return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
1838 gfc_expr *
1839 gfc_and (gfc_expr * op1, gfc_expr * op2)
1841 return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
1844 gfc_expr *
1845 gfc_or (gfc_expr * op1, gfc_expr * op2)
1847 return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
1850 gfc_expr *
1851 gfc_not (gfc_expr * op1)
1853 return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
1856 gfc_expr *
1857 gfc_eqv (gfc_expr * op1, gfc_expr * op2)
1859 return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
1862 gfc_expr *
1863 gfc_neqv (gfc_expr * op1, gfc_expr * op2)
1865 return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
1868 gfc_expr *
1869 gfc_eq (gfc_expr * op1, gfc_expr * op2)
1871 return eval_intrinsic_f3 (INTRINSIC_EQ, gfc_arith_eq, op1, op2);
1874 gfc_expr *
1875 gfc_ne (gfc_expr * op1, gfc_expr * op2)
1877 return eval_intrinsic_f3 (INTRINSIC_NE, gfc_arith_ne, op1, op2);
1880 gfc_expr *
1881 gfc_gt (gfc_expr * op1, gfc_expr * op2)
1883 return eval_intrinsic_f3 (INTRINSIC_GT, gfc_arith_gt, op1, op2);
1886 gfc_expr *
1887 gfc_ge (gfc_expr * op1, gfc_expr * op2)
1889 return eval_intrinsic_f3 (INTRINSIC_GE, gfc_arith_ge, op1, op2);
1892 gfc_expr *
1893 gfc_lt (gfc_expr * op1, gfc_expr * op2)
1895 return eval_intrinsic_f3 (INTRINSIC_LT, gfc_arith_lt, op1, op2);
1898 gfc_expr *
1899 gfc_le (gfc_expr * op1, gfc_expr * op2)
1901 return eval_intrinsic_f3 (INTRINSIC_LE, gfc_arith_le, op1, op2);
1905 /* Convert an integer string to an expression node. */
1907 gfc_expr *
1908 gfc_convert_integer (const char *buffer, int kind, int radix, locus * where)
1910 gfc_expr *e;
1911 const char *t;
1913 e = gfc_constant_result (BT_INTEGER, kind, where);
1914 /* a leading plus is allowed, but not by mpz_set_str */
1915 if (buffer[0] == '+')
1916 t = buffer + 1;
1917 else
1918 t = buffer;
1919 mpz_set_str (e->value.integer, t, radix);
1921 return e;
1925 /* Convert a real string to an expression node. */
1927 gfc_expr *
1928 gfc_convert_real (const char *buffer, int kind, locus * where)
1930 gfc_expr *e;
1932 e = gfc_constant_result (BT_REAL, kind, where);
1933 mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
1935 return e;
1939 /* Convert a pair of real, constant expression nodes to a single
1940 complex expression node. */
1942 gfc_expr *
1943 gfc_convert_complex (gfc_expr * real, gfc_expr * imag, int kind)
1945 gfc_expr *e;
1947 e = gfc_constant_result (BT_COMPLEX, kind, &real->where);
1948 mpfr_set (e->value.complex.r, real->value.real, GFC_RND_MODE);
1949 mpfr_set (e->value.complex.i, imag->value.real, GFC_RND_MODE);
1951 return e;
1955 /******* Simplification of intrinsic functions with constant arguments *****/
1958 /* Deal with an arithmetic error. */
1960 static void
1961 arith_error (arith rc, gfc_typespec * from, gfc_typespec * to, locus * where)
1963 gfc_error ("%s converting %s to %s at %L", gfc_arith_error (rc),
1964 gfc_typename (from), gfc_typename (to), where);
1966 /* TODO: Do something about the error, ie, throw exception, return
1967 NaN, etc. */
1970 /* Convert integers to integers. */
1972 gfc_expr *
1973 gfc_int2int (gfc_expr * src, int kind)
1975 gfc_expr *result;
1976 arith rc;
1978 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
1980 mpz_set (result->value.integer, src->value.integer);
1982 if ((rc = gfc_check_integer_range (result->value.integer, kind))
1983 != ARITH_OK)
1985 if (rc == ARITH_ASYMMETRIC)
1987 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
1989 else
1991 arith_error (rc, &src->ts, &result->ts, &src->where);
1992 gfc_free_expr (result);
1993 return NULL;
1997 return result;
2001 /* Convert integers to reals. */
2003 gfc_expr *
2004 gfc_int2real (gfc_expr * src, int kind)
2006 gfc_expr *result;
2007 arith rc;
2009 result = gfc_constant_result (BT_REAL, kind, &src->where);
2011 mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
2013 if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
2015 arith_error (rc, &src->ts, &result->ts, &src->where);
2016 gfc_free_expr (result);
2017 return NULL;
2020 return result;
2024 /* Convert default integer to default complex. */
2026 gfc_expr *
2027 gfc_int2complex (gfc_expr * src, int kind)
2029 gfc_expr *result;
2030 arith rc;
2032 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2034 mpfr_set_z (result->value.complex.r, src->value.integer, GFC_RND_MODE);
2035 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2037 if ((rc = gfc_check_real_range (result->value.complex.r, kind)) != ARITH_OK)
2039 arith_error (rc, &src->ts, &result->ts, &src->where);
2040 gfc_free_expr (result);
2041 return NULL;
2044 return result;
2048 /* Convert default real to default integer. */
2050 gfc_expr *
2051 gfc_real2int (gfc_expr * src, int kind)
2053 gfc_expr *result;
2054 arith rc;
2056 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2058 gfc_mpfr_to_mpz (result->value.integer, src->value.real);
2060 if ((rc = gfc_check_integer_range (result->value.integer, kind))
2061 != ARITH_OK)
2063 arith_error (rc, &src->ts, &result->ts, &src->where);
2064 gfc_free_expr (result);
2065 return NULL;
2068 return result;
2072 /* Convert real to real. */
2074 gfc_expr *
2075 gfc_real2real (gfc_expr * src, int kind)
2077 gfc_expr *result;
2078 arith rc;
2080 result = gfc_constant_result (BT_REAL, kind, &src->where);
2082 mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
2084 rc = gfc_check_real_range (result->value.real, kind);
2086 if (rc == ARITH_UNDERFLOW)
2088 if (gfc_option.warn_underflow)
2089 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2090 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2092 else if (rc != ARITH_OK)
2094 arith_error (rc, &src->ts, &result->ts, &src->where);
2095 gfc_free_expr (result);
2096 return NULL;
2099 return result;
2103 /* Convert real to complex. */
2105 gfc_expr *
2106 gfc_real2complex (gfc_expr * src, int kind)
2108 gfc_expr *result;
2109 arith rc;
2111 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2113 mpfr_set (result->value.complex.r, src->value.real, GFC_RND_MODE);
2114 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2116 rc = gfc_check_real_range (result->value.complex.r, kind);
2118 if (rc == ARITH_UNDERFLOW)
2120 if (gfc_option.warn_underflow)
2121 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2122 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
2124 else if (rc != ARITH_OK)
2126 arith_error (rc, &src->ts, &result->ts, &src->where);
2127 gfc_free_expr (result);
2128 return NULL;
2131 return result;
2135 /* Convert complex to integer. */
2137 gfc_expr *
2138 gfc_complex2int (gfc_expr * src, int kind)
2140 gfc_expr *result;
2141 arith rc;
2143 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2145 gfc_mpfr_to_mpz (result->value.integer, src->value.complex.r);
2147 if ((rc = gfc_check_integer_range (result->value.integer, kind))
2148 != ARITH_OK)
2150 arith_error (rc, &src->ts, &result->ts, &src->where);
2151 gfc_free_expr (result);
2152 return NULL;
2155 return result;
2159 /* Convert complex to real. */
2161 gfc_expr *
2162 gfc_complex2real (gfc_expr * src, int kind)
2164 gfc_expr *result;
2165 arith rc;
2167 result = gfc_constant_result (BT_REAL, kind, &src->where);
2169 mpfr_set (result->value.real, src->value.complex.r, GFC_RND_MODE);
2171 rc = gfc_check_real_range (result->value.real, kind);
2173 if (rc == ARITH_UNDERFLOW)
2175 if (gfc_option.warn_underflow)
2176 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2177 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2179 if (rc != ARITH_OK)
2181 arith_error (rc, &src->ts, &result->ts, &src->where);
2182 gfc_free_expr (result);
2183 return NULL;
2186 return result;
2190 /* Convert complex to complex. */
2192 gfc_expr *
2193 gfc_complex2complex (gfc_expr * src, int kind)
2195 gfc_expr *result;
2196 arith rc;
2198 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2200 mpfr_set (result->value.complex.r, src->value.complex.r, GFC_RND_MODE);
2201 mpfr_set (result->value.complex.i, src->value.complex.i, GFC_RND_MODE);
2203 rc = gfc_check_real_range (result->value.complex.r, kind);
2205 if (rc == ARITH_UNDERFLOW)
2207 if (gfc_option.warn_underflow)
2208 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2209 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
2211 else if (rc != ARITH_OK)
2213 arith_error (rc, &src->ts, &result->ts, &src->where);
2214 gfc_free_expr (result);
2215 return NULL;
2218 rc = gfc_check_real_range (result->value.complex.i, kind);
2220 if (rc == ARITH_UNDERFLOW)
2222 if (gfc_option.warn_underflow)
2223 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2224 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2226 else if (rc != ARITH_OK)
2228 arith_error (rc, &src->ts, &result->ts, &src->where);
2229 gfc_free_expr (result);
2230 return NULL;
2233 return result;
2237 /* Logical kind conversion. */
2239 gfc_expr *
2240 gfc_log2log (gfc_expr * src, int kind)
2242 gfc_expr *result;
2244 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2245 result->value.logical = src->value.logical;
2247 return result;