OSDN Git Service

8f9f9e4935ca95ad760baecdbf27afe923af154f
[pf3gnuchains/gcc-fork.git] / gcc / fortran / simplify.c
1 /* Simplify intrinsic functions at compile-time.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
3    Inc.
4    Contributed by Andy Vaught & Katherine Holcomb
5
6 This file is part of GCC.
7
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.
12
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.
17
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.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "flags.h"
26 #include "gfortran.h"
27 #include "arith.h"
28 #include "intrinsic.h"
29
30 gfc_expr gfc_bad_expr;
31
32
33 /* Note that 'simplification' is not just transforming expressions.
34    For functions that are not simplified at compile time, range
35    checking is done if possible.
36
37    The return convention is that each simplification function returns:
38
39      A new expression node corresponding to the simplified arguments.
40      The original arguments are destroyed by the caller, and must not
41      be a part of the new expression.
42
43      NULL pointer indicating that no simplification was possible and
44      the original expression should remain intact.  If the
45      simplification function sets the type and/or the function name
46      via the pointer gfc_simple_expression, then this type is
47      retained.
48
49      An expression pointer to gfc_bad_expr (a static placeholder)
50      indicating that some error has prevented simplification.  For
51      example, sqrt(-1.0).  The error is generated within the function
52      and should be propagated upwards
53
54    By the time a simplification function gets control, it has been
55    decided that the function call is really supposed to be the
56    intrinsic.  No type checking is strictly necessary, since only
57    valid types will be passed on.  On the other hand, a simplification
58    subroutine may have to look at the type of an argument as part of
59    its processing.
60
61    Array arguments are never passed to these subroutines.
62
63    The functions in this file don't have much comment with them, but
64    everything is reasonably straight-forward.  The Standard, chapter 13
65    is the best comment you'll find for this file anyway.  */
66
67 /* Static table for converting non-ascii character sets to ascii.
68    The xascii_table[] is the inverse table.  */
69
70 static int ascii_table[256] = {
71   '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
72   '\b', '\t', '\n', '\v', '\0', '\r', '\0', '\0',
73   '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
74   '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
75   ' ', '!', '\'', '#', '$', '%', '&', '\'',
76   '(', ')', '*', '+', ',', '-', '.', '/',
77   '0', '1', '2', '3', '4', '5', '6', '7',
78   '8', '9', ':', ';', '<', '=', '>', '?',
79   '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
80   'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
81   'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
82   'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
83   '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
84   'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
85   'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
86   'x', 'y', 'z', '{', '|', '}', '~', '\?'
87 };
88
89 static int xascii_table[256];
90
91
92 /* Range checks an expression node.  If all goes well, returns the
93    node, otherwise returns &gfc_bad_expr and frees the node.  */
94
95 static gfc_expr *
96 range_check (gfc_expr * result, const char *name)
97 {
98   if (gfc_range_check (result) == ARITH_OK)
99     return result;
100
101   gfc_error ("Result of %s overflows its kind at %L", name, &result->where);
102   gfc_free_expr (result);
103   return &gfc_bad_expr;
104 }
105
106
107 /* A helper function that gets an optional and possibly missing
108    kind parameter.  Returns the kind, -1 if something went wrong.  */
109
110 static int
111 get_kind (bt type, gfc_expr * k, const char *name, int default_kind)
112 {
113   int kind;
114
115   if (k == NULL)
116     return default_kind;
117
118   if (k->expr_type != EXPR_CONSTANT)
119     {
120       gfc_error ("KIND parameter of %s at %L must be an initialization "
121                  "expression", name, &k->where);
122
123       return -1;
124     }
125
126   if (gfc_extract_int (k, &kind) != NULL
127       || gfc_validate_kind (type, kind, true) < 0)
128     {
129
130       gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
131       return -1;
132     }
133
134   return kind;
135 }
136
137
138 /* Checks if X, which is assumed to represent a two's complement
139    integer of binary width BITSIZE, has the signbit set.  If so, makes 
140    X the corresponding negative number.  */
141
142 static void
143 twos_complement (mpz_t x, int bitsize)
144 {
145   mpz_t mask;
146
147   if (mpz_tstbit (x, bitsize - 1) == 1)
148     {
149       mpz_init_set_ui(mask, 1);
150       mpz_mul_2exp(mask, mask, bitsize);
151       mpz_sub_ui(mask, mask, 1);
152
153       /* We negate the number by hand, zeroing the high bits, that is
154         make it the corresponding positive number, and then have it
155         negated by GMP, giving the correct representation of the
156         negative number.  */
157       mpz_com (x, x);
158       mpz_add_ui (x, x, 1);
159       mpz_and (x, x, mask);
160
161       mpz_neg (x, x);
162
163       mpz_clear (mask);
164     }
165 }
166
167
168 /********************** Simplification functions *****************************/
169
170 gfc_expr *
171 gfc_simplify_abs (gfc_expr * e)
172 {
173   gfc_expr *result;
174
175   if (e->expr_type != EXPR_CONSTANT)
176     return NULL;
177
178   switch (e->ts.type)
179     {
180     case BT_INTEGER:
181       result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
182
183       mpz_abs (result->value.integer, e->value.integer);
184
185       result = range_check (result, "IABS");
186       break;
187
188     case BT_REAL:
189       result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
190
191       mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
192
193       result = range_check (result, "ABS");
194       break;
195
196     case BT_COMPLEX:
197       result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
198
199       gfc_set_model_kind (e->ts.kind);
200
201       mpfr_hypot (result->value.real, e->value.complex.r, 
202                   e->value.complex.i, GFC_RND_MODE);
203       result = range_check (result, "CABS");
204       break;
205
206     default:
207       gfc_internal_error ("gfc_simplify_abs(): Bad type");
208     }
209
210   return result;
211 }
212
213
214 gfc_expr *
215 gfc_simplify_achar (gfc_expr * e)
216 {
217   gfc_expr *result;
218   int index;
219
220   if (e->expr_type != EXPR_CONSTANT)
221     return NULL;
222
223   /* We cannot assume that the native character set is ASCII in this
224      function.  */
225   if (gfc_extract_int (e, &index) != NULL || index < 0 || index > 127)
226     {
227       gfc_error ("Extended ASCII not implemented: argument of ACHAR at %L "
228                  "must be between 0 and 127", &e->where);
229       return &gfc_bad_expr;
230     }
231
232   result = gfc_constant_result (BT_CHARACTER, gfc_default_character_kind,
233                                 &e->where);
234
235   result->value.character.string = gfc_getmem (2);
236
237   result->value.character.length = 1;
238   result->value.character.string[0] = ascii_table[index];
239   result->value.character.string[1] = '\0';     /* For debugger */
240   return result;
241 }
242
243
244 gfc_expr *
245 gfc_simplify_acos (gfc_expr * x)
246 {
247   gfc_expr *result;
248
249   if (x->expr_type != EXPR_CONSTANT)
250     return NULL;
251
252   if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0)
253     {
254       gfc_error ("Argument of ACOS at %L must be between -1 and 1",
255                  &x->where);
256       return &gfc_bad_expr;
257     }
258
259   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
260
261   mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
262
263   return range_check (result, "ACOS");
264 }
265
266
267 gfc_expr *
268 gfc_simplify_adjustl (gfc_expr * e)
269 {
270   gfc_expr *result;
271   int count, i, len;
272   char ch;
273
274   if (e->expr_type != EXPR_CONSTANT)
275     return NULL;
276
277   len = e->value.character.length;
278
279   result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
280
281   result->value.character.length = len;
282   result->value.character.string = gfc_getmem (len + 1);
283
284   for (count = 0, i = 0; i < len; ++i)
285     {
286       ch = e->value.character.string[i];
287       if (ch != ' ')
288         break;
289       ++count;
290     }
291
292   for (i = 0; i < len - count; ++i)
293     {
294       result->value.character.string[i] =
295         e->value.character.string[count + i];
296     }
297
298   for (i = len - count; i < len; ++i)
299     {
300       result->value.character.string[i] = ' ';
301     }
302
303   result->value.character.string[len] = '\0';   /* For debugger */
304
305   return result;
306 }
307
308
309 gfc_expr *
310 gfc_simplify_adjustr (gfc_expr * e)
311 {
312   gfc_expr *result;
313   int count, i, len;
314   char ch;
315
316   if (e->expr_type != EXPR_CONSTANT)
317     return NULL;
318
319   len = e->value.character.length;
320
321   result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
322
323   result->value.character.length = len;
324   result->value.character.string = gfc_getmem (len + 1);
325
326   for (count = 0, i = len - 1; i >= 0; --i)
327     {
328       ch = e->value.character.string[i];
329       if (ch != ' ')
330         break;
331       ++count;
332     }
333
334   for (i = 0; i < count; ++i)
335     {
336       result->value.character.string[i] = ' ';
337     }
338
339   for (i = count; i < len; ++i)
340     {
341       result->value.character.string[i] =
342         e->value.character.string[i - count];
343     }
344
345   result->value.character.string[len] = '\0';   /* For debugger */
346
347   return result;
348 }
349
350
351 gfc_expr *
352 gfc_simplify_aimag (gfc_expr * e)
353 {
354   gfc_expr *result;
355
356   if (e->expr_type != EXPR_CONSTANT)
357     return NULL;
358
359   result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
360   mpfr_set (result->value.real, e->value.complex.i, GFC_RND_MODE);
361
362   return range_check (result, "AIMAG");
363 }
364
365
366 gfc_expr *
367 gfc_simplify_aint (gfc_expr * e, gfc_expr * k)
368 {
369   gfc_expr *rtrunc, *result;
370   int kind;
371
372   kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
373   if (kind == -1)
374     return &gfc_bad_expr;
375
376   if (e->expr_type != EXPR_CONSTANT)
377     return NULL;
378
379   rtrunc = gfc_copy_expr (e);
380
381   mpfr_trunc (rtrunc->value.real, e->value.real);
382
383   result = gfc_real2real (rtrunc, kind);
384   gfc_free_expr (rtrunc);
385
386   return range_check (result, "AINT");
387 }
388
389
390 gfc_expr *
391 gfc_simplify_dint (gfc_expr * e)
392 {
393   gfc_expr *rtrunc, *result;
394
395   if (e->expr_type != EXPR_CONSTANT)
396     return NULL;
397
398   rtrunc = gfc_copy_expr (e);
399
400   mpfr_trunc (rtrunc->value.real, e->value.real);
401
402   result = gfc_real2real (rtrunc, gfc_default_double_kind);
403   gfc_free_expr (rtrunc);
404
405   return range_check (result, "DINT");
406 }
407
408
409 gfc_expr *
410 gfc_simplify_anint (gfc_expr * e, gfc_expr * k)
411 {
412   gfc_expr *result;
413   int kind;
414
415   kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
416   if (kind == -1)
417     return &gfc_bad_expr;
418
419   if (e->expr_type != EXPR_CONSTANT)
420     return NULL;
421
422   result = gfc_constant_result (e->ts.type, kind, &e->where);
423
424   mpfr_round (result->value.real, e->value.real);
425
426   return range_check (result, "ANINT");
427 }
428
429
430 gfc_expr *
431 gfc_simplify_dnint (gfc_expr * e)
432 {
433   gfc_expr *result;
434
435   if (e->expr_type != EXPR_CONSTANT)
436     return NULL;
437
438   result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &e->where);
439
440   mpfr_round (result->value.real, e->value.real);
441
442   return range_check (result, "DNINT");
443 }
444
445
446 gfc_expr *
447 gfc_simplify_asin (gfc_expr * x)
448 {
449   gfc_expr *result;
450
451   if (x->expr_type != EXPR_CONSTANT)
452     return NULL;
453
454   if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0)
455     {
456       gfc_error ("Argument of ASIN at %L must be between -1 and 1",
457                  &x->where);
458       return &gfc_bad_expr;
459     }
460
461   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
462
463   mpfr_asin(result->value.real, x->value.real, GFC_RND_MODE);
464
465   return range_check (result, "ASIN");
466 }
467
468
469 gfc_expr *
470 gfc_simplify_atan (gfc_expr * x)
471 {
472   gfc_expr *result;
473
474   if (x->expr_type != EXPR_CONSTANT)
475     return NULL;
476
477   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
478
479   mpfr_atan(result->value.real, x->value.real, GFC_RND_MODE);
480
481   return range_check (result, "ATAN");
482
483 }
484
485
486 gfc_expr *
487 gfc_simplify_atan2 (gfc_expr * y, gfc_expr * x)
488 {
489   gfc_expr *result;
490
491   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
492     return NULL;
493
494   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
495
496   if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
497     {
498       gfc_error
499         ("If first argument of ATAN2 %L is zero, then the second argument "
500           "must not be zero", &x->where);
501       gfc_free_expr (result);
502       return &gfc_bad_expr;
503     }
504
505   arctangent2 (y->value.real, x->value.real, result->value.real);
506
507   return range_check (result, "ATAN2");
508
509 }
510
511
512 gfc_expr *
513 gfc_simplify_bit_size (gfc_expr * e)
514 {
515   gfc_expr *result;
516   int i;
517
518   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
519   result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
520   mpz_set_ui (result->value.integer, gfc_integer_kinds[i].bit_size);
521
522   return result;
523 }
524
525
526 gfc_expr *
527 gfc_simplify_btest (gfc_expr * e, gfc_expr * bit)
528 {
529   int b;
530
531   if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
532     return NULL;
533
534   if (gfc_extract_int (bit, &b) != NULL || b < 0)
535     return gfc_logical_expr (0, &e->where);
536
537   return gfc_logical_expr (mpz_tstbit (e->value.integer, b), &e->where);
538 }
539
540
541 gfc_expr *
542 gfc_simplify_ceiling (gfc_expr * e, gfc_expr * k)
543 {
544   gfc_expr *ceil, *result;
545   int kind;
546
547   kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
548   if (kind == -1)
549     return &gfc_bad_expr;
550
551   if (e->expr_type != EXPR_CONSTANT)
552     return NULL;
553
554   result = gfc_constant_result (BT_INTEGER, kind, &e->where);
555
556   ceil = gfc_copy_expr (e);
557
558   mpfr_ceil (ceil->value.real, e->value.real);
559   gfc_mpfr_to_mpz(result->value.integer, ceil->value.real);
560
561   gfc_free_expr (ceil);
562
563   return range_check (result, "CEILING");
564 }
565
566
567 gfc_expr *
568 gfc_simplify_char (gfc_expr * e, gfc_expr * k)
569 {
570   gfc_expr *result;
571   int c, kind;
572
573   kind = get_kind (BT_CHARACTER, k, "CHAR", gfc_default_character_kind);
574   if (kind == -1)
575     return &gfc_bad_expr;
576
577   if (e->expr_type != EXPR_CONSTANT)
578     return NULL;
579
580   if (gfc_extract_int (e, &c) != NULL || c < 0 || c > 255)
581     {
582       gfc_error ("Bad character in CHAR function at %L", &e->where);
583       return &gfc_bad_expr;
584     }
585
586   result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
587
588   result->value.character.length = 1;
589   result->value.character.string = gfc_getmem (2);
590
591   result->value.character.string[0] = c;
592   result->value.character.string[1] = '\0';     /* For debugger */
593
594   return result;
595 }
596
597
598 /* Common subroutine for simplifying CMPLX and DCMPLX.  */
599
600 static gfc_expr *
601 simplify_cmplx (const char *name, gfc_expr * x, gfc_expr * y, int kind)
602 {
603   gfc_expr *result;
604
605   result = gfc_constant_result (BT_COMPLEX, kind, &x->where);
606
607   mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
608
609   switch (x->ts.type)
610     {
611     case BT_INTEGER:
612       mpfr_set_z (result->value.complex.r, x->value.integer, GFC_RND_MODE);
613       break;
614
615     case BT_REAL:
616       mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
617       break;
618
619     case BT_COMPLEX:
620       mpfr_set (result->value.complex.r, x->value.complex.r, GFC_RND_MODE);
621       mpfr_set (result->value.complex.i, x->value.complex.i, GFC_RND_MODE);
622       break;
623
624     default:
625       gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
626     }
627
628   if (y != NULL)
629     {
630       switch (y->ts.type)
631         {
632         case BT_INTEGER:
633           mpfr_set_z (result->value.complex.i, y->value.integer, GFC_RND_MODE);
634           break;
635
636         case BT_REAL:
637           mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
638           break;
639
640         default:
641           gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
642         }
643     }
644
645   return range_check (result, name);
646 }
647
648
649 gfc_expr *
650 gfc_simplify_cmplx (gfc_expr * x, gfc_expr * y, gfc_expr * k)
651 {
652   int kind;
653
654   if (x->expr_type != EXPR_CONSTANT
655       || (y != NULL && y->expr_type != EXPR_CONSTANT))
656     return NULL;
657
658   kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_real_kind);
659   if (kind == -1)
660     return &gfc_bad_expr;
661
662   return simplify_cmplx ("CMPLX", x, y, kind);
663 }
664
665
666 gfc_expr *
667 gfc_simplify_conjg (gfc_expr * e)
668 {
669   gfc_expr *result;
670
671   if (e->expr_type != EXPR_CONSTANT)
672     return NULL;
673
674   result = gfc_copy_expr (e);
675   mpfr_neg (result->value.complex.i, result->value.complex.i, GFC_RND_MODE);
676
677   return range_check (result, "CONJG");
678 }
679
680
681 gfc_expr *
682 gfc_simplify_cos (gfc_expr * x)
683 {
684   gfc_expr *result;
685   mpfr_t xp, xq;
686
687   if (x->expr_type != EXPR_CONSTANT)
688     return NULL;
689
690   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
691
692   switch (x->ts.type)
693     {
694     case BT_REAL:
695       mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
696       break;
697     case BT_COMPLEX:
698       gfc_set_model_kind (x->ts.kind);
699       mpfr_init (xp);
700       mpfr_init (xq);
701
702       mpfr_cos  (xp, x->value.complex.r, GFC_RND_MODE);
703       mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
704       mpfr_mul(result->value.complex.r, xp, xq, GFC_RND_MODE);
705
706       mpfr_sin  (xp, x->value.complex.r, GFC_RND_MODE);
707       mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
708       mpfr_mul (xp, xp, xq, GFC_RND_MODE);
709       mpfr_neg (result->value.complex.i, xp, GFC_RND_MODE );
710
711       mpfr_clear (xp);
712       mpfr_clear (xq);
713       break;
714     default:
715       gfc_internal_error ("in gfc_simplify_cos(): Bad type");
716     }
717
718   return range_check (result, "COS");
719
720 }
721
722
723 gfc_expr *
724 gfc_simplify_cosh (gfc_expr * x)
725 {
726   gfc_expr *result;
727
728   if (x->expr_type != EXPR_CONSTANT)
729     return NULL;
730
731   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
732
733   mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
734
735   return range_check (result, "COSH");
736 }
737
738
739 gfc_expr *
740 gfc_simplify_dcmplx (gfc_expr * x, gfc_expr * y)
741 {
742
743   if (x->expr_type != EXPR_CONSTANT
744       || (y != NULL && y->expr_type != EXPR_CONSTANT))
745     return NULL;
746
747   return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
748 }
749
750
751 gfc_expr *
752 gfc_simplify_dble (gfc_expr * e)
753 {
754   gfc_expr *result;
755
756   if (e->expr_type != EXPR_CONSTANT)
757     return NULL;
758
759   switch (e->ts.type)
760     {
761     case BT_INTEGER:
762       result = gfc_int2real (e, gfc_default_double_kind);
763       break;
764
765     case BT_REAL:
766       result = gfc_real2real (e, gfc_default_double_kind);
767       break;
768
769     case BT_COMPLEX:
770       result = gfc_complex2real (e, gfc_default_double_kind);
771       break;
772
773     default:
774       gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e->where);
775     }
776
777   return range_check (result, "DBLE");
778 }
779
780
781 gfc_expr *
782 gfc_simplify_digits (gfc_expr * x)
783 {
784   int i, digits;
785
786   i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
787   switch (x->ts.type)
788     {
789     case BT_INTEGER:
790       digits = gfc_integer_kinds[i].digits;
791       break;
792
793     case BT_REAL:
794     case BT_COMPLEX:
795       digits = gfc_real_kinds[i].digits;
796       break;
797
798     default:
799       gcc_unreachable ();
800     }
801
802   return gfc_int_expr (digits);
803 }
804
805
806 gfc_expr *
807 gfc_simplify_dim (gfc_expr * x, gfc_expr * y)
808 {
809   gfc_expr *result;
810
811   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
812     return NULL;
813
814   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
815
816   switch (x->ts.type)
817     {
818     case BT_INTEGER:
819       if (mpz_cmp (x->value.integer, y->value.integer) > 0)
820         mpz_sub (result->value.integer, x->value.integer, y->value.integer);
821       else
822         mpz_set_ui (result->value.integer, 0);
823
824       break;
825
826     case BT_REAL:
827       if (mpfr_cmp (x->value.real, y->value.real) > 0)
828         mpfr_sub (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
829       else
830         mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
831
832       break;
833
834     default:
835       gfc_internal_error ("gfc_simplify_dim(): Bad type");
836     }
837
838   return range_check (result, "DIM");
839 }
840
841
842 gfc_expr *
843 gfc_simplify_dprod (gfc_expr * x, gfc_expr * y)
844 {
845   gfc_expr *a1, *a2, *result;
846
847   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
848     return NULL;
849
850   result =
851     gfc_constant_result (BT_REAL, gfc_default_double_kind, &x->where);
852
853   a1 = gfc_real2real (x, gfc_default_double_kind);
854   a2 = gfc_real2real (y, gfc_default_double_kind);
855
856   mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
857
858   gfc_free_expr (a1);
859   gfc_free_expr (a2);
860
861   return range_check (result, "DPROD");
862 }
863
864
865 gfc_expr *
866 gfc_simplify_epsilon (gfc_expr * e)
867 {
868   gfc_expr *result;
869   int i;
870
871   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
872
873   result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
874
875   mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
876
877   return range_check (result, "EPSILON");
878 }
879
880
881 gfc_expr *
882 gfc_simplify_exp (gfc_expr * x)
883 {
884   gfc_expr *result;
885   mpfr_t xp, xq;
886
887   if (x->expr_type != EXPR_CONSTANT)
888     return NULL;
889
890   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
891
892   switch (x->ts.type)
893     {
894     case BT_REAL:
895       mpfr_exp(result->value.real, x->value.real, GFC_RND_MODE);
896       break;
897
898     case BT_COMPLEX:
899       gfc_set_model_kind (x->ts.kind);
900       mpfr_init (xp);
901       mpfr_init (xq);
902       mpfr_exp (xq, x->value.complex.r, GFC_RND_MODE);
903       mpfr_cos (xp, x->value.complex.i, GFC_RND_MODE);
904       mpfr_mul (result->value.complex.r, xq, xp, GFC_RND_MODE);
905       mpfr_sin (xp, x->value.complex.i, GFC_RND_MODE);
906       mpfr_mul (result->value.complex.i, xq, xp, GFC_RND_MODE);
907       mpfr_clear (xp);
908       mpfr_clear (xq);
909       break;
910
911     default:
912       gfc_internal_error ("in gfc_simplify_exp(): Bad type");
913     }
914
915   return range_check (result, "EXP");
916 }
917
918 /* FIXME:  MPFR should be able to do this better */
919 gfc_expr *
920 gfc_simplify_exponent (gfc_expr * x)
921 {
922   int i;
923   mpfr_t tmp;
924   gfc_expr *result;
925
926   if (x->expr_type != EXPR_CONSTANT)
927     return NULL;
928
929   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
930                                 &x->where);
931
932   gfc_set_model (x->value.real);
933
934   if (mpfr_sgn (x->value.real) == 0)
935     {
936       mpz_set_ui (result->value.integer, 0);
937       return result;
938     }
939
940   mpfr_init (tmp);
941
942   mpfr_abs (tmp, x->value.real, GFC_RND_MODE);
943   mpfr_log2 (tmp, tmp, GFC_RND_MODE);
944
945   gfc_mpfr_to_mpz (result->value.integer, tmp);
946
947   /* The model number for tiny(x) is b**(emin - 1) where b is the base and emin
948      is the smallest exponent value.  So, we need to add 1 if x is tiny(x).  */
949   i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
950   if (mpfr_cmp (x->value.real, gfc_real_kinds[i].tiny) == 0)
951     mpz_add_ui (result->value.integer,result->value.integer, 1);
952
953   mpfr_clear (tmp);
954
955   return range_check (result, "EXPONENT");
956 }
957
958
959 gfc_expr *
960 gfc_simplify_float (gfc_expr * a)
961 {
962   gfc_expr *result;
963
964   if (a->expr_type != EXPR_CONSTANT)
965     return NULL;
966
967   result = gfc_int2real (a, gfc_default_real_kind);
968   return range_check (result, "FLOAT");
969 }
970
971
972 gfc_expr *
973 gfc_simplify_floor (gfc_expr * e, gfc_expr * k)
974 {
975   gfc_expr *result;
976   mpfr_t floor;
977   int kind;
978
979   kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
980   if (kind == -1)
981     gfc_internal_error ("gfc_simplify_floor(): Bad kind");
982
983   if (e->expr_type != EXPR_CONSTANT)
984     return NULL;
985
986   result = gfc_constant_result (BT_INTEGER, kind, &e->where);
987
988   gfc_set_model_kind (kind);
989   mpfr_init (floor);
990   mpfr_floor (floor, e->value.real);
991
992   gfc_mpfr_to_mpz (result->value.integer, floor);
993
994   mpfr_clear (floor);
995
996   return range_check (result, "FLOOR");
997 }
998
999
1000 gfc_expr *
1001 gfc_simplify_fraction (gfc_expr * x)
1002 {
1003   gfc_expr *result;
1004   mpfr_t absv, exp, pow2;
1005
1006   if (x->expr_type != EXPR_CONSTANT)
1007     return NULL;
1008
1009   result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
1010
1011   gfc_set_model_kind (x->ts.kind);
1012
1013   if (mpfr_sgn (x->value.real) == 0)
1014     {
1015       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1016       return result;
1017     }
1018
1019   mpfr_init (exp);
1020   mpfr_init (absv);
1021   mpfr_init (pow2);
1022
1023   mpfr_abs (absv, x->value.real, GFC_RND_MODE);
1024   mpfr_log2 (exp, absv, GFC_RND_MODE);
1025
1026   mpfr_trunc (exp, exp);
1027   mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
1028
1029   mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
1030
1031   mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
1032
1033   mpfr_clear (exp);
1034   mpfr_clear (absv);
1035   mpfr_clear (pow2);
1036
1037   return range_check (result, "FRACTION");
1038 }
1039
1040
1041 gfc_expr *
1042 gfc_simplify_huge (gfc_expr * e)
1043 {
1044   gfc_expr *result;
1045   int i;
1046
1047   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1048
1049   result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1050
1051   switch (e->ts.type)
1052     {
1053     case BT_INTEGER:
1054       mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
1055       break;
1056
1057     case BT_REAL:
1058       mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
1059       break;
1060
1061     default:
1062       gcc_unreachable ();
1063     }
1064
1065   return result;
1066 }
1067
1068
1069 gfc_expr *
1070 gfc_simplify_iachar (gfc_expr * e)
1071 {
1072   gfc_expr *result;
1073   int index;
1074
1075   if (e->expr_type != EXPR_CONSTANT)
1076     return NULL;
1077
1078   if (e->value.character.length != 1)
1079     {
1080       gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
1081       return &gfc_bad_expr;
1082     }
1083
1084   index = xascii_table[(int) e->value.character.string[0] & 0xFF];
1085
1086   result = gfc_int_expr (index);
1087   result->where = e->where;
1088
1089   return range_check (result, "IACHAR");
1090 }
1091
1092
1093 gfc_expr *
1094 gfc_simplify_iand (gfc_expr * x, gfc_expr * y)
1095 {
1096   gfc_expr *result;
1097
1098   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1099     return NULL;
1100
1101   result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1102
1103   mpz_and (result->value.integer, x->value.integer, y->value.integer);
1104
1105   return range_check (result, "IAND");
1106 }
1107
1108
1109 gfc_expr *
1110 gfc_simplify_ibclr (gfc_expr * x, gfc_expr * y)
1111 {
1112   gfc_expr *result;
1113   int k, pos;
1114
1115   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1116     return NULL;
1117
1118   if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1119     {
1120       gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
1121       return &gfc_bad_expr;
1122     }
1123
1124   k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1125
1126   if (pos > gfc_integer_kinds[k].bit_size)
1127     {
1128       gfc_error ("Second argument of IBCLR exceeds bit size at %L",
1129                  &y->where);
1130       return &gfc_bad_expr;
1131     }
1132
1133   result = gfc_copy_expr (x);
1134
1135   mpz_clrbit (result->value.integer, pos);
1136   return range_check (result, "IBCLR");
1137 }
1138
1139
1140 gfc_expr *
1141 gfc_simplify_ibits (gfc_expr * x, gfc_expr * y, gfc_expr * z)
1142 {
1143   gfc_expr *result;
1144   int pos, len;
1145   int i, k, bitsize;
1146   int *bits;
1147
1148   if (x->expr_type != EXPR_CONSTANT
1149       || y->expr_type != EXPR_CONSTANT
1150       || z->expr_type != EXPR_CONSTANT)
1151     return NULL;
1152
1153   if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1154     {
1155       gfc_error ("Invalid second argument of IBITS at %L", &y->where);
1156       return &gfc_bad_expr;
1157     }
1158
1159   if (gfc_extract_int (z, &len) != NULL || len < 0)
1160     {
1161       gfc_error ("Invalid third argument of IBITS at %L", &z->where);
1162       return &gfc_bad_expr;
1163     }
1164
1165   k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
1166
1167   bitsize = gfc_integer_kinds[k].bit_size;
1168
1169   if (pos + len > bitsize)
1170     {
1171       gfc_error
1172         ("Sum of second and third arguments of IBITS exceeds bit size "
1173          "at %L", &y->where);
1174       return &gfc_bad_expr;
1175     }
1176
1177   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1178
1179   bits = gfc_getmem (bitsize * sizeof (int));
1180
1181   for (i = 0; i < bitsize; i++)
1182     bits[i] = 0;
1183
1184   for (i = 0; i < len; i++)
1185     bits[i] = mpz_tstbit (x->value.integer, i + pos);
1186
1187   for (i = 0; i < bitsize; i++)
1188     {
1189       if (bits[i] == 0)
1190         {
1191           mpz_clrbit (result->value.integer, i);
1192         }
1193       else if (bits[i] == 1)
1194         {
1195           mpz_setbit (result->value.integer, i);
1196         }
1197       else
1198         {
1199           gfc_internal_error ("IBITS: Bad bit");
1200         }
1201     }
1202
1203   gfc_free (bits);
1204
1205   return range_check (result, "IBITS");
1206 }
1207
1208
1209 gfc_expr *
1210 gfc_simplify_ibset (gfc_expr * x, gfc_expr * y)
1211 {
1212   gfc_expr *result;
1213   int k, pos;
1214
1215   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1216     return NULL;
1217
1218   if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1219     {
1220       gfc_error ("Invalid second argument of IBSET at %L", &y->where);
1221       return &gfc_bad_expr;
1222     }
1223
1224   k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1225
1226   if (pos > gfc_integer_kinds[k].bit_size)
1227     {
1228       gfc_error ("Second argument of IBSET exceeds bit size at %L",
1229                  &y->where);
1230       return &gfc_bad_expr;
1231     }
1232
1233   result = gfc_copy_expr (x);
1234
1235   mpz_setbit (result->value.integer, pos);
1236   return range_check (result, "IBSET");
1237 }
1238
1239
1240 gfc_expr *
1241 gfc_simplify_ichar (gfc_expr * e)
1242 {
1243   gfc_expr *result;
1244   int index;
1245
1246   if (e->expr_type != EXPR_CONSTANT)
1247     return NULL;
1248
1249   if (e->value.character.length != 1)
1250     {
1251       gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
1252       return &gfc_bad_expr;
1253     }
1254
1255   index = (int) e->value.character.string[0];
1256
1257   if (index < CHAR_MIN || index > CHAR_MAX)
1258     {
1259       gfc_error ("Argument of ICHAR at %L out of range of this processor",
1260                  &e->where);
1261       return &gfc_bad_expr;
1262     }
1263
1264   result = gfc_int_expr (index);
1265   result->where = e->where;
1266   return range_check (result, "ICHAR");
1267 }
1268
1269
1270 gfc_expr *
1271 gfc_simplify_ieor (gfc_expr * x, gfc_expr * y)
1272 {
1273   gfc_expr *result;
1274
1275   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1276     return NULL;
1277
1278   result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1279
1280   mpz_xor (result->value.integer, x->value.integer, y->value.integer);
1281
1282   return range_check (result, "IEOR");
1283 }
1284
1285
1286 gfc_expr *
1287 gfc_simplify_index (gfc_expr * x, gfc_expr * y, gfc_expr * b)
1288 {
1289   gfc_expr *result;
1290   int back, len, lensub;
1291   int i, j, k, count, index = 0, start;
1292
1293   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1294     return NULL;
1295
1296   if (b != NULL && b->value.logical != 0)
1297     back = 1;
1298   else
1299     back = 0;
1300
1301   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1302                                 &x->where);
1303
1304   len = x->value.character.length;
1305   lensub = y->value.character.length;
1306
1307   if (len < lensub)
1308     {
1309       mpz_set_si (result->value.integer, 0);
1310       return result;
1311     }
1312
1313   if (back == 0)
1314     {
1315
1316       if (lensub == 0)
1317         {
1318           mpz_set_si (result->value.integer, 1);
1319           return result;
1320         }
1321       else if (lensub == 1)
1322         {
1323           for (i = 0; i < len; i++)
1324             {
1325               for (j = 0; j < lensub; j++)
1326                 {
1327                   if (y->value.character.string[j] ==
1328                       x->value.character.string[i])
1329                     {
1330                       index = i + 1;
1331                       goto done;
1332                     }
1333                 }
1334             }
1335         }
1336       else
1337         {
1338           for (i = 0; i < len; i++)
1339             {
1340               for (j = 0; j < lensub; j++)
1341                 {
1342                   if (y->value.character.string[j] ==
1343                       x->value.character.string[i])
1344                     {
1345                       start = i;
1346                       count = 0;
1347
1348                       for (k = 0; k < lensub; k++)
1349                         {
1350                           if (y->value.character.string[k] ==
1351                               x->value.character.string[k + start])
1352                             count++;
1353                         }
1354
1355                       if (count == lensub)
1356                         {
1357                           index = start + 1;
1358                           goto done;
1359                         }
1360                     }
1361                 }
1362             }
1363         }
1364
1365     }
1366   else
1367     {
1368
1369       if (lensub == 0)
1370         {
1371           mpz_set_si (result->value.integer, len + 1);
1372           return result;
1373         }
1374       else if (lensub == 1)
1375         {
1376           for (i = 0; i < len; i++)
1377             {
1378               for (j = 0; j < lensub; j++)
1379                 {
1380                   if (y->value.character.string[j] ==
1381                       x->value.character.string[len - i])
1382                     {
1383                       index = len - i + 1;
1384                       goto done;
1385                     }
1386                 }
1387             }
1388         }
1389       else
1390         {
1391           for (i = 0; i < len; i++)
1392             {
1393               for (j = 0; j < lensub; j++)
1394                 {
1395                   if (y->value.character.string[j] ==
1396                       x->value.character.string[len - i])
1397                     {
1398                       start = len - i;
1399                       if (start <= len - lensub)
1400                         {
1401                           count = 0;
1402                           for (k = 0; k < lensub; k++)
1403                             if (y->value.character.string[k] ==
1404                                 x->value.character.string[k + start])
1405                               count++;
1406
1407                           if (count == lensub)
1408                             {
1409                               index = start + 1;
1410                               goto done;
1411                             }
1412                         }
1413                       else
1414                         {
1415                           continue;
1416                         }
1417                     }
1418                 }
1419             }
1420         }
1421     }
1422
1423 done:
1424   mpz_set_si (result->value.integer, index);
1425   return range_check (result, "INDEX");
1426 }
1427
1428
1429 gfc_expr *
1430 gfc_simplify_int (gfc_expr * e, gfc_expr * k)
1431 {
1432   gfc_expr *rpart, *rtrunc, *result;
1433   int kind;
1434
1435   kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
1436   if (kind == -1)
1437     return &gfc_bad_expr;
1438
1439   if (e->expr_type != EXPR_CONSTANT)
1440     return NULL;
1441
1442   result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1443
1444   switch (e->ts.type)
1445     {
1446     case BT_INTEGER:
1447       mpz_set (result->value.integer, e->value.integer);
1448       break;
1449
1450     case BT_REAL:
1451       rtrunc = gfc_copy_expr (e);
1452       mpfr_trunc (rtrunc->value.real, e->value.real);
1453       gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1454       gfc_free_expr (rtrunc);
1455       break;
1456
1457     case BT_COMPLEX:
1458       rpart = gfc_complex2real (e, kind);
1459       rtrunc = gfc_copy_expr (rpart);
1460       mpfr_trunc (rtrunc->value.real, rpart->value.real);
1461       gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1462       gfc_free_expr (rpart);
1463       gfc_free_expr (rtrunc);
1464       break;
1465
1466     default:
1467       gfc_error ("Argument of INT at %L is not a valid type", &e->where);
1468       gfc_free_expr (result);
1469       return &gfc_bad_expr;
1470     }
1471
1472   return range_check (result, "INT");
1473 }
1474
1475
1476 gfc_expr *
1477 gfc_simplify_ifix (gfc_expr * e)
1478 {
1479   gfc_expr *rtrunc, *result;
1480
1481   if (e->expr_type != EXPR_CONSTANT)
1482     return NULL;
1483
1484   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1485                                 &e->where);
1486
1487   rtrunc = gfc_copy_expr (e);
1488
1489   mpfr_trunc (rtrunc->value.real, e->value.real);
1490   gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1491
1492   gfc_free_expr (rtrunc);
1493   return range_check (result, "IFIX");
1494 }
1495
1496
1497 gfc_expr *
1498 gfc_simplify_idint (gfc_expr * e)
1499 {
1500   gfc_expr *rtrunc, *result;
1501
1502   if (e->expr_type != EXPR_CONSTANT)
1503     return NULL;
1504
1505   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1506                                 &e->where);
1507
1508   rtrunc = gfc_copy_expr (e);
1509
1510   mpfr_trunc (rtrunc->value.real, e->value.real);
1511   gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1512
1513   gfc_free_expr (rtrunc);
1514   return range_check (result, "IDINT");
1515 }
1516
1517
1518 gfc_expr *
1519 gfc_simplify_ior (gfc_expr * x, gfc_expr * y)
1520 {
1521   gfc_expr *result;
1522
1523   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1524     return NULL;
1525
1526   result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1527
1528   mpz_ior (result->value.integer, x->value.integer, y->value.integer);
1529   return range_check (result, "IOR");
1530 }
1531
1532
1533 gfc_expr *
1534 gfc_simplify_ishft (gfc_expr * e, gfc_expr * s)
1535 {
1536   gfc_expr *result;
1537   int shift, ashift, isize, k, *bits, i;
1538
1539   if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1540     return NULL;
1541
1542   if (gfc_extract_int (s, &shift) != NULL)
1543     {
1544       gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
1545       return &gfc_bad_expr;
1546     }
1547
1548   k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
1549
1550   isize = gfc_integer_kinds[k].bit_size;
1551
1552   if (shift >= 0)
1553     ashift = shift;
1554   else
1555     ashift = -shift;
1556
1557   if (ashift > isize)
1558     {
1559       gfc_error
1560         ("Magnitude of second argument of ISHFT exceeds bit size at %L",
1561          &s->where);
1562       return &gfc_bad_expr;
1563     }
1564
1565   result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1566
1567   if (shift == 0)
1568     {
1569       mpz_set (result->value.integer, e->value.integer);
1570       return range_check (result, "ISHFT");
1571     }
1572   
1573   bits = gfc_getmem (isize * sizeof (int));
1574
1575   for (i = 0; i < isize; i++)
1576     bits[i] = mpz_tstbit (e->value.integer, i);
1577
1578   if (shift > 0)
1579     {
1580       for (i = 0; i < shift; i++)
1581         mpz_clrbit (result->value.integer, i);
1582
1583       for (i = 0; i < isize - shift; i++)
1584         {
1585           if (bits[i] == 0)
1586             mpz_clrbit (result->value.integer, i + shift);
1587           else
1588             mpz_setbit (result->value.integer, i + shift);
1589         }
1590     }
1591   else
1592     {
1593       for (i = isize - 1; i >= isize - ashift; i--)
1594         mpz_clrbit (result->value.integer, i);
1595
1596       for (i = isize - 1; i >= ashift; i--)
1597         {
1598           if (bits[i] == 0)
1599             mpz_clrbit (result->value.integer, i - ashift);
1600           else
1601             mpz_setbit (result->value.integer, i - ashift);
1602         }
1603     }
1604
1605   twos_complement (result->value.integer, isize);
1606
1607   gfc_free (bits);
1608   return result;
1609 }
1610
1611
1612 gfc_expr *
1613 gfc_simplify_ishftc (gfc_expr * e, gfc_expr * s, gfc_expr * sz)
1614 {
1615   gfc_expr *result;
1616   int shift, ashift, isize, delta, k;
1617   int i, *bits;
1618
1619   if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1620     return NULL;
1621
1622   if (gfc_extract_int (s, &shift) != NULL)
1623     {
1624       gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
1625       return &gfc_bad_expr;
1626     }
1627
1628   k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1629
1630   if (sz != NULL)
1631     {
1632       if (gfc_extract_int (sz, &isize) != NULL || isize < 0)
1633         {
1634           gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
1635           return &gfc_bad_expr;
1636         }
1637     }
1638   else
1639     isize = gfc_integer_kinds[k].bit_size;
1640
1641   if (shift >= 0)
1642     ashift = shift;
1643   else
1644     ashift = -shift;
1645
1646   if (ashift > isize)
1647     {
1648       gfc_error
1649         ("Magnitude of second argument of ISHFTC exceeds third argument "
1650          "at %L", &s->where);
1651       return &gfc_bad_expr;
1652     }
1653
1654   result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1655
1656   if (shift == 0)
1657     {
1658       mpz_set (result->value.integer, e->value.integer);
1659       return result;
1660     }
1661
1662   bits = gfc_getmem (isize * sizeof (int));
1663
1664   for (i = 0; i < isize; i++)
1665     bits[i] = mpz_tstbit (e->value.integer, i);
1666
1667   delta = isize - ashift;
1668
1669   if (shift > 0)
1670     {
1671       for (i = 0; i < delta; i++)
1672         {
1673           if (bits[i] == 0)
1674             mpz_clrbit (result->value.integer, i + shift);
1675           else
1676             mpz_setbit (result->value.integer, i + shift);
1677         }
1678
1679       for (i = delta; i < isize; i++)
1680         {
1681           if (bits[i] == 0)
1682             mpz_clrbit (result->value.integer, i - delta);
1683           else
1684             mpz_setbit (result->value.integer, i - delta);
1685         }
1686     }
1687   else
1688     {
1689       for (i = 0; i < ashift; i++)
1690         {
1691           if (bits[i] == 0)
1692             mpz_clrbit (result->value.integer, i + delta);
1693           else
1694             mpz_setbit (result->value.integer, i + delta);
1695         }
1696
1697       for (i = ashift; i < isize; i++)
1698         {
1699           if (bits[i] == 0)
1700             mpz_clrbit (result->value.integer, i + shift);
1701           else
1702             mpz_setbit (result->value.integer, i + shift);
1703         }
1704     }
1705
1706   twos_complement (result->value.integer, isize);
1707
1708   gfc_free (bits);
1709   return result;
1710 }
1711
1712
1713 gfc_expr *
1714 gfc_simplify_kind (gfc_expr * e)
1715 {
1716
1717   if (e->ts.type == BT_DERIVED)
1718     {
1719       gfc_error ("Argument of KIND at %L is a DERIVED type", &e->where);
1720       return &gfc_bad_expr;
1721     }
1722
1723   return gfc_int_expr (e->ts.kind);
1724 }
1725
1726
1727 static gfc_expr *
1728 simplify_bound (gfc_expr * array, gfc_expr * dim, int upper)
1729 {
1730   gfc_ref *ref;
1731   gfc_array_spec *as;
1732   gfc_expr *e;
1733   int d;
1734
1735   if (array->expr_type != EXPR_VARIABLE)
1736     return NULL;
1737
1738   if (dim == NULL)
1739     /* TODO: Simplify constant multi-dimensional bounds.  */
1740     return NULL;
1741
1742   if (dim->expr_type != EXPR_CONSTANT)
1743     return NULL;
1744
1745   /* Follow any component references.  */
1746   as = array->symtree->n.sym->as;
1747   for (ref = array->ref; ref; ref = ref->next)
1748     {
1749       switch (ref->type)
1750         {
1751         case REF_ARRAY:
1752           switch (ref->u.ar.type)
1753             {
1754             case AR_ELEMENT:
1755               as = NULL;
1756               continue;
1757
1758             case AR_FULL:
1759               /* We're done because 'as' has already been set in the
1760                  previous iteration.  */
1761               goto done;
1762
1763             case AR_SECTION:
1764             case AR_UNKNOWN:
1765               return NULL;
1766             }
1767
1768           gcc_unreachable ();
1769
1770         case REF_COMPONENT:
1771           as = ref->u.c.component->as;
1772           continue;
1773
1774         case REF_SUBSTRING:
1775           continue;
1776         }
1777     }
1778
1779   gcc_unreachable ();
1780
1781  done:
1782   if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
1783     return NULL;
1784
1785   d = mpz_get_si (dim->value.integer);
1786
1787   if (d < 1 || d > as->rank
1788       || (d == as->rank && as->type == AS_ASSUMED_SIZE && upper))
1789     {
1790       gfc_error ("DIM argument at %L is out of bounds", &dim->where);
1791       return &gfc_bad_expr;
1792     }
1793
1794   e = upper ? as->upper[d-1] : as->lower[d-1];
1795
1796   if (e->expr_type != EXPR_CONSTANT)
1797     return NULL;
1798
1799   return gfc_copy_expr (e);
1800 }
1801
1802
1803 gfc_expr *
1804 gfc_simplify_lbound (gfc_expr * array, gfc_expr * dim)
1805 {
1806   return simplify_bound (array, dim, 0);
1807 }
1808
1809
1810 gfc_expr *
1811 gfc_simplify_len (gfc_expr * e)
1812 {
1813   gfc_expr *result;
1814
1815   if (e->expr_type != EXPR_CONSTANT)
1816     return NULL;
1817
1818   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1819                                 &e->where);
1820
1821   mpz_set_si (result->value.integer, e->value.character.length);
1822   return range_check (result, "LEN");
1823 }
1824
1825
1826 gfc_expr *
1827 gfc_simplify_len_trim (gfc_expr * e)
1828 {
1829   gfc_expr *result;
1830   int count, len, lentrim, i;
1831
1832   if (e->expr_type != EXPR_CONSTANT)
1833     return NULL;
1834
1835   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1836                                 &e->where);
1837
1838   len = e->value.character.length;
1839
1840   for (count = 0, i = 1; i <= len; i++)
1841     if (e->value.character.string[len - i] == ' ')
1842       count++;
1843     else
1844       break;
1845
1846   lentrim = len - count;
1847
1848   mpz_set_si (result->value.integer, lentrim);
1849   return range_check (result, "LEN_TRIM");
1850 }
1851
1852
1853 gfc_expr *
1854 gfc_simplify_lge (gfc_expr * a, gfc_expr * b)
1855 {
1856
1857   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
1858     return NULL;
1859
1860   return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) >= 0,
1861                            &a->where);
1862 }
1863
1864
1865 gfc_expr *
1866 gfc_simplify_lgt (gfc_expr * a, gfc_expr * b)
1867 {
1868
1869   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
1870     return NULL;
1871
1872   return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) > 0,
1873                            &a->where);
1874 }
1875
1876
1877 gfc_expr *
1878 gfc_simplify_lle (gfc_expr * a, gfc_expr * b)
1879 {
1880
1881   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
1882     return NULL;
1883
1884   return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) <= 0,
1885                            &a->where);
1886 }
1887
1888
1889 gfc_expr *
1890 gfc_simplify_llt (gfc_expr * a, gfc_expr * b)
1891 {
1892
1893   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
1894     return NULL;
1895
1896   return gfc_logical_expr (gfc_compare_string (a, b, xascii_table) < 0,
1897                            &a->where);
1898 }
1899
1900
1901 gfc_expr *
1902 gfc_simplify_log (gfc_expr * x)
1903 {
1904   gfc_expr *result;
1905   mpfr_t xr, xi;
1906
1907   if (x->expr_type != EXPR_CONSTANT)
1908     return NULL;
1909
1910   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1911
1912   gfc_set_model_kind (x->ts.kind);
1913
1914   switch (x->ts.type)
1915     {
1916     case BT_REAL:
1917       if (mpfr_sgn (x->value.real) <= 0)
1918         {
1919           gfc_error
1920             ("Argument of LOG at %L cannot be less than or equal to zero",
1921              &x->where);
1922           gfc_free_expr (result);
1923           return &gfc_bad_expr;
1924         }
1925
1926       mpfr_log(result->value.real, x->value.real, GFC_RND_MODE);
1927       break;
1928
1929     case BT_COMPLEX:
1930       if ((mpfr_sgn (x->value.complex.r) == 0)
1931           && (mpfr_sgn (x->value.complex.i) == 0))
1932         {
1933           gfc_error ("Complex argument of LOG at %L cannot be zero",
1934                      &x->where);
1935           gfc_free_expr (result);
1936           return &gfc_bad_expr;
1937         }
1938
1939       mpfr_init (xr);
1940       mpfr_init (xi);
1941
1942       arctangent2 (x->value.complex.i, x->value.complex.r,
1943                    result->value.complex.i);
1944
1945       mpfr_mul (xr, x->value.complex.r, x->value.complex.r, GFC_RND_MODE);
1946       mpfr_mul (xi, x->value.complex.i, x->value.complex.i, GFC_RND_MODE);
1947       mpfr_add (xr, xr, xi, GFC_RND_MODE);
1948       mpfr_sqrt (xr, xr, GFC_RND_MODE);
1949       mpfr_log (result->value.complex.r, xr, GFC_RND_MODE);
1950
1951       mpfr_clear (xr);
1952       mpfr_clear (xi);
1953
1954       break;
1955
1956     default:
1957       gfc_internal_error ("gfc_simplify_log: bad type");
1958     }
1959
1960   return range_check (result, "LOG");
1961 }
1962
1963
1964 gfc_expr *
1965 gfc_simplify_log10 (gfc_expr * x)
1966 {
1967   gfc_expr *result;
1968
1969   if (x->expr_type != EXPR_CONSTANT)
1970     return NULL;
1971
1972   gfc_set_model_kind (x->ts.kind);
1973
1974   if (mpfr_sgn (x->value.real) <= 0)
1975     {
1976       gfc_error
1977         ("Argument of LOG10 at %L cannot be less than or equal to zero",
1978          &x->where);
1979       return &gfc_bad_expr;
1980     }
1981
1982   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1983
1984   mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
1985
1986   return range_check (result, "LOG10");
1987 }
1988
1989
1990 gfc_expr *
1991 gfc_simplify_logical (gfc_expr * e, gfc_expr * k)
1992 {
1993   gfc_expr *result;
1994   int kind;
1995
1996   kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
1997   if (kind < 0)
1998     return &gfc_bad_expr;
1999
2000   if (e->expr_type != EXPR_CONSTANT)
2001     return NULL;
2002
2003   result = gfc_constant_result (BT_LOGICAL, kind, &e->where);
2004
2005   result->value.logical = e->value.logical;
2006
2007   return result;
2008 }
2009
2010
2011 /* This function is special since MAX() can take any number of
2012    arguments.  The simplified expression is a rewritten version of the
2013    argument list containing at most one constant element.  Other
2014    constant elements are deleted.  Because the argument list has
2015    already been checked, this function always succeeds.  sign is 1 for
2016    MAX(), -1 for MIN().  */
2017
2018 static gfc_expr *
2019 simplify_min_max (gfc_expr * expr, int sign)
2020 {
2021   gfc_actual_arglist *arg, *last, *extremum;
2022   gfc_intrinsic_sym * specific;
2023
2024   last = NULL;
2025   extremum = NULL;
2026   specific = expr->value.function.isym;
2027
2028   arg = expr->value.function.actual;
2029
2030   for (; arg; last = arg, arg = arg->next)
2031     {
2032       if (arg->expr->expr_type != EXPR_CONSTANT)
2033         continue;
2034
2035       if (extremum == NULL)
2036         {
2037           extremum = arg;
2038           continue;
2039         }
2040
2041       switch (arg->expr->ts.type)
2042         {
2043         case BT_INTEGER:
2044           if (mpz_cmp (arg->expr->value.integer,
2045                        extremum->expr->value.integer) * sign > 0)
2046             mpz_set (extremum->expr->value.integer, arg->expr->value.integer);
2047
2048           break;
2049
2050         case BT_REAL:
2051           if (mpfr_cmp (arg->expr->value.real, extremum->expr->value.real) *
2052               sign > 0)
2053             mpfr_set (extremum->expr->value.real, arg->expr->value.real,
2054                       GFC_RND_MODE);
2055
2056           break;
2057
2058         default:
2059           gfc_internal_error ("gfc_simplify_max(): Bad type in arglist");
2060         }
2061
2062       /* Delete the extra constant argument.  */
2063       if (last == NULL)
2064         expr->value.function.actual = arg->next;
2065       else
2066         last->next = arg->next;
2067
2068       arg->next = NULL;
2069       gfc_free_actual_arglist (arg);
2070       arg = last;
2071     }
2072
2073   /* If there is one value left, replace the function call with the
2074      expression.  */
2075   if (expr->value.function.actual->next != NULL)
2076     return NULL;
2077
2078   /* Convert to the correct type and kind.  */
2079   if (expr->ts.type != BT_UNKNOWN) 
2080     return gfc_convert_constant (expr->value.function.actual->expr,
2081         expr->ts.type, expr->ts.kind);
2082
2083   if (specific->ts.type != BT_UNKNOWN) 
2084     return gfc_convert_constant (expr->value.function.actual->expr,
2085         specific->ts.type, specific->ts.kind); 
2086  
2087   return gfc_copy_expr (expr->value.function.actual->expr);
2088 }
2089
2090
2091 gfc_expr *
2092 gfc_simplify_min (gfc_expr * e)
2093 {
2094   return simplify_min_max (e, -1);
2095 }
2096
2097
2098 gfc_expr *
2099 gfc_simplify_max (gfc_expr * e)
2100 {
2101   return simplify_min_max (e, 1);
2102 }
2103
2104
2105 gfc_expr *
2106 gfc_simplify_maxexponent (gfc_expr * x)
2107 {
2108   gfc_expr *result;
2109   int i;
2110
2111   i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2112
2113   result = gfc_int_expr (gfc_real_kinds[i].max_exponent);
2114   result->where = x->where;
2115
2116   return result;
2117 }
2118
2119
2120 gfc_expr *
2121 gfc_simplify_minexponent (gfc_expr * x)
2122 {
2123   gfc_expr *result;
2124   int i;
2125
2126   i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2127
2128   result = gfc_int_expr (gfc_real_kinds[i].min_exponent);
2129   result->where = x->where;
2130
2131   return result;
2132 }
2133
2134
2135 gfc_expr *
2136 gfc_simplify_mod (gfc_expr * a, gfc_expr * p)
2137 {
2138   gfc_expr *result;
2139   mpfr_t quot, iquot, term;
2140
2141   if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2142     return NULL;
2143
2144   result = gfc_constant_result (a->ts.type, a->ts.kind, &a->where);
2145
2146   switch (a->ts.type)
2147     {
2148     case BT_INTEGER:
2149       if (mpz_cmp_ui (p->value.integer, 0) == 0)
2150         {
2151           /* Result is processor-dependent.  */
2152           gfc_error ("Second argument MOD at %L is zero", &a->where);
2153           gfc_free_expr (result);
2154           return &gfc_bad_expr;
2155         }
2156       mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
2157       break;
2158
2159     case BT_REAL:
2160       if (mpfr_cmp_ui (p->value.real, 0) == 0)
2161         {
2162           /* Result is processor-dependent.  */
2163           gfc_error ("Second argument of MOD at %L is zero", &p->where);
2164           gfc_free_expr (result);
2165           return &gfc_bad_expr;
2166         }
2167
2168       gfc_set_model_kind (a->ts.kind);
2169       mpfr_init (quot);
2170       mpfr_init (iquot);
2171       mpfr_init (term);
2172
2173       mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2174       mpfr_trunc (iquot, quot);
2175       mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2176       mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2177
2178       mpfr_clear (quot);
2179       mpfr_clear (iquot);
2180       mpfr_clear (term);
2181       break;
2182
2183     default:
2184       gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
2185     }
2186
2187   return range_check (result, "MOD");
2188 }
2189
2190
2191 gfc_expr *
2192 gfc_simplify_modulo (gfc_expr * a, gfc_expr * p)
2193 {
2194   gfc_expr *result;
2195   mpfr_t quot, iquot, term;
2196
2197   if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2198     return NULL;
2199
2200   result = gfc_constant_result (a->ts.type, a->ts.kind, &a->where);
2201
2202   switch (a->ts.type)
2203     {
2204     case BT_INTEGER:
2205       if (mpz_cmp_ui (p->value.integer, 0) == 0)
2206         {
2207           /* Result is processor-dependent. This processor just opts
2208              to not handle it at all.  */
2209           gfc_error ("Second argument of MODULO at %L is zero", &a->where);
2210           gfc_free_expr (result);
2211           return &gfc_bad_expr;
2212         }
2213       mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
2214
2215       break;
2216
2217     case BT_REAL:
2218       if (mpfr_cmp_ui (p->value.real, 0) == 0)
2219         {
2220           /* Result is processor-dependent.  */
2221           gfc_error ("Second argument of MODULO at %L is zero", &p->where);
2222           gfc_free_expr (result);
2223           return &gfc_bad_expr;
2224         }
2225
2226       gfc_set_model_kind (a->ts.kind);
2227       mpfr_init (quot);
2228       mpfr_init (iquot);
2229       mpfr_init (term);
2230
2231       mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2232       mpfr_floor (iquot, quot);
2233       mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2234
2235       mpfr_clear (quot);
2236       mpfr_clear (iquot);
2237       mpfr_clear (term);
2238
2239       mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2240       break;
2241
2242     default:
2243       gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
2244     }
2245
2246   return range_check (result, "MODULO");
2247 }
2248
2249
2250 /* Exists for the sole purpose of consistency with other intrinsics.  */
2251 gfc_expr *
2252 gfc_simplify_mvbits (gfc_expr * f  ATTRIBUTE_UNUSED,
2253                      gfc_expr * fp ATTRIBUTE_UNUSED,
2254                      gfc_expr * l  ATTRIBUTE_UNUSED,
2255                      gfc_expr * to ATTRIBUTE_UNUSED,
2256                      gfc_expr * tp ATTRIBUTE_UNUSED)
2257 {
2258   return NULL;
2259 }
2260
2261
2262 gfc_expr *
2263 gfc_simplify_nearest (gfc_expr * x, gfc_expr * s)
2264 {
2265   gfc_expr *result;
2266   mpfr_t tmp;
2267   int direction, sgn;
2268
2269   if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2270     return NULL;
2271
2272   gfc_set_model_kind (x->ts.kind);
2273   result = gfc_copy_expr (x);
2274
2275   direction = mpfr_sgn (s->value.real);
2276
2277   if (direction == 0)
2278     {
2279       gfc_error ("Second argument of NEAREST at %L may not be zero",
2280                  &s->where);
2281       gfc_free (result);
2282       return &gfc_bad_expr;
2283     }
2284
2285   /* TODO: Use mpfr_nextabove and mpfr_nextbelow once we move to a
2286      newer version of mpfr.  */
2287
2288   sgn = mpfr_sgn (x->value.real);
2289
2290   if (sgn == 0)
2291     {
2292       int k = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
2293
2294       if (direction > 0)
2295         mpfr_add (result->value.real,
2296                   x->value.real, gfc_real_kinds[k].tiny, GFC_RND_MODE);
2297       else
2298         mpfr_sub (result->value.real,
2299                   x->value.real, gfc_real_kinds[k].tiny, GFC_RND_MODE);
2300
2301 #if 0
2302       /* FIXME: This gives an arithmetic error because we compare
2303          against tiny when range-checking.  Also, it doesn't give the
2304          right value.  */
2305       /* TINY is the smallest model number, we want the smallest
2306          machine representable number.  Therefore we have to shift the
2307          value to the right by the number of digits - 1.  */
2308       mpfr_div_2ui (result->value.real, result->value.real,
2309                     gfc_real_kinds[k].precision - 1, GFC_RND_MODE);
2310 #endif
2311     }
2312   else
2313     {
2314       if (sgn < 0)
2315         {
2316           direction = -direction;
2317           mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
2318         }
2319
2320       if (direction > 0)
2321         mpfr_add_one_ulp (result->value.real, GFC_RND_MODE);
2322       else
2323         {
2324           /* In this case the exponent can shrink, which makes us skip
2325              over one number because we subtract one ulp with the
2326              larger exponent.  Thus we need to compensate for this.  */
2327           mpfr_init_set (tmp, result->value.real, GFC_RND_MODE);
2328
2329           mpfr_sub_one_ulp (result->value.real, GFC_RND_MODE);
2330           mpfr_add_one_ulp (result->value.real, GFC_RND_MODE);
2331
2332           /* If we're back to where we started, the spacing is one
2333              ulp, and we get the correct result by subtracting.  */
2334           if (mpfr_cmp (tmp, result->value.real) == 0)
2335             mpfr_sub_one_ulp (result->value.real, GFC_RND_MODE);
2336
2337           mpfr_clear (tmp);
2338         }
2339
2340       if (sgn < 0)
2341         mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
2342     }
2343
2344   return range_check (result, "NEAREST");
2345 }
2346
2347
2348 static gfc_expr *
2349 simplify_nint (const char *name, gfc_expr * e, gfc_expr * k)
2350 {
2351   gfc_expr *itrunc, *result;
2352   int kind;
2353
2354   kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
2355   if (kind == -1)
2356     return &gfc_bad_expr;
2357
2358   if (e->expr_type != EXPR_CONSTANT)
2359     return NULL;
2360
2361   result = gfc_constant_result (BT_INTEGER, kind, &e->where);
2362
2363   itrunc = gfc_copy_expr (e);
2364
2365   mpfr_round(itrunc->value.real, e->value.real);
2366
2367   gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real);
2368
2369   gfc_free_expr (itrunc);
2370
2371   return range_check (result, name);
2372 }
2373
2374
2375 gfc_expr *
2376 gfc_simplify_nint (gfc_expr * e, gfc_expr * k)
2377 {
2378   return simplify_nint ("NINT", e, k);
2379 }
2380
2381
2382 gfc_expr *
2383 gfc_simplify_idnint (gfc_expr * e)
2384 {
2385   return simplify_nint ("IDNINT", e, NULL);
2386 }
2387
2388
2389 gfc_expr *
2390 gfc_simplify_not (gfc_expr * e)
2391 {
2392   gfc_expr *result;
2393   int i;
2394
2395   if (e->expr_type != EXPR_CONSTANT)
2396     return NULL;
2397
2398   result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2399
2400   mpz_com (result->value.integer, e->value.integer);
2401
2402   /* Because of how GMP handles numbers, the result must be ANDed with
2403      the max_int mask.  For radices <> 2, this will require change.  */
2404
2405   i = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2406
2407   mpz_and (result->value.integer, result->value.integer,
2408            gfc_integer_kinds[i].max_int);
2409
2410   return range_check (result, "NOT");
2411 }
2412
2413
2414 gfc_expr *
2415 gfc_simplify_null (gfc_expr * mold)
2416 {
2417   gfc_expr *result;
2418
2419   result = gfc_get_expr ();
2420   result->expr_type = EXPR_NULL;
2421
2422   if (mold == NULL)
2423     result->ts.type = BT_UNKNOWN;
2424   else
2425     {
2426       result->ts = mold->ts;
2427       result->where = mold->where;
2428     }
2429
2430   return result;
2431 }
2432
2433
2434 gfc_expr *
2435 gfc_simplify_precision (gfc_expr * e)
2436 {
2437   gfc_expr *result;
2438   int i;
2439
2440   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2441
2442   result = gfc_int_expr (gfc_real_kinds[i].precision);
2443   result->where = e->where;
2444
2445   return result;
2446 }
2447
2448
2449 gfc_expr *
2450 gfc_simplify_radix (gfc_expr * e)
2451 {
2452   gfc_expr *result;
2453   int i;
2454
2455   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2456   switch (e->ts.type)
2457     {
2458     case BT_INTEGER:
2459       i = gfc_integer_kinds[i].radix;
2460       break;
2461
2462     case BT_REAL:
2463       i = gfc_real_kinds[i].radix;
2464       break;
2465
2466     default:
2467       gcc_unreachable ();
2468     }
2469
2470   result = gfc_int_expr (i);
2471   result->where = e->where;
2472
2473   return result;
2474 }
2475
2476
2477 gfc_expr *
2478 gfc_simplify_range (gfc_expr * e)
2479 {
2480   gfc_expr *result;
2481   int i;
2482   long j;
2483
2484   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2485
2486   switch (e->ts.type)
2487     {
2488     case BT_INTEGER:
2489       j = gfc_integer_kinds[i].range;
2490       break;
2491
2492     case BT_REAL:
2493     case BT_COMPLEX:
2494       j = gfc_real_kinds[i].range;
2495       break;
2496
2497     default:
2498       gcc_unreachable ();
2499     }
2500
2501   result = gfc_int_expr (j);
2502   result->where = e->where;
2503
2504   return result;
2505 }
2506
2507
2508 gfc_expr *
2509 gfc_simplify_real (gfc_expr * e, gfc_expr * k)
2510 {
2511   gfc_expr *result;
2512   int kind;
2513
2514   if (e->ts.type == BT_COMPLEX)
2515     kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
2516   else
2517     kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
2518
2519   if (kind == -1)
2520     return &gfc_bad_expr;
2521
2522   if (e->expr_type != EXPR_CONSTANT)
2523     return NULL;
2524
2525   switch (e->ts.type)
2526     {
2527     case BT_INTEGER:
2528       result = gfc_int2real (e, kind);
2529       break;
2530
2531     case BT_REAL:
2532       result = gfc_real2real (e, kind);
2533       break;
2534
2535     case BT_COMPLEX:
2536       result = gfc_complex2real (e, kind);
2537       break;
2538
2539     default:
2540       gfc_internal_error ("bad type in REAL");
2541       /* Not reached */
2542     }
2543
2544   return range_check (result, "REAL");
2545 }
2546
2547 gfc_expr *
2548 gfc_simplify_repeat (gfc_expr * e, gfc_expr * n)
2549 {
2550   gfc_expr *result;
2551   int i, j, len, ncopies, nlen;
2552
2553   if (e->expr_type != EXPR_CONSTANT || n->expr_type != EXPR_CONSTANT)
2554     return NULL;
2555
2556   if (n != NULL && (gfc_extract_int (n, &ncopies) != NULL || ncopies < 0))
2557     {
2558       gfc_error ("Invalid second argument of REPEAT at %L", &n->where);
2559       return &gfc_bad_expr;
2560     }
2561
2562   len = e->value.character.length;
2563   nlen = ncopies * len;
2564
2565   result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
2566
2567   if (ncopies == 0)
2568     {
2569       result->value.character.string = gfc_getmem (1);
2570       result->value.character.length = 0;
2571       result->value.character.string[0] = '\0';
2572       return result;
2573     }
2574
2575   result->value.character.length = nlen;
2576   result->value.character.string = gfc_getmem (nlen + 1);
2577
2578   for (i = 0; i < ncopies; i++)
2579     for (j = 0; j < len; j++)
2580       result->value.character.string[j + i * len] =
2581         e->value.character.string[j];
2582
2583   result->value.character.string[nlen] = '\0';  /* For debugger */
2584   return result;
2585 }
2586
2587
2588 /* This one is a bear, but mainly has to do with shuffling elements.  */
2589
2590 gfc_expr *
2591 gfc_simplify_reshape (gfc_expr * source, gfc_expr * shape_exp,
2592                       gfc_expr * pad, gfc_expr * order_exp)
2593 {
2594
2595   int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
2596   int i, rank, npad, x[GFC_MAX_DIMENSIONS];
2597   gfc_constructor *head, *tail;
2598   mpz_t index, size;
2599   unsigned long j;
2600   size_t nsource;
2601   gfc_expr *e;
2602
2603   /* Unpack the shape array.  */
2604   if (source->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (source))
2605     return NULL;
2606
2607   if (shape_exp->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (shape_exp))
2608     return NULL;
2609
2610   if (pad != NULL
2611       && (pad->expr_type != EXPR_ARRAY
2612           || !gfc_is_constant_expr (pad)))
2613     return NULL;
2614
2615   if (order_exp != NULL
2616       && (order_exp->expr_type != EXPR_ARRAY
2617           || !gfc_is_constant_expr (order_exp)))
2618     return NULL;
2619
2620   mpz_init (index);
2621   rank = 0;
2622   head = tail = NULL;
2623
2624   for (;;)
2625     {
2626       e = gfc_get_array_element (shape_exp, rank);
2627       if (e == NULL)
2628         break;
2629
2630       if (gfc_extract_int (e, &shape[rank]) != NULL)
2631         {
2632           gfc_error ("Integer too large in shape specification at %L",
2633                      &e->where);
2634           gfc_free_expr (e);
2635           goto bad_reshape;
2636         }
2637
2638       gfc_free_expr (e);
2639
2640       if (rank >= GFC_MAX_DIMENSIONS)
2641         {
2642           gfc_error ("Too many dimensions in shape specification for RESHAPE "
2643                      "at %L", &e->where);
2644
2645           goto bad_reshape;
2646         }
2647
2648       if (shape[rank] < 0)
2649         {
2650           gfc_error ("Shape specification at %L cannot be negative",
2651                      &e->where);
2652           goto bad_reshape;
2653         }
2654
2655       rank++;
2656     }
2657
2658   if (rank == 0)
2659     {
2660       gfc_error ("Shape specification at %L cannot be the null array",
2661                  &shape_exp->where);
2662       goto bad_reshape;
2663     }
2664
2665   /* Now unpack the order array if present.  */
2666   if (order_exp == NULL)
2667     {
2668       for (i = 0; i < rank; i++)
2669         order[i] = i;
2670
2671     }
2672   else
2673     {
2674
2675       for (i = 0; i < rank; i++)
2676         x[i] = 0;
2677
2678       for (i = 0; i < rank; i++)
2679         {
2680           e = gfc_get_array_element (order_exp, i);
2681           if (e == NULL)
2682             {
2683               gfc_error
2684                 ("ORDER parameter of RESHAPE at %L is not the same size "
2685                  "as SHAPE parameter", &order_exp->where);
2686               goto bad_reshape;
2687             }
2688
2689           if (gfc_extract_int (e, &order[i]) != NULL)
2690             {
2691               gfc_error ("Error in ORDER parameter of RESHAPE at %L",
2692                          &e->where);
2693               gfc_free_expr (e);
2694               goto bad_reshape;
2695             }
2696
2697           gfc_free_expr (e);
2698
2699           if (order[i] < 1 || order[i] > rank)
2700             {
2701               gfc_error ("ORDER parameter of RESHAPE at %L is out of range",
2702                          &e->where);
2703               goto bad_reshape;
2704             }
2705
2706           order[i]--;
2707
2708           if (x[order[i]])
2709             {
2710               gfc_error ("Invalid permutation in ORDER parameter at %L",
2711                          &e->where);
2712               goto bad_reshape;
2713             }
2714
2715           x[order[i]] = 1;
2716         }
2717     }
2718
2719   /* Count the elements in the source and padding arrays.  */
2720
2721   npad = 0;
2722   if (pad != NULL)
2723     {
2724       gfc_array_size (pad, &size);
2725       npad = mpz_get_ui (size);
2726       mpz_clear (size);
2727     }
2728
2729   gfc_array_size (source, &size);
2730   nsource = mpz_get_ui (size);
2731   mpz_clear (size);
2732
2733   /* If it weren't for that pesky permutation we could just loop
2734      through the source and round out any shortage with pad elements.
2735      But no, someone just had to have the compiler do something the
2736      user should be doing.  */
2737
2738   for (i = 0; i < rank; i++)
2739     x[i] = 0;
2740
2741   for (;;)
2742     {
2743       /* Figure out which element to extract.  */
2744       mpz_set_ui (index, 0);
2745
2746       for (i = rank - 1; i >= 0; i--)
2747         {
2748           mpz_add_ui (index, index, x[order[i]]);
2749           if (i != 0)
2750             mpz_mul_ui (index, index, shape[order[i - 1]]);
2751         }
2752
2753       if (mpz_cmp_ui (index, INT_MAX) > 0)
2754         gfc_internal_error ("Reshaped array too large at %L", &e->where);
2755
2756       j = mpz_get_ui (index);
2757
2758       if (j < nsource)
2759         e = gfc_get_array_element (source, j);
2760       else
2761         {
2762           j = j - nsource;
2763
2764           if (npad == 0)
2765             {
2766               gfc_error
2767                 ("PAD parameter required for short SOURCE parameter at %L",
2768                  &source->where);
2769               goto bad_reshape;
2770             }
2771
2772           j = j % npad;
2773           e = gfc_get_array_element (pad, j);
2774         }
2775
2776       if (head == NULL)
2777         head = tail = gfc_get_constructor ();
2778       else
2779         {
2780           tail->next = gfc_get_constructor ();
2781           tail = tail->next;
2782         }
2783
2784       if (e == NULL)
2785         goto bad_reshape;
2786
2787       tail->where = e->where;
2788       tail->expr = e;
2789
2790       /* Calculate the next element.  */
2791       i = 0;
2792
2793 inc:
2794       if (++x[i] < shape[i])
2795         continue;
2796       x[i++] = 0;
2797       if (i < rank)
2798         goto inc;
2799
2800       break;
2801     }
2802
2803   mpz_clear (index);
2804
2805   e = gfc_get_expr ();
2806   e->where = source->where;
2807   e->expr_type = EXPR_ARRAY;
2808   e->value.constructor = head;
2809   e->shape = gfc_get_shape (rank);
2810
2811   for (i = 0; i < rank; i++)
2812     mpz_init_set_ui (e->shape[i], shape[i]);
2813
2814   e->ts = head->expr->ts;
2815   e->rank = rank;
2816
2817   return e;
2818
2819 bad_reshape:
2820   gfc_free_constructor (head);
2821   mpz_clear (index);
2822   return &gfc_bad_expr;
2823 }
2824
2825
2826 gfc_expr *
2827 gfc_simplify_rrspacing (gfc_expr * x)
2828 {
2829   gfc_expr *result;
2830   mpfr_t absv, log2, exp, frac, pow2;
2831   int i, p;
2832
2833   if (x->expr_type != EXPR_CONSTANT)
2834     return NULL;
2835
2836   i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2837
2838   result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
2839
2840   p = gfc_real_kinds[i].digits;
2841
2842   gfc_set_model_kind (x->ts.kind);
2843
2844   if (mpfr_sgn (x->value.real) == 0)
2845     {
2846       mpfr_ui_div (result->value.real, 1, gfc_real_kinds[i].tiny, GFC_RND_MODE);
2847       return result;
2848     }
2849
2850   mpfr_init (log2);
2851   mpfr_init (absv);
2852   mpfr_init (frac);
2853   mpfr_init (pow2);
2854
2855   mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2856   mpfr_log2 (log2, absv, GFC_RND_MODE);
2857
2858   mpfr_trunc (log2, log2);
2859   mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
2860
2861   mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2862   mpfr_div (frac, absv, pow2, GFC_RND_MODE);
2863
2864   mpfr_mul_2exp (result->value.real, frac, (unsigned long)p, GFC_RND_MODE);
2865
2866   mpfr_clear (log2);
2867   mpfr_clear (absv);
2868   mpfr_clear (frac);
2869   mpfr_clear (pow2);
2870
2871   return range_check (result, "RRSPACING");
2872 }
2873
2874
2875 gfc_expr *
2876 gfc_simplify_scale (gfc_expr * x, gfc_expr * i)
2877 {
2878   int k, neg_flag, power, exp_range;
2879   mpfr_t scale, radix;
2880   gfc_expr *result;
2881
2882   if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
2883     return NULL;
2884
2885   result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
2886
2887   if (mpfr_sgn (x->value.real) == 0)
2888     {
2889       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2890       return result;
2891     }
2892
2893   k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2894
2895   exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
2896
2897   /* This check filters out values of i that would overflow an int.  */
2898   if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
2899       || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
2900     {
2901       gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
2902       return &gfc_bad_expr;
2903     }
2904
2905   /* Compute scale = radix ** power.  */
2906   power = mpz_get_si (i->value.integer);
2907
2908   if (power >= 0)
2909     neg_flag = 0;
2910   else
2911     {
2912       neg_flag = 1;
2913       power = -power;
2914     }
2915
2916   gfc_set_model_kind (x->ts.kind);
2917   mpfr_init (scale);
2918   mpfr_init (radix);
2919   mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
2920   mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
2921
2922   if (neg_flag)
2923     mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
2924   else
2925     mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
2926
2927   mpfr_clear (scale);
2928   mpfr_clear (radix);
2929
2930   return range_check (result, "SCALE");
2931 }
2932
2933
2934 gfc_expr *
2935 gfc_simplify_scan (gfc_expr * e, gfc_expr * c, gfc_expr * b)
2936 {
2937   gfc_expr *result;
2938   int back;
2939   size_t i;
2940   size_t indx, len, lenc;
2941
2942   if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
2943     return NULL;
2944
2945   if (b != NULL && b->value.logical != 0)
2946     back = 1;
2947   else
2948     back = 0;
2949
2950   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
2951                                 &e->where);
2952
2953   len = e->value.character.length;
2954   lenc = c->value.character.length;
2955
2956   if (len == 0 || lenc == 0)
2957     {
2958       indx = 0;
2959     }
2960   else
2961     {
2962       if (back == 0)
2963         {
2964           indx =
2965             strcspn (e->value.character.string, c->value.character.string) + 1;
2966           if (indx > len)
2967             indx = 0;
2968         }
2969       else
2970         {
2971           i = 0;
2972           for (indx = len; indx > 0; indx--)
2973             {
2974               for (i = 0; i < lenc; i++)
2975                 {
2976                   if (c->value.character.string[i]
2977                         == e->value.character.string[indx - 1])
2978                     break;
2979                 }
2980               if (i < lenc)
2981                 break;
2982             }
2983         }
2984     }
2985   mpz_set_ui (result->value.integer, indx);
2986   return range_check (result, "SCAN");
2987 }
2988
2989
2990 gfc_expr *
2991 gfc_simplify_selected_int_kind (gfc_expr * e)
2992 {
2993   int i, kind, range;
2994   gfc_expr *result;
2995
2996   if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
2997     return NULL;
2998
2999   kind = INT_MAX;
3000
3001   for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3002     if (gfc_integer_kinds[i].range >= range
3003         && gfc_integer_kinds[i].kind < kind)
3004       kind = gfc_integer_kinds[i].kind;
3005
3006   if (kind == INT_MAX)
3007     kind = -1;
3008
3009   result = gfc_int_expr (kind);
3010   result->where = e->where;
3011
3012   return result;
3013 }
3014
3015
3016 gfc_expr *
3017 gfc_simplify_selected_real_kind (gfc_expr * p, gfc_expr * q)
3018 {
3019   int range, precision, i, kind, found_precision, found_range;
3020   gfc_expr *result;
3021
3022   if (p == NULL)
3023     precision = 0;
3024   else
3025     {
3026       if (p->expr_type != EXPR_CONSTANT
3027           || gfc_extract_int (p, &precision) != NULL)
3028         return NULL;
3029     }
3030
3031   if (q == NULL)
3032     range = 0;
3033   else
3034     {
3035       if (q->expr_type != EXPR_CONSTANT
3036           || gfc_extract_int (q, &range) != NULL)
3037         return NULL;
3038     }
3039
3040   kind = INT_MAX;
3041   found_precision = 0;
3042   found_range = 0;
3043
3044   for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3045     {
3046       if (gfc_real_kinds[i].precision >= precision)
3047         found_precision = 1;
3048
3049       if (gfc_real_kinds[i].range >= range)
3050         found_range = 1;
3051
3052       if (gfc_real_kinds[i].precision >= precision
3053           && gfc_real_kinds[i].range >= range && gfc_real_kinds[i].kind < kind)
3054         kind = gfc_real_kinds[i].kind;
3055     }
3056
3057   if (kind == INT_MAX)
3058     {
3059       kind = 0;
3060
3061       if (!found_precision)
3062         kind = -1;
3063       if (!found_range)
3064         kind -= 2;
3065     }
3066
3067   result = gfc_int_expr (kind);
3068   result->where = (p != NULL) ? p->where : q->where;
3069
3070   return result;
3071 }
3072
3073
3074 gfc_expr *
3075 gfc_simplify_set_exponent (gfc_expr * x, gfc_expr * i)
3076 {
3077   gfc_expr *result;
3078   mpfr_t exp, absv, log2, pow2, frac;
3079   unsigned long exp2;
3080
3081   if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3082     return NULL;
3083
3084   result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3085
3086   gfc_set_model_kind (x->ts.kind);
3087
3088   if (mpfr_sgn (x->value.real) == 0)
3089     {
3090       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3091       return result;
3092     }
3093
3094   mpfr_init (absv);
3095   mpfr_init (log2);
3096   mpfr_init (exp);
3097   mpfr_init (pow2);
3098   mpfr_init (frac);
3099
3100   mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3101   mpfr_log2 (log2, absv, GFC_RND_MODE);
3102
3103   mpfr_trunc (log2, log2);
3104   mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3105
3106   /* Old exponent value, and fraction.  */
3107   mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3108
3109   mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3110
3111   /* New exponent.  */
3112   exp2 = (unsigned long) mpz_get_d (i->value.integer);
3113   mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
3114
3115   mpfr_clear (absv);
3116   mpfr_clear (log2);
3117   mpfr_clear (pow2);
3118   mpfr_clear (frac);
3119
3120   return range_check (result, "SET_EXPONENT");
3121 }
3122
3123
3124 gfc_expr *
3125 gfc_simplify_shape (gfc_expr * source)
3126 {
3127   mpz_t shape[GFC_MAX_DIMENSIONS];
3128   gfc_expr *result, *e, *f;
3129   gfc_array_ref *ar;
3130   int n;
3131   try t;
3132
3133   if (source->rank == 0 || source->expr_type != EXPR_VARIABLE)
3134     return NULL;
3135
3136   result = gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3137                                   &source->where);
3138
3139   ar = gfc_find_array_ref (source);
3140
3141   t = gfc_array_ref_shape (ar, shape);
3142
3143   for (n = 0; n < source->rank; n++)
3144     {
3145       e = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3146                                &source->where);
3147
3148       if (t == SUCCESS)
3149         {
3150           mpz_set (e->value.integer, shape[n]);
3151           mpz_clear (shape[n]);
3152         }
3153       else
3154         {
3155           mpz_set_ui (e->value.integer, n + 1);
3156
3157           f = gfc_simplify_size (source, e);
3158           gfc_free_expr (e);
3159           if (f == NULL)
3160             {
3161               gfc_free_expr (result);
3162               return NULL;
3163             }
3164           else
3165             {
3166               e = f;
3167             }
3168         }
3169
3170       gfc_append_constructor (result, e);
3171     }
3172
3173   return result;
3174 }
3175
3176
3177 gfc_expr *
3178 gfc_simplify_size (gfc_expr * array, gfc_expr * dim)
3179 {
3180   mpz_t size;
3181   gfc_expr *result;
3182   int d;
3183
3184   if (dim == NULL)
3185     {
3186       if (gfc_array_size (array, &size) == FAILURE)
3187         return NULL;
3188     }
3189   else
3190     {
3191       if (dim->expr_type != EXPR_CONSTANT)
3192         return NULL;
3193
3194       d = mpz_get_ui (dim->value.integer) - 1;
3195       if (gfc_array_dimen_size (array, d, &size) == FAILURE)
3196         return NULL;
3197     }
3198
3199   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3200                                 &array->where);
3201
3202   mpz_set (result->value.integer, size);
3203
3204   return result;
3205 }
3206
3207
3208 gfc_expr *
3209 gfc_simplify_sign (gfc_expr * x, gfc_expr * y)
3210 {
3211   gfc_expr *result;
3212
3213   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3214     return NULL;
3215
3216   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3217
3218   switch (x->ts.type)
3219     {
3220     case BT_INTEGER:
3221       mpz_abs (result->value.integer, x->value.integer);
3222       if (mpz_sgn (y->value.integer) < 0)
3223         mpz_neg (result->value.integer, result->value.integer);
3224
3225       break;
3226
3227     case BT_REAL:
3228       /* TODO: Handle -0.0 and +0.0 correctly on machines that support
3229          it.  */
3230       mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3231       if (mpfr_sgn (y->value.real) < 0)
3232         mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
3233
3234       break;
3235
3236     default:
3237       gfc_internal_error ("Bad type in gfc_simplify_sign");
3238     }
3239
3240   return result;
3241 }
3242
3243
3244 gfc_expr *
3245 gfc_simplify_sin (gfc_expr * x)
3246 {
3247   gfc_expr *result;
3248   mpfr_t xp, xq;
3249
3250   if (x->expr_type != EXPR_CONSTANT)
3251     return NULL;
3252
3253   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3254
3255   switch (x->ts.type)
3256     {
3257     case BT_REAL:
3258       mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
3259       break;
3260
3261     case BT_COMPLEX:
3262       gfc_set_model (x->value.real);
3263       mpfr_init (xp);
3264       mpfr_init (xq);
3265
3266       mpfr_sin  (xp, x->value.complex.r, GFC_RND_MODE);
3267       mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
3268       mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
3269
3270       mpfr_cos  (xp, x->value.complex.r, GFC_RND_MODE);
3271       mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
3272       mpfr_mul (result->value.complex.i, xp, xq, GFC_RND_MODE);
3273
3274       mpfr_clear (xp);
3275       mpfr_clear (xq);
3276       break;
3277
3278     default:
3279       gfc_internal_error ("in gfc_simplify_sin(): Bad type");
3280     }
3281
3282   return range_check (result, "SIN");
3283 }
3284
3285
3286 gfc_expr *
3287 gfc_simplify_sinh (gfc_expr * x)
3288 {
3289   gfc_expr *result;
3290
3291   if (x->expr_type != EXPR_CONSTANT)
3292     return NULL;
3293
3294   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3295
3296   mpfr_sinh(result->value.real, x->value.real, GFC_RND_MODE);
3297
3298   return range_check (result, "SINH");
3299 }
3300
3301
3302 /* The argument is always a double precision real that is converted to
3303    single precision.  TODO: Rounding!  */
3304
3305 gfc_expr *
3306 gfc_simplify_sngl (gfc_expr * a)
3307 {
3308   gfc_expr *result;
3309
3310   if (a->expr_type != EXPR_CONSTANT)
3311     return NULL;
3312
3313   result = gfc_real2real (a, gfc_default_real_kind);
3314   return range_check (result, "SNGL");
3315 }
3316
3317
3318 gfc_expr *
3319 gfc_simplify_spacing (gfc_expr * x)
3320 {
3321   gfc_expr *result;
3322   mpfr_t absv, log2;
3323   long diff;
3324   int i, p;
3325
3326   if (x->expr_type != EXPR_CONSTANT)
3327     return NULL;
3328
3329   i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3330
3331   p = gfc_real_kinds[i].digits;
3332
3333   result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3334
3335   gfc_set_model_kind (x->ts.kind);
3336
3337   if (mpfr_sgn (x->value.real) == 0)
3338     {
3339       mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3340       return result;
3341     }
3342
3343   mpfr_init (log2);
3344   mpfr_init (absv);
3345
3346   mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3347   mpfr_log2 (log2, absv, GFC_RND_MODE);
3348   mpfr_trunc (log2, log2);
3349
3350   mpfr_add_ui (log2, log2, 1, GFC_RND_MODE);
3351
3352   /* FIXME: We should be using mpfr_get_si here, but this function is
3353      not available with the version of mpfr distributed with gmp (as of
3354      2004-09-17). Replace once mpfr has been imported into the gcc cvs
3355      tree.  */
3356   diff = (long)mpfr_get_d (log2, GFC_RND_MODE) - (long)p;
3357   mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
3358   mpfr_mul_2si (result->value.real, result->value.real, diff, GFC_RND_MODE);
3359
3360   mpfr_clear (log2);
3361   mpfr_clear (absv);
3362
3363   if (mpfr_cmp (result->value.real, gfc_real_kinds[i].tiny) < 0)
3364     mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3365
3366   return range_check (result, "SPACING");
3367 }
3368
3369
3370 gfc_expr *
3371 gfc_simplify_sqrt (gfc_expr * e)
3372 {
3373   gfc_expr *result;
3374   mpfr_t ac, ad, s, t, w;
3375
3376   if (e->expr_type != EXPR_CONSTANT)
3377     return NULL;
3378
3379   result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
3380
3381   switch (e->ts.type)
3382     {
3383     case BT_REAL:
3384       if (mpfr_cmp_si (e->value.real, 0) < 0)
3385         goto negative_arg;
3386       mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
3387
3388       break;
3389
3390     case BT_COMPLEX:
3391       /* Formula taken from Numerical Recipes to avoid over- and
3392          underflow.  */
3393
3394       gfc_set_model (e->value.real);
3395       mpfr_init (ac);
3396       mpfr_init (ad);
3397       mpfr_init (s);
3398       mpfr_init (t);
3399       mpfr_init (w);
3400
3401       if (mpfr_cmp_ui (e->value.complex.r, 0) == 0
3402           && mpfr_cmp_ui (e->value.complex.i, 0) == 0)
3403         {
3404
3405           mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
3406           mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
3407           break;
3408         }
3409
3410       mpfr_abs (ac, e->value.complex.r, GFC_RND_MODE);
3411       mpfr_abs (ad, e->value.complex.i, GFC_RND_MODE);
3412
3413       if (mpfr_cmp (ac, ad) >= 0)
3414         {
3415           mpfr_div (t, e->value.complex.i, e->value.complex.r, GFC_RND_MODE);
3416           mpfr_mul (t, t, t, GFC_RND_MODE);
3417           mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3418           mpfr_sqrt (t, t, GFC_RND_MODE);
3419           mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3420           mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3421           mpfr_sqrt (t, t, GFC_RND_MODE);
3422           mpfr_sqrt (s, ac, GFC_RND_MODE);
3423           mpfr_mul (w, s, t, GFC_RND_MODE);
3424         }
3425       else
3426         {
3427           mpfr_div (s, e->value.complex.r, e->value.complex.i, GFC_RND_MODE);
3428           mpfr_mul (t, s, s, GFC_RND_MODE);
3429           mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3430           mpfr_sqrt (t, t, GFC_RND_MODE);
3431           mpfr_abs (s, s, GFC_RND_MODE);
3432           mpfr_add (t, t, s, GFC_RND_MODE);
3433           mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3434           mpfr_sqrt (t, t, GFC_RND_MODE);
3435           mpfr_sqrt (s, ad, GFC_RND_MODE);
3436           mpfr_mul (w, s, t, GFC_RND_MODE);
3437         }
3438
3439       if (mpfr_cmp_ui (w, 0) != 0 && mpfr_cmp_ui (e->value.complex.r, 0) >= 0)
3440         {
3441           mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3442           mpfr_div (result->value.complex.i, e->value.complex.i, t, GFC_RND_MODE);
3443           mpfr_set (result->value.complex.r, w, GFC_RND_MODE);
3444         }
3445       else if (mpfr_cmp_ui (w, 0) != 0
3446                && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3447                && mpfr_cmp_ui (e->value.complex.i, 0) >= 0)
3448         {
3449           mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3450           mpfr_div (result->value.complex.r, e->value.complex.i, t, GFC_RND_MODE);
3451           mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3452         }
3453       else if (mpfr_cmp_ui (w, 0) != 0
3454                && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3455                && mpfr_cmp_ui (e->value.complex.i, 0) < 0)
3456         {
3457           mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3458           mpfr_div (result->value.complex.r, ad, t, GFC_RND_MODE);
3459           mpfr_neg (w, w, GFC_RND_MODE);
3460           mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3461         }
3462       else
3463         gfc_internal_error ("invalid complex argument of SQRT at %L",
3464                             &e->where);
3465
3466       mpfr_clear (s);
3467       mpfr_clear (t);
3468       mpfr_clear (ac);
3469       mpfr_clear (ad);
3470       mpfr_clear (w);
3471
3472       break;
3473
3474     default:
3475       gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
3476     }
3477
3478   return range_check (result, "SQRT");
3479
3480 negative_arg:
3481   gfc_free_expr (result);
3482   gfc_error ("Argument of SQRT at %L has a negative value", &e->where);
3483   return &gfc_bad_expr;
3484 }
3485
3486
3487 gfc_expr *
3488 gfc_simplify_tan (gfc_expr * x)
3489 {
3490   int i;
3491   gfc_expr *result;
3492
3493   if (x->expr_type != EXPR_CONSTANT)
3494     return NULL;
3495
3496   i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3497
3498   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3499
3500   mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
3501
3502   return range_check (result, "TAN");
3503 }
3504
3505
3506 gfc_expr *
3507 gfc_simplify_tanh (gfc_expr * x)
3508 {
3509   gfc_expr *result;
3510
3511   if (x->expr_type != EXPR_CONSTANT)
3512     return NULL;
3513
3514   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3515
3516   mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
3517
3518   return range_check (result, "TANH");
3519
3520 }
3521
3522
3523 gfc_expr *
3524 gfc_simplify_tiny (gfc_expr * e)
3525 {
3526   gfc_expr *result;
3527   int i;
3528
3529   i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
3530
3531   result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
3532   mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3533
3534   return result;
3535 }
3536
3537
3538 gfc_expr *
3539 gfc_simplify_trim (gfc_expr * e)
3540 {
3541   gfc_expr *result;
3542   int count, i, len, lentrim;
3543
3544   if (e->expr_type != EXPR_CONSTANT)
3545     return NULL;
3546
3547   len = e->value.character.length;
3548
3549   result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3550
3551   for (count = 0, i = 1; i <= len; ++i)
3552     {
3553       if (e->value.character.string[len - i] == ' ')
3554         count++;
3555       else
3556         break;
3557     }
3558
3559   lentrim = len - count;
3560
3561   result->value.character.length = lentrim;
3562   result->value.character.string = gfc_getmem (lentrim + 1);
3563
3564   for (i = 0; i < lentrim; i++)
3565     result->value.character.string[i] = e->value.character.string[i];
3566
3567   result->value.character.string[lentrim] = '\0';       /* For debugger */
3568
3569   return result;
3570 }
3571
3572
3573 gfc_expr *
3574 gfc_simplify_ubound (gfc_expr * array, gfc_expr * dim)
3575 {
3576   return simplify_bound (array, dim, 1);
3577 }
3578
3579
3580 gfc_expr *
3581 gfc_simplify_verify (gfc_expr * s, gfc_expr * set, gfc_expr * b)
3582 {
3583   gfc_expr *result;
3584   int back;
3585   size_t index, len, lenset;
3586   size_t i;
3587
3588   if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
3589     return NULL;
3590
3591   if (b != NULL && b->value.logical != 0)
3592     back = 1;
3593   else
3594     back = 0;
3595
3596   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3597                                 &s->where);
3598
3599   len = s->value.character.length;
3600   lenset = set->value.character.length;
3601
3602   if (len == 0)
3603     {
3604       mpz_set_ui (result->value.integer, 0);
3605       return result;
3606     }
3607
3608   if (back == 0)
3609     {
3610       if (lenset == 0)
3611         {
3612           mpz_set_ui (result->value.integer, len);
3613           return result;
3614         }
3615
3616       index =
3617         strspn (s->value.character.string, set->value.character.string) + 1;
3618       if (index > len)
3619         index = 0;
3620
3621     }
3622   else
3623     {
3624       if (lenset == 0)
3625         {
3626           mpz_set_ui (result->value.integer, 1);
3627           return result;
3628         }
3629       for (index = len; index > 0; index --)
3630         {
3631           for (i = 0; i < lenset; i++)
3632             {
3633               if (s->value.character.string[index - 1]
3634                     == set->value.character.string[i])
3635                 break;
3636             }
3637           if (i == lenset)
3638             break;
3639         }
3640     }
3641
3642   mpz_set_ui (result->value.integer, index);
3643   return result;
3644 }
3645
3646 /****************** Constant simplification *****************/
3647
3648 /* Master function to convert one constant to another.  While this is
3649    used as a simplification function, it requires the destination type
3650    and kind information which is supplied by a special case in
3651    do_simplify().  */
3652
3653 gfc_expr *
3654 gfc_convert_constant (gfc_expr * e, bt type, int kind)
3655 {
3656   gfc_expr *g, *result, *(*f) (gfc_expr *, int);
3657   gfc_constructor *head, *c, *tail = NULL;
3658
3659   switch (e->ts.type)
3660     {
3661     case BT_INTEGER:
3662       switch (type)
3663         {
3664         case BT_INTEGER:
3665           f = gfc_int2int;
3666           break;
3667         case BT_REAL:
3668           f = gfc_int2real;
3669           break;
3670         case BT_COMPLEX:
3671           f = gfc_int2complex;
3672           break;
3673         default:
3674           goto oops;
3675         }
3676       break;
3677
3678     case BT_REAL:
3679       switch (type)
3680         {
3681         case BT_INTEGER:
3682           f = gfc_real2int;
3683           break;
3684         case BT_REAL:
3685           f = gfc_real2real;
3686           break;
3687         case BT_COMPLEX:
3688           f = gfc_real2complex;
3689           break;
3690         default:
3691           goto oops;
3692         }
3693       break;
3694
3695     case BT_COMPLEX:
3696       switch (type)
3697         {
3698         case BT_INTEGER:
3699           f = gfc_complex2int;
3700           break;
3701         case BT_REAL:
3702           f = gfc_complex2real;
3703           break;
3704         case BT_COMPLEX:
3705           f = gfc_complex2complex;
3706           break;
3707
3708         default:
3709           goto oops;
3710         }
3711       break;
3712
3713     case BT_LOGICAL:
3714       if (type != BT_LOGICAL)
3715         goto oops;
3716       f = gfc_log2log;
3717       break;
3718
3719     default:
3720     oops:
3721       gfc_internal_error ("gfc_convert_constant(): Unexpected type");
3722     }
3723
3724   result = NULL;
3725
3726   switch (e->expr_type)
3727     {
3728     case EXPR_CONSTANT:
3729       result = f (e, kind);
3730       if (result == NULL)
3731         return &gfc_bad_expr;
3732       break;
3733
3734     case EXPR_ARRAY:
3735       if (!gfc_is_constant_expr (e))
3736         break;
3737
3738       head = NULL;
3739
3740       for (c = e->value.constructor; c; c = c->next)
3741         {
3742           if (head == NULL)
3743             head = tail = gfc_get_constructor ();
3744           else
3745             {
3746               tail->next = gfc_get_constructor ();
3747               tail = tail->next;
3748             }
3749
3750           tail->where = c->where;
3751
3752           if (c->iterator == NULL)
3753             tail->expr = f (c->expr, kind);
3754           else
3755             {
3756               g = gfc_convert_constant (c->expr, type, kind);
3757               if (g == &gfc_bad_expr)
3758                 return g;
3759               tail->expr = g;
3760             }
3761
3762           if (tail->expr == NULL)
3763             {
3764               gfc_free_constructor (head);
3765               return NULL;
3766             }
3767         }
3768
3769       result = gfc_get_expr ();
3770       result->ts.type = type;
3771       result->ts.kind = kind;
3772       result->expr_type = EXPR_ARRAY;
3773       result->value.constructor = head;
3774       result->shape = gfc_copy_shape (e->shape, e->rank);
3775       result->where = e->where;
3776       result->rank = e->rank;
3777       break;
3778
3779     default:
3780       break;
3781     }
3782
3783   return result;
3784 }
3785
3786
3787 /****************** Helper functions ***********************/
3788
3789 /* Given a collating table, create the inverse table.  */
3790
3791 static void
3792 invert_table (const int *table, int *xtable)
3793 {
3794   int i;
3795
3796   for (i = 0; i < 256; i++)
3797     xtable[i] = 0;
3798
3799   for (i = 0; i < 256; i++)
3800     xtable[table[i]] = i;
3801 }
3802
3803
3804 void
3805 gfc_simplify_init_1 (void)
3806 {
3807
3808   invert_table (ascii_table, xascii_table);
3809 }