OSDN Git Service

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