Home | History | Annotate | Line # | Download | only in fortran
      1  1.1  mrg /* Simplify intrinsic functions at compile-time.
      2  1.1  mrg    Copyright (C) 2000-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Andy Vaught & Katherine Holcomb
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      8  1.1  mrg the terms of the GNU General Public License as published by the Free
      9  1.1  mrg Software Foundation; either version 3, or (at your option) any later
     10  1.1  mrg version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15  1.1  mrg for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg #include "config.h"
     22  1.1  mrg #include "system.h"
     23  1.1  mrg #include "coretypes.h"
     24  1.1  mrg #include "tm.h"		/* For BITS_PER_UNIT.  */
     25  1.1  mrg #include "gfortran.h"
     26  1.1  mrg #include "arith.h"
     27  1.1  mrg #include "intrinsic.h"
     28  1.1  mrg #include "match.h"
     29  1.1  mrg #include "target-memory.h"
     30  1.1  mrg #include "constructor.h"
     31  1.1  mrg #include "version.h"	/* For version_string.  */
     32  1.1  mrg 
     33  1.1  mrg /* Prototypes.  */
     34  1.1  mrg 
     35  1.1  mrg static int min_max_choose (gfc_expr *, gfc_expr *, int, bool back_val = false);
     36  1.1  mrg 
     37  1.1  mrg gfc_expr gfc_bad_expr;
     38  1.1  mrg 
     39  1.1  mrg static gfc_expr *simplify_size (gfc_expr *, gfc_expr *, int);
     40  1.1  mrg 
     41  1.1  mrg 
     42  1.1  mrg /* Note that 'simplification' is not just transforming expressions.
     43  1.1  mrg    For functions that are not simplified at compile time, range
     44  1.1  mrg    checking is done if possible.
     45  1.1  mrg 
     46  1.1  mrg    The return convention is that each simplification function returns:
     47  1.1  mrg 
     48  1.1  mrg      A new expression node corresponding to the simplified arguments.
     49  1.1  mrg      The original arguments are destroyed by the caller, and must not
     50  1.1  mrg      be a part of the new expression.
     51  1.1  mrg 
     52  1.1  mrg      NULL pointer indicating that no simplification was possible and
     53  1.1  mrg      the original expression should remain intact.
     54  1.1  mrg 
     55  1.1  mrg      An expression pointer to gfc_bad_expr (a static placeholder)
     56  1.1  mrg      indicating that some error has prevented simplification.  The
     57  1.1  mrg      error is generated within the function and should be propagated
     58  1.1  mrg      upwards
     59  1.1  mrg 
     60  1.1  mrg    By the time a simplification function gets control, it has been
     61  1.1  mrg    decided that the function call is really supposed to be the
     62  1.1  mrg    intrinsic.  No type checking is strictly necessary, since only
     63  1.1  mrg    valid types will be passed on.  On the other hand, a simplification
     64  1.1  mrg    subroutine may have to look at the type of an argument as part of
     65  1.1  mrg    its processing.
     66  1.1  mrg 
     67  1.1  mrg    Array arguments are only passed to these subroutines that implement
     68  1.1  mrg    the simplification of transformational intrinsics.
     69  1.1  mrg 
     70  1.1  mrg    The functions in this file don't have much comment with them, but
     71  1.1  mrg    everything is reasonably straight-forward.  The Standard, chapter 13
     72  1.1  mrg    is the best comment you'll find for this file anyway.  */
     73  1.1  mrg 
     74  1.1  mrg /* Range checks an expression node.  If all goes well, returns the
     75  1.1  mrg    node, otherwise returns &gfc_bad_expr and frees the node.  */
     76  1.1  mrg 
     77  1.1  mrg static gfc_expr *
     78  1.1  mrg range_check (gfc_expr *result, const char *name)
     79  1.1  mrg {
     80  1.1  mrg   if (result == NULL)
     81  1.1  mrg     return &gfc_bad_expr;
     82  1.1  mrg 
     83  1.1  mrg   if (result->expr_type != EXPR_CONSTANT)
     84  1.1  mrg     return result;
     85  1.1  mrg 
     86  1.1  mrg   switch (gfc_range_check (result))
     87  1.1  mrg     {
     88  1.1  mrg       case ARITH_OK:
     89  1.1  mrg 	return result;
     90  1.1  mrg 
     91  1.1  mrg       case ARITH_OVERFLOW:
     92  1.1  mrg 	gfc_error ("Result of %s overflows its kind at %L", name,
     93  1.1  mrg 		   &result->where);
     94  1.1  mrg 	break;
     95  1.1  mrg 
     96  1.1  mrg       case ARITH_UNDERFLOW:
     97  1.1  mrg 	gfc_error ("Result of %s underflows its kind at %L", name,
     98  1.1  mrg 		   &result->where);
     99  1.1  mrg 	break;
    100  1.1  mrg 
    101  1.1  mrg       case ARITH_NAN:
    102  1.1  mrg 	gfc_error ("Result of %s is NaN at %L", name, &result->where);
    103  1.1  mrg 	break;
    104  1.1  mrg 
    105  1.1  mrg       default:
    106  1.1  mrg 	gfc_error ("Result of %s gives range error for its kind at %L", name,
    107  1.1  mrg 		   &result->where);
    108  1.1  mrg 	break;
    109  1.1  mrg     }
    110  1.1  mrg 
    111  1.1  mrg   gfc_free_expr (result);
    112  1.1  mrg   return &gfc_bad_expr;
    113  1.1  mrg }
    114  1.1  mrg 
    115  1.1  mrg 
    116  1.1  mrg /* A helper function that gets an optional and possibly missing
    117  1.1  mrg    kind parameter.  Returns the kind, -1 if something went wrong.  */
    118  1.1  mrg 
    119  1.1  mrg static int
    120  1.1  mrg get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
    121  1.1  mrg {
    122  1.1  mrg   int kind;
    123  1.1  mrg 
    124  1.1  mrg   if (k == NULL)
    125  1.1  mrg     return default_kind;
    126  1.1  mrg 
    127  1.1  mrg   if (k->expr_type != EXPR_CONSTANT)
    128  1.1  mrg     {
    129  1.1  mrg       gfc_error ("KIND parameter of %s at %L must be an initialization "
    130  1.1  mrg 		 "expression", name, &k->where);
    131  1.1  mrg       return -1;
    132  1.1  mrg     }
    133  1.1  mrg 
    134  1.1  mrg   if (gfc_extract_int (k, &kind)
    135  1.1  mrg       || gfc_validate_kind (type, kind, true) < 0)
    136  1.1  mrg     {
    137  1.1  mrg       gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
    138  1.1  mrg       return -1;
    139  1.1  mrg     }
    140  1.1  mrg 
    141  1.1  mrg   return kind;
    142  1.1  mrg }
    143  1.1  mrg 
    144  1.1  mrg 
    145  1.1  mrg /* Converts an mpz_t signed variable into an unsigned one, assuming
    146  1.1  mrg    two's complement representations and a binary width of bitsize.
    147  1.1  mrg    The conversion is a no-op unless x is negative; otherwise, it can
    148  1.1  mrg    be accomplished by masking out the high bits.  */
    149  1.1  mrg 
    150  1.1  mrg static void
    151  1.1  mrg convert_mpz_to_unsigned (mpz_t x, int bitsize)
    152  1.1  mrg {
    153  1.1  mrg   mpz_t mask;
    154  1.1  mrg 
    155  1.1  mrg   if (mpz_sgn (x) < 0)
    156  1.1  mrg     {
    157  1.1  mrg       /* Confirm that no bits above the signed range are unset if we
    158  1.1  mrg 	 are doing range checking.  */
    159  1.1  mrg       if (flag_range_check != 0)
    160  1.1  mrg 	gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
    161  1.1  mrg 
    162  1.1  mrg       mpz_init_set_ui (mask, 1);
    163  1.1  mrg       mpz_mul_2exp (mask, mask, bitsize);
    164  1.1  mrg       mpz_sub_ui (mask, mask, 1);
    165  1.1  mrg 
    166  1.1  mrg       mpz_and (x, x, mask);
    167  1.1  mrg 
    168  1.1  mrg       mpz_clear (mask);
    169  1.1  mrg     }
    170  1.1  mrg   else
    171  1.1  mrg     {
    172  1.1  mrg       /* Confirm that no bits above the signed range are set if we
    173  1.1  mrg 	 are doing range checking.  */
    174  1.1  mrg       if (flag_range_check != 0)
    175  1.1  mrg 	gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
    176  1.1  mrg     }
    177  1.1  mrg }
    178  1.1  mrg 
    179  1.1  mrg 
    180  1.1  mrg /* Converts an mpz_t unsigned variable into a signed one, assuming
    181  1.1  mrg    two's complement representations and a binary width of bitsize.
    182  1.1  mrg    If the bitsize-1 bit is set, this is taken as a sign bit and
    183  1.1  mrg    the number is converted to the corresponding negative number.  */
    184  1.1  mrg 
    185  1.1  mrg void
    186  1.1  mrg gfc_convert_mpz_to_signed (mpz_t x, int bitsize)
    187  1.1  mrg {
    188  1.1  mrg   mpz_t mask;
    189  1.1  mrg 
    190  1.1  mrg   /* Confirm that no bits above the unsigned range are set if we are
    191  1.1  mrg      doing range checking.  */
    192  1.1  mrg   if (flag_range_check != 0)
    193  1.1  mrg     gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
    194  1.1  mrg 
    195  1.1  mrg   if (mpz_tstbit (x, bitsize - 1) == 1)
    196  1.1  mrg     {
    197  1.1  mrg       mpz_init_set_ui (mask, 1);
    198  1.1  mrg       mpz_mul_2exp (mask, mask, bitsize);
    199  1.1  mrg       mpz_sub_ui (mask, mask, 1);
    200  1.1  mrg 
    201  1.1  mrg       /* We negate the number by hand, zeroing the high bits, that is
    202  1.1  mrg 	 make it the corresponding positive number, and then have it
    203  1.1  mrg 	 negated by GMP, giving the correct representation of the
    204  1.1  mrg 	 negative number.  */
    205  1.1  mrg       mpz_com (x, x);
    206  1.1  mrg       mpz_add_ui (x, x, 1);
    207  1.1  mrg       mpz_and (x, x, mask);
    208  1.1  mrg 
    209  1.1  mrg       mpz_neg (x, x);
    210  1.1  mrg 
    211  1.1  mrg       mpz_clear (mask);
    212  1.1  mrg     }
    213  1.1  mrg }
    214  1.1  mrg 
    215  1.1  mrg 
    216  1.1  mrg /* Test that the expression is a constant array, simplifying if
    217  1.1  mrg    we are dealing with a parameter array.  */
    218  1.1  mrg 
    219  1.1  mrg static bool
    220  1.1  mrg is_constant_array_expr (gfc_expr *e)
    221  1.1  mrg {
    222  1.1  mrg   gfc_constructor *c;
    223  1.1  mrg   bool array_OK = true;
    224  1.1  mrg   mpz_t size;
    225  1.1  mrg 
    226  1.1  mrg   if (e == NULL)
    227  1.1  mrg     return true;
    228  1.1  mrg 
    229  1.1  mrg   if (e->expr_type == EXPR_VARIABLE && e->rank > 0
    230  1.1  mrg       && e->symtree->n.sym->attr.flavor == FL_PARAMETER)
    231  1.1  mrg     gfc_simplify_expr (e, 1);
    232  1.1  mrg 
    233  1.1  mrg   if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
    234  1.1  mrg     return false;
    235  1.1  mrg 
    236  1.1  mrg   for (c = gfc_constructor_first (e->value.constructor);
    237  1.1  mrg        c; c = gfc_constructor_next (c))
    238  1.1  mrg     if (c->expr->expr_type != EXPR_CONSTANT
    239  1.1  mrg 	  && c->expr->expr_type != EXPR_STRUCTURE)
    240  1.1  mrg       {
    241  1.1  mrg 	array_OK = false;
    242  1.1  mrg 	break;
    243  1.1  mrg       }
    244  1.1  mrg 
    245  1.1  mrg   /* Check and expand the constructor.  */
    246  1.1  mrg   if (!array_OK && gfc_init_expr_flag && e->rank == 1)
    247  1.1  mrg     {
    248  1.1  mrg       array_OK = gfc_reduce_init_expr (e);
    249  1.1  mrg       /* gfc_reduce_init_expr resets the flag.  */
    250  1.1  mrg       gfc_init_expr_flag = true;
    251  1.1  mrg     }
    252  1.1  mrg   else
    253  1.1  mrg     return array_OK;
    254  1.1  mrg 
    255  1.1  mrg   /* Recheck to make sure that any EXPR_ARRAYs have gone.  */
    256  1.1  mrg   for (c = gfc_constructor_first (e->value.constructor);
    257  1.1  mrg        c; c = gfc_constructor_next (c))
    258  1.1  mrg     if (c->expr->expr_type != EXPR_CONSTANT
    259  1.1  mrg 	  && c->expr->expr_type != EXPR_STRUCTURE)
    260  1.1  mrg       return false;
    261  1.1  mrg 
    262  1.1  mrg   /* Make sure that the array has a valid shape.  */
    263  1.1  mrg   if (e->shape == NULL && e->rank == 1)
    264  1.1  mrg     {
    265  1.1  mrg       if (!gfc_array_size(e, &size))
    266  1.1  mrg 	return false;
    267  1.1  mrg       e->shape = gfc_get_shape (1);
    268  1.1  mrg       mpz_init_set (e->shape[0], size);
    269  1.1  mrg       mpz_clear (size);
    270  1.1  mrg     }
    271  1.1  mrg 
    272  1.1  mrg   return array_OK;
    273  1.1  mrg }
    274  1.1  mrg 
    275  1.1  mrg /* Test for a size zero array.  */
    276  1.1  mrg bool
    277  1.1  mrg gfc_is_size_zero_array (gfc_expr *array)
    278  1.1  mrg {
    279  1.1  mrg 
    280  1.1  mrg   if (array->rank == 0)
    281  1.1  mrg     return false;
    282  1.1  mrg 
    283  1.1  mrg   if (array->expr_type == EXPR_VARIABLE && array->rank > 0
    284  1.1  mrg       && array->symtree->n.sym->attr.flavor == FL_PARAMETER
    285  1.1  mrg       && array->shape != NULL)
    286  1.1  mrg     {
    287  1.1  mrg       for (int i = 0; i < array->rank; i++)
    288  1.1  mrg 	if (mpz_cmp_si (array->shape[i], 0) <= 0)
    289  1.1  mrg 	  return true;
    290  1.1  mrg 
    291  1.1  mrg       return false;
    292  1.1  mrg     }
    293  1.1  mrg 
    294  1.1  mrg   if (array->expr_type == EXPR_ARRAY)
    295  1.1  mrg     return array->value.constructor == NULL;
    296  1.1  mrg 
    297  1.1  mrg   return false;
    298  1.1  mrg }
    299  1.1  mrg 
    300  1.1  mrg 
    301  1.1  mrg /* Initialize a transformational result expression with a given value.  */
    302  1.1  mrg 
    303  1.1  mrg static void
    304  1.1  mrg init_result_expr (gfc_expr *e, int init, gfc_expr *array)
    305  1.1  mrg {
    306  1.1  mrg   if (e && e->expr_type == EXPR_ARRAY)
    307  1.1  mrg     {
    308  1.1  mrg       gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
    309  1.1  mrg       while (ctor)
    310  1.1  mrg 	{
    311  1.1  mrg 	  init_result_expr (ctor->expr, init, array);
    312  1.1  mrg 	  ctor = gfc_constructor_next (ctor);
    313  1.1  mrg 	}
    314  1.1  mrg     }
    315  1.1  mrg   else if (e && e->expr_type == EXPR_CONSTANT)
    316  1.1  mrg     {
    317  1.1  mrg       int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
    318  1.1  mrg       HOST_WIDE_INT length;
    319  1.1  mrg       gfc_char_t *string;
    320  1.1  mrg 
    321  1.1  mrg       switch (e->ts.type)
    322  1.1  mrg 	{
    323  1.1  mrg 	  case BT_LOGICAL:
    324  1.1  mrg 	    e->value.logical = (init ? 1 : 0);
    325  1.1  mrg 	    break;
    326  1.1  mrg 
    327  1.1  mrg 	  case BT_INTEGER:
    328  1.1  mrg 	    if (init == INT_MIN)
    329  1.1  mrg 	      mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
    330  1.1  mrg 	    else if (init == INT_MAX)
    331  1.1  mrg 	      mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
    332  1.1  mrg 	    else
    333  1.1  mrg 	      mpz_set_si (e->value.integer, init);
    334  1.1  mrg 	    break;
    335  1.1  mrg 
    336  1.1  mrg 	  case BT_REAL:
    337  1.1  mrg 	    if (init == INT_MIN)
    338  1.1  mrg 	      {
    339  1.1  mrg 		mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
    340  1.1  mrg 		mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
    341  1.1  mrg 	      }
    342  1.1  mrg 	    else if (init == INT_MAX)
    343  1.1  mrg 	      mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
    344  1.1  mrg 	    else
    345  1.1  mrg 	      mpfr_set_si (e->value.real, init, GFC_RND_MODE);
    346  1.1  mrg 	    break;
    347  1.1  mrg 
    348  1.1  mrg 	  case BT_COMPLEX:
    349  1.1  mrg 	    mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
    350  1.1  mrg 	    break;
    351  1.1  mrg 
    352  1.1  mrg 	  case BT_CHARACTER:
    353  1.1  mrg 	    if (init == INT_MIN)
    354  1.1  mrg 	      {
    355  1.1  mrg 		gfc_expr *len = gfc_simplify_len (array, NULL);
    356  1.1  mrg 		gfc_extract_hwi (len, &length);
    357  1.1  mrg 		string = gfc_get_wide_string (length + 1);
    358  1.1  mrg 		gfc_wide_memset (string, 0, length);
    359  1.1  mrg 	      }
    360  1.1  mrg 	    else if (init == INT_MAX)
    361  1.1  mrg 	      {
    362  1.1  mrg 		gfc_expr *len = gfc_simplify_len (array, NULL);
    363  1.1  mrg 		gfc_extract_hwi (len, &length);
    364  1.1  mrg 		string = gfc_get_wide_string (length + 1);
    365  1.1  mrg 		gfc_wide_memset (string, 255, length);
    366  1.1  mrg 	      }
    367  1.1  mrg 	    else
    368  1.1  mrg 	      {
    369  1.1  mrg 		length = 0;
    370  1.1  mrg 		string = gfc_get_wide_string (1);
    371  1.1  mrg 	      }
    372  1.1  mrg 
    373  1.1  mrg 	    string[length] = '\0';
    374  1.1  mrg 	    e->value.character.length = length;
    375  1.1  mrg 	    e->value.character.string = string;
    376  1.1  mrg 	    break;
    377  1.1  mrg 
    378  1.1  mrg 	  default:
    379  1.1  mrg 	    gcc_unreachable();
    380  1.1  mrg 	}
    381  1.1  mrg     }
    382  1.1  mrg   else
    383  1.1  mrg     gcc_unreachable();
    384  1.1  mrg }
    385  1.1  mrg 
    386  1.1  mrg 
    387  1.1  mrg /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
    388  1.1  mrg    if conj_a is true, the matrix_a is complex conjugated.  */
    389  1.1  mrg 
    390  1.1  mrg static gfc_expr *
    391  1.1  mrg compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
    392  1.1  mrg 		     gfc_expr *matrix_b, int stride_b, int offset_b,
    393  1.1  mrg 		     bool conj_a)
    394  1.1  mrg {
    395  1.1  mrg   gfc_expr *result, *a, *b, *c;
    396  1.1  mrg 
    397  1.1  mrg   /* Set result to an INTEGER(1) 0 for numeric types and .false. for
    398  1.1  mrg      LOGICAL.  Mixed-mode math in the loop will promote result to the
    399  1.1  mrg      correct type and kind.  */
    400  1.1  mrg   if (matrix_a->ts.type == BT_LOGICAL)
    401  1.1  mrg     result = gfc_get_logical_expr (gfc_default_logical_kind, NULL, false);
    402  1.1  mrg   else
    403  1.1  mrg     result = gfc_get_int_expr (1, NULL, 0);
    404  1.1  mrg   result->where = matrix_a->where;
    405  1.1  mrg 
    406  1.1  mrg   a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
    407  1.1  mrg   b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
    408  1.1  mrg   while (a && b)
    409  1.1  mrg     {
    410  1.1  mrg       /* Copying of expressions is required as operands are free'd
    411  1.1  mrg 	 by the gfc_arith routines.  */
    412  1.1  mrg       switch (result->ts.type)
    413  1.1  mrg 	{
    414  1.1  mrg 	  case BT_LOGICAL:
    415  1.1  mrg 	    result = gfc_or (result,
    416  1.1  mrg 			     gfc_and (gfc_copy_expr (a),
    417  1.1  mrg 				      gfc_copy_expr (b)));
    418  1.1  mrg 	    break;
    419  1.1  mrg 
    420  1.1  mrg 	  case BT_INTEGER:
    421  1.1  mrg 	  case BT_REAL:
    422  1.1  mrg 	  case BT_COMPLEX:
    423  1.1  mrg 	    if (conj_a && a->ts.type == BT_COMPLEX)
    424  1.1  mrg 	      c = gfc_simplify_conjg (a);
    425  1.1  mrg 	    else
    426  1.1  mrg 	      c = gfc_copy_expr (a);
    427  1.1  mrg 	    result = gfc_add (result, gfc_multiply (c, gfc_copy_expr (b)));
    428  1.1  mrg 	    break;
    429  1.1  mrg 
    430  1.1  mrg 	  default:
    431  1.1  mrg 	    gcc_unreachable();
    432  1.1  mrg 	}
    433  1.1  mrg 
    434  1.1  mrg       offset_a += stride_a;
    435  1.1  mrg       a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
    436  1.1  mrg 
    437  1.1  mrg       offset_b += stride_b;
    438  1.1  mrg       b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
    439  1.1  mrg     }
    440  1.1  mrg 
    441  1.1  mrg   return result;
    442  1.1  mrg }
    443  1.1  mrg 
    444  1.1  mrg 
    445  1.1  mrg /* Build a result expression for transformational intrinsics,
    446  1.1  mrg    depending on DIM.  */
    447  1.1  mrg 
    448  1.1  mrg static gfc_expr *
    449  1.1  mrg transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
    450  1.1  mrg 			 int kind, locus* where)
    451  1.1  mrg {
    452  1.1  mrg   gfc_expr *result;
    453  1.1  mrg   int i, nelem;
    454  1.1  mrg 
    455  1.1  mrg   if (!dim || array->rank == 1)
    456  1.1  mrg     return gfc_get_constant_expr (type, kind, where);
    457  1.1  mrg 
    458  1.1  mrg   result = gfc_get_array_expr (type, kind, where);
    459  1.1  mrg   result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
    460  1.1  mrg   result->rank = array->rank - 1;
    461  1.1  mrg 
    462  1.1  mrg   /* gfc_array_size() would count the number of elements in the constructor,
    463  1.1  mrg      we have not built those yet.  */
    464  1.1  mrg   nelem = 1;
    465  1.1  mrg   for  (i = 0; i < result->rank; ++i)
    466  1.1  mrg     nelem *= mpz_get_ui (result->shape[i]);
    467  1.1  mrg 
    468  1.1  mrg   for (i = 0; i < nelem; ++i)
    469  1.1  mrg     {
    470  1.1  mrg       gfc_constructor_append_expr (&result->value.constructor,
    471  1.1  mrg 				   gfc_get_constant_expr (type, kind, where),
    472  1.1  mrg 				   NULL);
    473  1.1  mrg     }
    474  1.1  mrg 
    475  1.1  mrg   return result;
    476  1.1  mrg }
    477  1.1  mrg 
    478  1.1  mrg 
    479  1.1  mrg typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
    480  1.1  mrg 
    481  1.1  mrg /* Wrapper function, implements 'op1 += 1'. Only called if MASK
    482  1.1  mrg    of COUNT intrinsic is .TRUE..
    483  1.1  mrg 
    484  1.1  mrg    Interface and implementation mimics arith functions as
    485  1.1  mrg    gfc_add, gfc_multiply, etc.  */
    486  1.1  mrg 
    487  1.1  mrg static gfc_expr *
    488  1.1  mrg gfc_count (gfc_expr *op1, gfc_expr *op2)
    489  1.1  mrg {
    490  1.1  mrg   gfc_expr *result;
    491  1.1  mrg 
    492  1.1  mrg   gcc_assert (op1->ts.type == BT_INTEGER);
    493  1.1  mrg   gcc_assert (op2->ts.type == BT_LOGICAL);
    494  1.1  mrg   gcc_assert (op2->value.logical);
    495  1.1  mrg 
    496  1.1  mrg   result = gfc_copy_expr (op1);
    497  1.1  mrg   mpz_add_ui (result->value.integer, result->value.integer, 1);
    498  1.1  mrg 
    499  1.1  mrg   gfc_free_expr (op1);
    500  1.1  mrg   gfc_free_expr (op2);
    501  1.1  mrg   return result;
    502  1.1  mrg }
    503  1.1  mrg 
    504  1.1  mrg 
    505  1.1  mrg /* Transforms an ARRAY with operation OP, according to MASK, to a
    506  1.1  mrg    scalar RESULT. E.g. called if
    507  1.1  mrg 
    508  1.1  mrg      REAL, PARAMETER :: array(n, m) = ...
    509  1.1  mrg      REAL, PARAMETER :: s = SUM(array)
    510  1.1  mrg 
    511  1.1  mrg   where OP == gfc_add().  */
    512  1.1  mrg 
    513  1.1  mrg static gfc_expr *
    514  1.1  mrg simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
    515  1.1  mrg 				   transformational_op op)
    516  1.1  mrg {
    517  1.1  mrg   gfc_expr *a, *m;
    518  1.1  mrg   gfc_constructor *array_ctor, *mask_ctor;
    519  1.1  mrg 
    520  1.1  mrg   /* Shortcut for constant .FALSE. MASK.  */
    521  1.1  mrg   if (mask
    522  1.1  mrg       && mask->expr_type == EXPR_CONSTANT
    523  1.1  mrg       && !mask->value.logical)
    524  1.1  mrg     return result;
    525  1.1  mrg 
    526  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
    527  1.1  mrg   mask_ctor = NULL;
    528  1.1  mrg   if (mask && mask->expr_type == EXPR_ARRAY)
    529  1.1  mrg     mask_ctor = gfc_constructor_first (mask->value.constructor);
    530  1.1  mrg 
    531  1.1  mrg   while (array_ctor)
    532  1.1  mrg     {
    533  1.1  mrg       a = array_ctor->expr;
    534  1.1  mrg       array_ctor = gfc_constructor_next (array_ctor);
    535  1.1  mrg 
    536  1.1  mrg       /* A constant MASK equals .TRUE. here and can be ignored.  */
    537  1.1  mrg       if (mask_ctor)
    538  1.1  mrg 	{
    539  1.1  mrg 	  m = mask_ctor->expr;
    540  1.1  mrg 	  mask_ctor = gfc_constructor_next (mask_ctor);
    541  1.1  mrg 	  if (!m->value.logical)
    542  1.1  mrg 	    continue;
    543  1.1  mrg 	}
    544  1.1  mrg 
    545  1.1  mrg       result = op (result, gfc_copy_expr (a));
    546  1.1  mrg       if (!result)
    547  1.1  mrg 	return result;
    548  1.1  mrg     }
    549  1.1  mrg 
    550  1.1  mrg   return result;
    551  1.1  mrg }
    552  1.1  mrg 
    553  1.1  mrg /* Transforms an ARRAY with operation OP, according to MASK, to an
    554  1.1  mrg    array RESULT. E.g. called if
    555  1.1  mrg 
    556  1.1  mrg      REAL, PARAMETER :: array(n, m) = ...
    557  1.1  mrg      REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
    558  1.1  mrg 
    559  1.1  mrg    where OP == gfc_multiply().
    560  1.1  mrg    The result might be post processed using post_op.  */
    561  1.1  mrg 
    562  1.1  mrg static gfc_expr *
    563  1.1  mrg simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
    564  1.1  mrg 				  gfc_expr *mask, transformational_op op,
    565  1.1  mrg 				  transformational_op post_op)
    566  1.1  mrg {
    567  1.1  mrg   mpz_t size;
    568  1.1  mrg   int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
    569  1.1  mrg   gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
    570  1.1  mrg   gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
    571  1.1  mrg 
    572  1.1  mrg   int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
    573  1.1  mrg       sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
    574  1.1  mrg       tmpstride[GFC_MAX_DIMENSIONS];
    575  1.1  mrg 
    576  1.1  mrg   /* Shortcut for constant .FALSE. MASK.  */
    577  1.1  mrg   if (mask
    578  1.1  mrg       && mask->expr_type == EXPR_CONSTANT
    579  1.1  mrg       && !mask->value.logical)
    580  1.1  mrg     return result;
    581  1.1  mrg 
    582  1.1  mrg   /* Build an indexed table for array element expressions to minimize
    583  1.1  mrg      linked-list traversal. Masked elements are set to NULL.  */
    584  1.1  mrg   gfc_array_size (array, &size);
    585  1.1  mrg   arraysize = mpz_get_ui (size);
    586  1.1  mrg   mpz_clear (size);
    587  1.1  mrg 
    588  1.1  mrg   arrayvec = XCNEWVEC (gfc_expr*, arraysize);
    589  1.1  mrg 
    590  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
    591  1.1  mrg   mask_ctor = NULL;
    592  1.1  mrg   if (mask && mask->expr_type == EXPR_ARRAY)
    593  1.1  mrg     mask_ctor = gfc_constructor_first (mask->value.constructor);
    594  1.1  mrg 
    595  1.1  mrg   for (i = 0; i < arraysize; ++i)
    596  1.1  mrg     {
    597  1.1  mrg       arrayvec[i] = array_ctor->expr;
    598  1.1  mrg       array_ctor = gfc_constructor_next (array_ctor);
    599  1.1  mrg 
    600  1.1  mrg       if (mask_ctor)
    601  1.1  mrg 	{
    602  1.1  mrg 	  if (!mask_ctor->expr->value.logical)
    603  1.1  mrg 	    arrayvec[i] = NULL;
    604  1.1  mrg 
    605  1.1  mrg 	  mask_ctor = gfc_constructor_next (mask_ctor);
    606  1.1  mrg 	}
    607  1.1  mrg     }
    608  1.1  mrg 
    609  1.1  mrg   /* Same for the result expression.  */
    610  1.1  mrg   gfc_array_size (result, &size);
    611  1.1  mrg   resultsize = mpz_get_ui (size);
    612  1.1  mrg   mpz_clear (size);
    613  1.1  mrg 
    614  1.1  mrg   resultvec = XCNEWVEC (gfc_expr*, resultsize);
    615  1.1  mrg   result_ctor = gfc_constructor_first (result->value.constructor);
    616  1.1  mrg   for (i = 0; i < resultsize; ++i)
    617  1.1  mrg     {
    618  1.1  mrg       resultvec[i] = result_ctor->expr;
    619  1.1  mrg       result_ctor = gfc_constructor_next (result_ctor);
    620  1.1  mrg     }
    621  1.1  mrg 
    622  1.1  mrg   gfc_extract_int (dim, &dim_index);
    623  1.1  mrg   dim_index -= 1;               /* zero-base index */
    624  1.1  mrg   dim_extent = 0;
    625  1.1  mrg   dim_stride = 0;
    626  1.1  mrg 
    627  1.1  mrg   for (i = 0, n = 0; i < array->rank; ++i)
    628  1.1  mrg     {
    629  1.1  mrg       count[i] = 0;
    630  1.1  mrg       tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
    631  1.1  mrg       if (i == dim_index)
    632  1.1  mrg 	{
    633  1.1  mrg 	  dim_extent = mpz_get_si (array->shape[i]);
    634  1.1  mrg 	  dim_stride = tmpstride[i];
    635  1.1  mrg 	  continue;
    636  1.1  mrg 	}
    637  1.1  mrg 
    638  1.1  mrg       extent[n] = mpz_get_si (array->shape[i]);
    639  1.1  mrg       sstride[n] = tmpstride[i];
    640  1.1  mrg       dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
    641  1.1  mrg       n += 1;
    642  1.1  mrg     }
    643  1.1  mrg 
    644  1.1  mrg   done = resultsize <= 0;
    645  1.1  mrg   base = arrayvec;
    646  1.1  mrg   dest = resultvec;
    647  1.1  mrg   while (!done)
    648  1.1  mrg     {
    649  1.1  mrg       for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
    650  1.1  mrg 	if (*src)
    651  1.1  mrg 	  *dest = op (*dest, gfc_copy_expr (*src));
    652  1.1  mrg 
    653  1.1  mrg       if (post_op)
    654  1.1  mrg 	*dest = post_op (*dest, *dest);
    655  1.1  mrg 
    656  1.1  mrg       count[0]++;
    657  1.1  mrg       base += sstride[0];
    658  1.1  mrg       dest += dstride[0];
    659  1.1  mrg 
    660  1.1  mrg       n = 0;
    661  1.1  mrg       while (!done && count[n] == extent[n])
    662  1.1  mrg 	{
    663  1.1  mrg 	  count[n] = 0;
    664  1.1  mrg 	  base -= sstride[n] * extent[n];
    665  1.1  mrg 	  dest -= dstride[n] * extent[n];
    666  1.1  mrg 
    667  1.1  mrg 	  n++;
    668  1.1  mrg 	  if (n < result->rank)
    669  1.1  mrg 	    {
    670  1.1  mrg 	      /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
    671  1.1  mrg 		 times, we'd warn for the last iteration, because the
    672  1.1  mrg 		 array index will have already been incremented to the
    673  1.1  mrg 		 array sizes, and we can't tell that this must make
    674  1.1  mrg 		 the test against result->rank false, because ranks
    675  1.1  mrg 		 must not exceed GFC_MAX_DIMENSIONS.  */
    676  1.1  mrg 	      GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray-bounds)
    677  1.1  mrg 	      count[n]++;
    678  1.1  mrg 	      base += sstride[n];
    679  1.1  mrg 	      dest += dstride[n];
    680  1.1  mrg 	      GCC_DIAGNOSTIC_POP
    681  1.1  mrg 	    }
    682  1.1  mrg 	  else
    683  1.1  mrg 	    done = true;
    684  1.1  mrg        }
    685  1.1  mrg     }
    686  1.1  mrg 
    687  1.1  mrg   /* Place updated expression in result constructor.  */
    688  1.1  mrg   result_ctor = gfc_constructor_first (result->value.constructor);
    689  1.1  mrg   for (i = 0; i < resultsize; ++i)
    690  1.1  mrg     {
    691  1.1  mrg       result_ctor->expr = resultvec[i];
    692  1.1  mrg       result_ctor = gfc_constructor_next (result_ctor);
    693  1.1  mrg     }
    694  1.1  mrg 
    695  1.1  mrg   free (arrayvec);
    696  1.1  mrg   free (resultvec);
    697  1.1  mrg   return result;
    698  1.1  mrg }
    699  1.1  mrg 
    700  1.1  mrg 
    701  1.1  mrg static gfc_expr *
    702  1.1  mrg simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
    703  1.1  mrg 			 int init_val, transformational_op op)
    704  1.1  mrg {
    705  1.1  mrg   gfc_expr *result;
    706  1.1  mrg   bool size_zero;
    707  1.1  mrg 
    708  1.1  mrg   size_zero = gfc_is_size_zero_array (array);
    709  1.1  mrg 
    710  1.1  mrg   if (!(is_constant_array_expr (array) || size_zero)
    711  1.1  mrg       || array->shape == NULL
    712  1.1  mrg       || !gfc_is_constant_expr (dim))
    713  1.1  mrg     return NULL;
    714  1.1  mrg 
    715  1.1  mrg   if (mask
    716  1.1  mrg       && !is_constant_array_expr (mask)
    717  1.1  mrg       && mask->expr_type != EXPR_CONSTANT)
    718  1.1  mrg     return NULL;
    719  1.1  mrg 
    720  1.1  mrg   result = transformational_result (array, dim, array->ts.type,
    721  1.1  mrg 				    array->ts.kind, &array->where);
    722  1.1  mrg   init_result_expr (result, init_val, array);
    723  1.1  mrg 
    724  1.1  mrg   if (size_zero)
    725  1.1  mrg     return result;
    726  1.1  mrg 
    727  1.1  mrg   return !dim || array->rank == 1 ?
    728  1.1  mrg     simplify_transformation_to_scalar (result, array, mask, op) :
    729  1.1  mrg     simplify_transformation_to_array (result, array, dim, mask, op, NULL);
    730  1.1  mrg }
    731  1.1  mrg 
    732  1.1  mrg 
    733  1.1  mrg /********************** Simplification functions *****************************/
    734  1.1  mrg 
    735  1.1  mrg gfc_expr *
    736  1.1  mrg gfc_simplify_abs (gfc_expr *e)
    737  1.1  mrg {
    738  1.1  mrg   gfc_expr *result;
    739  1.1  mrg 
    740  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
    741  1.1  mrg     return NULL;
    742  1.1  mrg 
    743  1.1  mrg   switch (e->ts.type)
    744  1.1  mrg     {
    745  1.1  mrg       case BT_INTEGER:
    746  1.1  mrg 	result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
    747  1.1  mrg 	mpz_abs (result->value.integer, e->value.integer);
    748  1.1  mrg 	return range_check (result, "IABS");
    749  1.1  mrg 
    750  1.1  mrg       case BT_REAL:
    751  1.1  mrg 	result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
    752  1.1  mrg 	mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
    753  1.1  mrg 	return range_check (result, "ABS");
    754  1.1  mrg 
    755  1.1  mrg       case BT_COMPLEX:
    756  1.1  mrg 	gfc_set_model_kind (e->ts.kind);
    757  1.1  mrg 	result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
    758  1.1  mrg 	mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
    759  1.1  mrg 	return range_check (result, "CABS");
    760  1.1  mrg 
    761  1.1  mrg       default:
    762  1.1  mrg 	gfc_internal_error ("gfc_simplify_abs(): Bad type");
    763  1.1  mrg     }
    764  1.1  mrg }
    765  1.1  mrg 
    766  1.1  mrg 
    767  1.1  mrg static gfc_expr *
    768  1.1  mrg simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
    769  1.1  mrg {
    770  1.1  mrg   gfc_expr *result;
    771  1.1  mrg   int kind;
    772  1.1  mrg   bool too_large = false;
    773  1.1  mrg 
    774  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
    775  1.1  mrg     return NULL;
    776  1.1  mrg 
    777  1.1  mrg   kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
    778  1.1  mrg   if (kind == -1)
    779  1.1  mrg     return &gfc_bad_expr;
    780  1.1  mrg 
    781  1.1  mrg   if (mpz_cmp_si (e->value.integer, 0) < 0)
    782  1.1  mrg     {
    783  1.1  mrg       gfc_error ("Argument of %s function at %L is negative", name,
    784  1.1  mrg 		 &e->where);
    785  1.1  mrg       return &gfc_bad_expr;
    786  1.1  mrg     }
    787  1.1  mrg 
    788  1.1  mrg   if (ascii && warn_surprising && mpz_cmp_si (e->value.integer, 127) > 0)
    789  1.1  mrg     gfc_warning (OPT_Wsurprising,
    790  1.1  mrg 		 "Argument of %s function at %L outside of range [0,127]",
    791  1.1  mrg 		 name, &e->where);
    792  1.1  mrg 
    793  1.1  mrg   if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
    794  1.1  mrg     too_large = true;
    795  1.1  mrg   else if (kind == 4)
    796  1.1  mrg     {
    797  1.1  mrg       mpz_t t;
    798  1.1  mrg       mpz_init_set_ui (t, 2);
    799  1.1  mrg       mpz_pow_ui (t, t, 32);
    800  1.1  mrg       mpz_sub_ui (t, t, 1);
    801  1.1  mrg       if (mpz_cmp (e->value.integer, t) > 0)
    802  1.1  mrg 	too_large = true;
    803  1.1  mrg       mpz_clear (t);
    804  1.1  mrg     }
    805  1.1  mrg 
    806  1.1  mrg   if (too_large)
    807  1.1  mrg     {
    808  1.1  mrg       gfc_error ("Argument of %s function at %L is too large for the "
    809  1.1  mrg 		 "collating sequence of kind %d", name, &e->where, kind);
    810  1.1  mrg       return &gfc_bad_expr;
    811  1.1  mrg     }
    812  1.1  mrg 
    813  1.1  mrg   result = gfc_get_character_expr (kind, &e->where, NULL, 1);
    814  1.1  mrg   result->value.character.string[0] = mpz_get_ui (e->value.integer);
    815  1.1  mrg 
    816  1.1  mrg   return result;
    817  1.1  mrg }
    818  1.1  mrg 
    819  1.1  mrg 
    820  1.1  mrg 
    821  1.1  mrg /* We use the processor's collating sequence, because all
    822  1.1  mrg    systems that gfortran currently works on are ASCII.  */
    823  1.1  mrg 
    824  1.1  mrg gfc_expr *
    825  1.1  mrg gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
    826  1.1  mrg {
    827  1.1  mrg   return simplify_achar_char (e, k, "ACHAR", true);
    828  1.1  mrg }
    829  1.1  mrg 
    830  1.1  mrg 
    831  1.1  mrg gfc_expr *
    832  1.1  mrg gfc_simplify_acos (gfc_expr *x)
    833  1.1  mrg {
    834  1.1  mrg   gfc_expr *result;
    835  1.1  mrg 
    836  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
    837  1.1  mrg     return NULL;
    838  1.1  mrg 
    839  1.1  mrg   switch (x->ts.type)
    840  1.1  mrg     {
    841  1.1  mrg       case BT_REAL:
    842  1.1  mrg 	if (mpfr_cmp_si (x->value.real, 1) > 0
    843  1.1  mrg 	    || mpfr_cmp_si (x->value.real, -1) < 0)
    844  1.1  mrg 	  {
    845  1.1  mrg 	    gfc_error ("Argument of ACOS at %L must be between -1 and 1",
    846  1.1  mrg 		       &x->where);
    847  1.1  mrg 	    return &gfc_bad_expr;
    848  1.1  mrg 	  }
    849  1.1  mrg 	result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
    850  1.1  mrg 	mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
    851  1.1  mrg 	break;
    852  1.1  mrg 
    853  1.1  mrg       case BT_COMPLEX:
    854  1.1  mrg 	result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
    855  1.1  mrg 	mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
    856  1.1  mrg 	break;
    857  1.1  mrg 
    858  1.1  mrg       default:
    859  1.1  mrg 	gfc_internal_error ("in gfc_simplify_acos(): Bad type");
    860  1.1  mrg     }
    861  1.1  mrg 
    862  1.1  mrg   return range_check (result, "ACOS");
    863  1.1  mrg }
    864  1.1  mrg 
    865  1.1  mrg gfc_expr *
    866  1.1  mrg gfc_simplify_acosh (gfc_expr *x)
    867  1.1  mrg {
    868  1.1  mrg   gfc_expr *result;
    869  1.1  mrg 
    870  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
    871  1.1  mrg     return NULL;
    872  1.1  mrg 
    873  1.1  mrg   switch (x->ts.type)
    874  1.1  mrg     {
    875  1.1  mrg       case BT_REAL:
    876  1.1  mrg 	if (mpfr_cmp_si (x->value.real, 1) < 0)
    877  1.1  mrg 	  {
    878  1.1  mrg 	    gfc_error ("Argument of ACOSH at %L must not be less than 1",
    879  1.1  mrg 		       &x->where);
    880  1.1  mrg 	    return &gfc_bad_expr;
    881  1.1  mrg 	  }
    882  1.1  mrg 
    883  1.1  mrg 	result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
    884  1.1  mrg 	mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
    885  1.1  mrg 	break;
    886  1.1  mrg 
    887  1.1  mrg       case BT_COMPLEX:
    888  1.1  mrg 	result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
    889  1.1  mrg 	mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
    890  1.1  mrg 	break;
    891  1.1  mrg 
    892  1.1  mrg       default:
    893  1.1  mrg 	gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
    894  1.1  mrg     }
    895  1.1  mrg 
    896  1.1  mrg   return range_check (result, "ACOSH");
    897  1.1  mrg }
    898  1.1  mrg 
    899  1.1  mrg gfc_expr *
    900  1.1  mrg gfc_simplify_adjustl (gfc_expr *e)
    901  1.1  mrg {
    902  1.1  mrg   gfc_expr *result;
    903  1.1  mrg   int count, i, len;
    904  1.1  mrg   gfc_char_t ch;
    905  1.1  mrg 
    906  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
    907  1.1  mrg     return NULL;
    908  1.1  mrg 
    909  1.1  mrg   len = e->value.character.length;
    910  1.1  mrg 
    911  1.1  mrg   for (count = 0, i = 0; i < len; ++i)
    912  1.1  mrg     {
    913  1.1  mrg       ch = e->value.character.string[i];
    914  1.1  mrg       if (ch != ' ')
    915  1.1  mrg 	break;
    916  1.1  mrg       ++count;
    917  1.1  mrg     }
    918  1.1  mrg 
    919  1.1  mrg   result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
    920  1.1  mrg   for (i = 0; i < len - count; ++i)
    921  1.1  mrg     result->value.character.string[i] = e->value.character.string[count + i];
    922  1.1  mrg 
    923  1.1  mrg   return result;
    924  1.1  mrg }
    925  1.1  mrg 
    926  1.1  mrg 
    927  1.1  mrg gfc_expr *
    928  1.1  mrg gfc_simplify_adjustr (gfc_expr *e)
    929  1.1  mrg {
    930  1.1  mrg   gfc_expr *result;
    931  1.1  mrg   int count, i, len;
    932  1.1  mrg   gfc_char_t ch;
    933  1.1  mrg 
    934  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
    935  1.1  mrg     return NULL;
    936  1.1  mrg 
    937  1.1  mrg   len = e->value.character.length;
    938  1.1  mrg 
    939  1.1  mrg   for (count = 0, i = len - 1; i >= 0; --i)
    940  1.1  mrg     {
    941  1.1  mrg       ch = e->value.character.string[i];
    942  1.1  mrg       if (ch != ' ')
    943  1.1  mrg 	break;
    944  1.1  mrg       ++count;
    945  1.1  mrg     }
    946  1.1  mrg 
    947  1.1  mrg   result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
    948  1.1  mrg   for (i = 0; i < count; ++i)
    949  1.1  mrg     result->value.character.string[i] = ' ';
    950  1.1  mrg 
    951  1.1  mrg   for (i = count; i < len; ++i)
    952  1.1  mrg     result->value.character.string[i] = e->value.character.string[i - count];
    953  1.1  mrg 
    954  1.1  mrg   return result;
    955  1.1  mrg }
    956  1.1  mrg 
    957  1.1  mrg 
    958  1.1  mrg gfc_expr *
    959  1.1  mrg gfc_simplify_aimag (gfc_expr *e)
    960  1.1  mrg {
    961  1.1  mrg   gfc_expr *result;
    962  1.1  mrg 
    963  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
    964  1.1  mrg     return NULL;
    965  1.1  mrg 
    966  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
    967  1.1  mrg   mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
    968  1.1  mrg 
    969  1.1  mrg   return range_check (result, "AIMAG");
    970  1.1  mrg }
    971  1.1  mrg 
    972  1.1  mrg 
    973  1.1  mrg gfc_expr *
    974  1.1  mrg gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
    975  1.1  mrg {
    976  1.1  mrg   gfc_expr *rtrunc, *result;
    977  1.1  mrg   int kind;
    978  1.1  mrg 
    979  1.1  mrg   kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
    980  1.1  mrg   if (kind == -1)
    981  1.1  mrg     return &gfc_bad_expr;
    982  1.1  mrg 
    983  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
    984  1.1  mrg     return NULL;
    985  1.1  mrg 
    986  1.1  mrg   rtrunc = gfc_copy_expr (e);
    987  1.1  mrg   mpfr_trunc (rtrunc->value.real, e->value.real);
    988  1.1  mrg 
    989  1.1  mrg   result = gfc_real2real (rtrunc, kind);
    990  1.1  mrg 
    991  1.1  mrg   gfc_free_expr (rtrunc);
    992  1.1  mrg 
    993  1.1  mrg   return range_check (result, "AINT");
    994  1.1  mrg }
    995  1.1  mrg 
    996  1.1  mrg 
    997  1.1  mrg gfc_expr *
    998  1.1  mrg gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
    999  1.1  mrg {
   1000  1.1  mrg   return simplify_transformation (mask, dim, NULL, true, gfc_and);
   1001  1.1  mrg }
   1002  1.1  mrg 
   1003  1.1  mrg 
   1004  1.1  mrg gfc_expr *
   1005  1.1  mrg gfc_simplify_dint (gfc_expr *e)
   1006  1.1  mrg {
   1007  1.1  mrg   gfc_expr *rtrunc, *result;
   1008  1.1  mrg 
   1009  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   1010  1.1  mrg     return NULL;
   1011  1.1  mrg 
   1012  1.1  mrg   rtrunc = gfc_copy_expr (e);
   1013  1.1  mrg   mpfr_trunc (rtrunc->value.real, e->value.real);
   1014  1.1  mrg 
   1015  1.1  mrg   result = gfc_real2real (rtrunc, gfc_default_double_kind);
   1016  1.1  mrg 
   1017  1.1  mrg   gfc_free_expr (rtrunc);
   1018  1.1  mrg 
   1019  1.1  mrg   return range_check (result, "DINT");
   1020  1.1  mrg }
   1021  1.1  mrg 
   1022  1.1  mrg 
   1023  1.1  mrg gfc_expr *
   1024  1.1  mrg gfc_simplify_dreal (gfc_expr *e)
   1025  1.1  mrg {
   1026  1.1  mrg   gfc_expr *result = NULL;
   1027  1.1  mrg 
   1028  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   1029  1.1  mrg     return NULL;
   1030  1.1  mrg 
   1031  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
   1032  1.1  mrg   mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
   1033  1.1  mrg 
   1034  1.1  mrg   return range_check (result, "DREAL");
   1035  1.1  mrg }
   1036  1.1  mrg 
   1037  1.1  mrg 
   1038  1.1  mrg gfc_expr *
   1039  1.1  mrg gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
   1040  1.1  mrg {
   1041  1.1  mrg   gfc_expr *result;
   1042  1.1  mrg   int kind;
   1043  1.1  mrg 
   1044  1.1  mrg   kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
   1045  1.1  mrg   if (kind == -1)
   1046  1.1  mrg     return &gfc_bad_expr;
   1047  1.1  mrg 
   1048  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   1049  1.1  mrg     return NULL;
   1050  1.1  mrg 
   1051  1.1  mrg   result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
   1052  1.1  mrg   mpfr_round (result->value.real, e->value.real);
   1053  1.1  mrg 
   1054  1.1  mrg   return range_check (result, "ANINT");
   1055  1.1  mrg }
   1056  1.1  mrg 
   1057  1.1  mrg 
   1058  1.1  mrg gfc_expr *
   1059  1.1  mrg gfc_simplify_and (gfc_expr *x, gfc_expr *y)
   1060  1.1  mrg {
   1061  1.1  mrg   gfc_expr *result;
   1062  1.1  mrg   int kind;
   1063  1.1  mrg 
   1064  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   1065  1.1  mrg     return NULL;
   1066  1.1  mrg 
   1067  1.1  mrg   kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
   1068  1.1  mrg 
   1069  1.1  mrg   switch (x->ts.type)
   1070  1.1  mrg     {
   1071  1.1  mrg       case BT_INTEGER:
   1072  1.1  mrg 	result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
   1073  1.1  mrg 	mpz_and (result->value.integer, x->value.integer, y->value.integer);
   1074  1.1  mrg 	return range_check (result, "AND");
   1075  1.1  mrg 
   1076  1.1  mrg       case BT_LOGICAL:
   1077  1.1  mrg 	return gfc_get_logical_expr (kind, &x->where,
   1078  1.1  mrg 				     x->value.logical && y->value.logical);
   1079  1.1  mrg 
   1080  1.1  mrg       default:
   1081  1.1  mrg 	gcc_unreachable ();
   1082  1.1  mrg     }
   1083  1.1  mrg }
   1084  1.1  mrg 
   1085  1.1  mrg 
   1086  1.1  mrg gfc_expr *
   1087  1.1  mrg gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
   1088  1.1  mrg {
   1089  1.1  mrg   return simplify_transformation (mask, dim, NULL, false, gfc_or);
   1090  1.1  mrg }
   1091  1.1  mrg 
   1092  1.1  mrg 
   1093  1.1  mrg gfc_expr *
   1094  1.1  mrg gfc_simplify_dnint (gfc_expr *e)
   1095  1.1  mrg {
   1096  1.1  mrg   gfc_expr *result;
   1097  1.1  mrg 
   1098  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   1099  1.1  mrg     return NULL;
   1100  1.1  mrg 
   1101  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
   1102  1.1  mrg   mpfr_round (result->value.real, e->value.real);
   1103  1.1  mrg 
   1104  1.1  mrg   return range_check (result, "DNINT");
   1105  1.1  mrg }
   1106  1.1  mrg 
   1107  1.1  mrg 
   1108  1.1  mrg gfc_expr *
   1109  1.1  mrg gfc_simplify_asin (gfc_expr *x)
   1110  1.1  mrg {
   1111  1.1  mrg   gfc_expr *result;
   1112  1.1  mrg 
   1113  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1114  1.1  mrg     return NULL;
   1115  1.1  mrg 
   1116  1.1  mrg   switch (x->ts.type)
   1117  1.1  mrg     {
   1118  1.1  mrg       case BT_REAL:
   1119  1.1  mrg 	if (mpfr_cmp_si (x->value.real, 1) > 0
   1120  1.1  mrg 	    || mpfr_cmp_si (x->value.real, -1) < 0)
   1121  1.1  mrg 	  {
   1122  1.1  mrg 	    gfc_error ("Argument of ASIN at %L must be between -1 and 1",
   1123  1.1  mrg 		       &x->where);
   1124  1.1  mrg 	    return &gfc_bad_expr;
   1125  1.1  mrg 	  }
   1126  1.1  mrg 	result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1127  1.1  mrg 	mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
   1128  1.1  mrg 	break;
   1129  1.1  mrg 
   1130  1.1  mrg       case BT_COMPLEX:
   1131  1.1  mrg 	result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1132  1.1  mrg 	mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   1133  1.1  mrg 	break;
   1134  1.1  mrg 
   1135  1.1  mrg       default:
   1136  1.1  mrg 	gfc_internal_error ("in gfc_simplify_asin(): Bad type");
   1137  1.1  mrg     }
   1138  1.1  mrg 
   1139  1.1  mrg   return range_check (result, "ASIN");
   1140  1.1  mrg }
   1141  1.1  mrg 
   1142  1.1  mrg 
   1143  1.1  mrg /* Convert radians to degrees, i.e., x * 180 / pi.  */
   1144  1.1  mrg 
   1145  1.1  mrg static void
   1146  1.1  mrg rad2deg (mpfr_t x)
   1147  1.1  mrg {
   1148  1.1  mrg   mpfr_t tmp;
   1149  1.1  mrg 
   1150  1.1  mrg   mpfr_init (tmp);
   1151  1.1  mrg   mpfr_const_pi (tmp, GFC_RND_MODE);
   1152  1.1  mrg   mpfr_mul_ui (x, x, 180, GFC_RND_MODE);
   1153  1.1  mrg   mpfr_div (x, x, tmp, GFC_RND_MODE);
   1154  1.1  mrg   mpfr_clear (tmp);
   1155  1.1  mrg }
   1156  1.1  mrg 
   1157  1.1  mrg 
   1158  1.1  mrg /* Simplify ACOSD(X) where the returned value has units of degree.  */
   1159  1.1  mrg 
   1160  1.1  mrg gfc_expr *
   1161  1.1  mrg gfc_simplify_acosd (gfc_expr *x)
   1162  1.1  mrg {
   1163  1.1  mrg   gfc_expr *result;
   1164  1.1  mrg 
   1165  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1166  1.1  mrg     return NULL;
   1167  1.1  mrg 
   1168  1.1  mrg   if (mpfr_cmp_si (x->value.real, 1) > 0
   1169  1.1  mrg       || mpfr_cmp_si (x->value.real, -1) < 0)
   1170  1.1  mrg     {
   1171  1.1  mrg       gfc_error ("Argument of ACOSD at %L must be between -1 and 1",
   1172  1.1  mrg 		 &x->where);
   1173  1.1  mrg       return &gfc_bad_expr;
   1174  1.1  mrg     }
   1175  1.1  mrg 
   1176  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1177  1.1  mrg   mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
   1178  1.1  mrg   rad2deg (result->value.real);
   1179  1.1  mrg 
   1180  1.1  mrg   return range_check (result, "ACOSD");
   1181  1.1  mrg }
   1182  1.1  mrg 
   1183  1.1  mrg 
   1184  1.1  mrg /* Simplify asind (x) where the returned value has units of degree. */
   1185  1.1  mrg 
   1186  1.1  mrg gfc_expr *
   1187  1.1  mrg gfc_simplify_asind (gfc_expr *x)
   1188  1.1  mrg {
   1189  1.1  mrg   gfc_expr *result;
   1190  1.1  mrg 
   1191  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1192  1.1  mrg     return NULL;
   1193  1.1  mrg 
   1194  1.1  mrg   if (mpfr_cmp_si (x->value.real, 1) > 0
   1195  1.1  mrg       || mpfr_cmp_si (x->value.real, -1) < 0)
   1196  1.1  mrg     {
   1197  1.1  mrg       gfc_error ("Argument of ASIND at %L must be between -1 and 1",
   1198  1.1  mrg 		 &x->where);
   1199  1.1  mrg       return &gfc_bad_expr;
   1200  1.1  mrg     }
   1201  1.1  mrg 
   1202  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1203  1.1  mrg   mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
   1204  1.1  mrg   rad2deg (result->value.real);
   1205  1.1  mrg 
   1206  1.1  mrg   return range_check (result, "ASIND");
   1207  1.1  mrg }
   1208  1.1  mrg 
   1209  1.1  mrg 
   1210  1.1  mrg /* Simplify atand (x) where the returned value has units of degree. */
   1211  1.1  mrg 
   1212  1.1  mrg gfc_expr *
   1213  1.1  mrg gfc_simplify_atand (gfc_expr *x)
   1214  1.1  mrg {
   1215  1.1  mrg   gfc_expr *result;
   1216  1.1  mrg 
   1217  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1218  1.1  mrg     return NULL;
   1219  1.1  mrg 
   1220  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1221  1.1  mrg   mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
   1222  1.1  mrg   rad2deg (result->value.real);
   1223  1.1  mrg 
   1224  1.1  mrg   return range_check (result, "ATAND");
   1225  1.1  mrg }
   1226  1.1  mrg 
   1227  1.1  mrg 
   1228  1.1  mrg gfc_expr *
   1229  1.1  mrg gfc_simplify_asinh (gfc_expr *x)
   1230  1.1  mrg {
   1231  1.1  mrg   gfc_expr *result;
   1232  1.1  mrg 
   1233  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1234  1.1  mrg     return NULL;
   1235  1.1  mrg 
   1236  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1237  1.1  mrg 
   1238  1.1  mrg   switch (x->ts.type)
   1239  1.1  mrg     {
   1240  1.1  mrg       case BT_REAL:
   1241  1.1  mrg 	mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
   1242  1.1  mrg 	break;
   1243  1.1  mrg 
   1244  1.1  mrg       case BT_COMPLEX:
   1245  1.1  mrg 	mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   1246  1.1  mrg 	break;
   1247  1.1  mrg 
   1248  1.1  mrg       default:
   1249  1.1  mrg 	gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
   1250  1.1  mrg     }
   1251  1.1  mrg 
   1252  1.1  mrg   return range_check (result, "ASINH");
   1253  1.1  mrg }
   1254  1.1  mrg 
   1255  1.1  mrg 
   1256  1.1  mrg gfc_expr *
   1257  1.1  mrg gfc_simplify_atan (gfc_expr *x)
   1258  1.1  mrg {
   1259  1.1  mrg   gfc_expr *result;
   1260  1.1  mrg 
   1261  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1262  1.1  mrg     return NULL;
   1263  1.1  mrg 
   1264  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1265  1.1  mrg 
   1266  1.1  mrg   switch (x->ts.type)
   1267  1.1  mrg     {
   1268  1.1  mrg       case BT_REAL:
   1269  1.1  mrg 	mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
   1270  1.1  mrg 	break;
   1271  1.1  mrg 
   1272  1.1  mrg       case BT_COMPLEX:
   1273  1.1  mrg 	mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   1274  1.1  mrg 	break;
   1275  1.1  mrg 
   1276  1.1  mrg       default:
   1277  1.1  mrg 	gfc_internal_error ("in gfc_simplify_atan(): Bad type");
   1278  1.1  mrg     }
   1279  1.1  mrg 
   1280  1.1  mrg   return range_check (result, "ATAN");
   1281  1.1  mrg }
   1282  1.1  mrg 
   1283  1.1  mrg 
   1284  1.1  mrg gfc_expr *
   1285  1.1  mrg gfc_simplify_atanh (gfc_expr *x)
   1286  1.1  mrg {
   1287  1.1  mrg   gfc_expr *result;
   1288  1.1  mrg 
   1289  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1290  1.1  mrg     return NULL;
   1291  1.1  mrg 
   1292  1.1  mrg   switch (x->ts.type)
   1293  1.1  mrg     {
   1294  1.1  mrg       case BT_REAL:
   1295  1.1  mrg 	if (mpfr_cmp_si (x->value.real, 1) >= 0
   1296  1.1  mrg 	    || mpfr_cmp_si (x->value.real, -1) <= 0)
   1297  1.1  mrg 	  {
   1298  1.1  mrg 	    gfc_error ("Argument of ATANH at %L must be inside the range -1 "
   1299  1.1  mrg 		       "to 1", &x->where);
   1300  1.1  mrg 	    return &gfc_bad_expr;
   1301  1.1  mrg 	  }
   1302  1.1  mrg 	result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1303  1.1  mrg 	mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
   1304  1.1  mrg 	break;
   1305  1.1  mrg 
   1306  1.1  mrg       case BT_COMPLEX:
   1307  1.1  mrg 	result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1308  1.1  mrg 	mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   1309  1.1  mrg 	break;
   1310  1.1  mrg 
   1311  1.1  mrg       default:
   1312  1.1  mrg 	gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
   1313  1.1  mrg     }
   1314  1.1  mrg 
   1315  1.1  mrg   return range_check (result, "ATANH");
   1316  1.1  mrg }
   1317  1.1  mrg 
   1318  1.1  mrg 
   1319  1.1  mrg gfc_expr *
   1320  1.1  mrg gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
   1321  1.1  mrg {
   1322  1.1  mrg   gfc_expr *result;
   1323  1.1  mrg 
   1324  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   1325  1.1  mrg     return NULL;
   1326  1.1  mrg 
   1327  1.1  mrg   if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
   1328  1.1  mrg     {
   1329  1.1  mrg       gfc_error ("If first argument of ATAN2 at %L is zero, then the "
   1330  1.1  mrg 		 "second argument must not be zero", &y->where);
   1331  1.1  mrg       return &gfc_bad_expr;
   1332  1.1  mrg     }
   1333  1.1  mrg 
   1334  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1335  1.1  mrg   mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
   1336  1.1  mrg 
   1337  1.1  mrg   return range_check (result, "ATAN2");
   1338  1.1  mrg }
   1339  1.1  mrg 
   1340  1.1  mrg 
   1341  1.1  mrg gfc_expr *
   1342  1.1  mrg gfc_simplify_bessel_j0 (gfc_expr *x)
   1343  1.1  mrg {
   1344  1.1  mrg   gfc_expr *result;
   1345  1.1  mrg 
   1346  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1347  1.1  mrg     return NULL;
   1348  1.1  mrg 
   1349  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1350  1.1  mrg   mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
   1351  1.1  mrg 
   1352  1.1  mrg   return range_check (result, "BESSEL_J0");
   1353  1.1  mrg }
   1354  1.1  mrg 
   1355  1.1  mrg 
   1356  1.1  mrg gfc_expr *
   1357  1.1  mrg gfc_simplify_bessel_j1 (gfc_expr *x)
   1358  1.1  mrg {
   1359  1.1  mrg   gfc_expr *result;
   1360  1.1  mrg 
   1361  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1362  1.1  mrg     return NULL;
   1363  1.1  mrg 
   1364  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1365  1.1  mrg   mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
   1366  1.1  mrg 
   1367  1.1  mrg   return range_check (result, "BESSEL_J1");
   1368  1.1  mrg }
   1369  1.1  mrg 
   1370  1.1  mrg 
   1371  1.1  mrg gfc_expr *
   1372  1.1  mrg gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
   1373  1.1  mrg {
   1374  1.1  mrg   gfc_expr *result;
   1375  1.1  mrg   long n;
   1376  1.1  mrg 
   1377  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
   1378  1.1  mrg     return NULL;
   1379  1.1  mrg 
   1380  1.1  mrg   n = mpz_get_si (order->value.integer);
   1381  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1382  1.1  mrg   mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
   1383  1.1  mrg 
   1384  1.1  mrg   return range_check (result, "BESSEL_JN");
   1385  1.1  mrg }
   1386  1.1  mrg 
   1387  1.1  mrg 
   1388  1.1  mrg /* Simplify transformational form of JN and YN.  */
   1389  1.1  mrg 
   1390  1.1  mrg static gfc_expr *
   1391  1.1  mrg gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
   1392  1.1  mrg 			bool jn)
   1393  1.1  mrg {
   1394  1.1  mrg   gfc_expr *result;
   1395  1.1  mrg   gfc_expr *e;
   1396  1.1  mrg   long n1, n2;
   1397  1.1  mrg   int i;
   1398  1.1  mrg   mpfr_t x2rev, last1, last2;
   1399  1.1  mrg 
   1400  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
   1401  1.1  mrg       || order2->expr_type != EXPR_CONSTANT)
   1402  1.1  mrg     return NULL;
   1403  1.1  mrg 
   1404  1.1  mrg   n1 = mpz_get_si (order1->value.integer);
   1405  1.1  mrg   n2 = mpz_get_si (order2->value.integer);
   1406  1.1  mrg   result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
   1407  1.1  mrg   result->rank = 1;
   1408  1.1  mrg   result->shape = gfc_get_shape (1);
   1409  1.1  mrg   mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
   1410  1.1  mrg 
   1411  1.1  mrg   if (n2 < n1)
   1412  1.1  mrg     return result;
   1413  1.1  mrg 
   1414  1.1  mrg   /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
   1415  1.1  mrg      YN(N, 0.0) = -Inf.  */
   1416  1.1  mrg 
   1417  1.1  mrg   if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
   1418  1.1  mrg     {
   1419  1.1  mrg       if (!jn && flag_range_check)
   1420  1.1  mrg 	{
   1421  1.1  mrg 	  gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
   1422  1.1  mrg  	  gfc_free_expr (result);
   1423  1.1  mrg 	  return &gfc_bad_expr;
   1424  1.1  mrg 	}
   1425  1.1  mrg 
   1426  1.1  mrg       if (jn && n1 == 0)
   1427  1.1  mrg 	{
   1428  1.1  mrg 	  e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1429  1.1  mrg 	  mpfr_set_ui (e->value.real, 1, GFC_RND_MODE);
   1430  1.1  mrg 	  gfc_constructor_append_expr (&result->value.constructor, e,
   1431  1.1  mrg 				       &x->where);
   1432  1.1  mrg 	  n1++;
   1433  1.1  mrg 	}
   1434  1.1  mrg 
   1435  1.1  mrg       for (i = n1; i <= n2; i++)
   1436  1.1  mrg 	{
   1437  1.1  mrg 	  e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1438  1.1  mrg 	  if (jn)
   1439  1.1  mrg 	    mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
   1440  1.1  mrg 	  else
   1441  1.1  mrg 	    mpfr_set_inf (e->value.real, -1);
   1442  1.1  mrg 	  gfc_constructor_append_expr (&result->value.constructor, e,
   1443  1.1  mrg 				       &x->where);
   1444  1.1  mrg 	}
   1445  1.1  mrg 
   1446  1.1  mrg       return result;
   1447  1.1  mrg     }
   1448  1.1  mrg 
   1449  1.1  mrg   /* Use the faster but more verbose recurrence algorithm. Bessel functions
   1450  1.1  mrg      are stable for downward recursion and Neumann functions are stable
   1451  1.1  mrg      for upward recursion. It is
   1452  1.1  mrg        x2rev = 2.0/x,
   1453  1.1  mrg        J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
   1454  1.1  mrg        Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
   1455  1.1  mrg      Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1  */
   1456  1.1  mrg 
   1457  1.1  mrg   gfc_set_model_kind (x->ts.kind);
   1458  1.1  mrg 
   1459  1.1  mrg   /* Get first recursion anchor.  */
   1460  1.1  mrg 
   1461  1.1  mrg   mpfr_init (last1);
   1462  1.1  mrg   if (jn)
   1463  1.1  mrg     mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
   1464  1.1  mrg   else
   1465  1.1  mrg     mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
   1466  1.1  mrg 
   1467  1.1  mrg   e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1468  1.1  mrg   mpfr_set (e->value.real, last1, GFC_RND_MODE);
   1469  1.1  mrg   if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
   1470  1.1  mrg     {
   1471  1.1  mrg       mpfr_clear (last1);
   1472  1.1  mrg       gfc_free_expr (e);
   1473  1.1  mrg       gfc_free_expr (result);
   1474  1.1  mrg       return &gfc_bad_expr;
   1475  1.1  mrg     }
   1476  1.1  mrg   gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
   1477  1.1  mrg 
   1478  1.1  mrg   if (n1 == n2)
   1479  1.1  mrg     {
   1480  1.1  mrg       mpfr_clear (last1);
   1481  1.1  mrg       return result;
   1482  1.1  mrg     }
   1483  1.1  mrg 
   1484  1.1  mrg   /* Get second recursion anchor.  */
   1485  1.1  mrg 
   1486  1.1  mrg   mpfr_init (last2);
   1487  1.1  mrg   if (jn)
   1488  1.1  mrg     mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
   1489  1.1  mrg   else
   1490  1.1  mrg     mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
   1491  1.1  mrg 
   1492  1.1  mrg   e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1493  1.1  mrg   mpfr_set (e->value.real, last2, GFC_RND_MODE);
   1494  1.1  mrg   if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
   1495  1.1  mrg     {
   1496  1.1  mrg       mpfr_clear (last1);
   1497  1.1  mrg       mpfr_clear (last2);
   1498  1.1  mrg       gfc_free_expr (e);
   1499  1.1  mrg       gfc_free_expr (result);
   1500  1.1  mrg       return &gfc_bad_expr;
   1501  1.1  mrg     }
   1502  1.1  mrg   if (jn)
   1503  1.1  mrg     gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
   1504  1.1  mrg   else
   1505  1.1  mrg     gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
   1506  1.1  mrg 
   1507  1.1  mrg   if (n1 + 1 == n2)
   1508  1.1  mrg     {
   1509  1.1  mrg       mpfr_clear (last1);
   1510  1.1  mrg       mpfr_clear (last2);
   1511  1.1  mrg       return result;
   1512  1.1  mrg     }
   1513  1.1  mrg 
   1514  1.1  mrg   /* Start actual recursion.  */
   1515  1.1  mrg 
   1516  1.1  mrg   mpfr_init (x2rev);
   1517  1.1  mrg   mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
   1518  1.1  mrg 
   1519  1.1  mrg   for (i = 2; i <= n2-n1; i++)
   1520  1.1  mrg     {
   1521  1.1  mrg       e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1522  1.1  mrg 
   1523  1.1  mrg       /* Special case: For YN, if the previous N gave -INF, set
   1524  1.1  mrg 	 also N+1 to -INF.  */
   1525  1.1  mrg       if (!jn && !flag_range_check && mpfr_inf_p (last2))
   1526  1.1  mrg 	{
   1527  1.1  mrg 	  mpfr_set_inf (e->value.real, -1);
   1528  1.1  mrg 	  gfc_constructor_append_expr (&result->value.constructor, e,
   1529  1.1  mrg 				       &x->where);
   1530  1.1  mrg 	  continue;
   1531  1.1  mrg 	}
   1532  1.1  mrg 
   1533  1.1  mrg       mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
   1534  1.1  mrg 		   GFC_RND_MODE);
   1535  1.1  mrg       mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
   1536  1.1  mrg       mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
   1537  1.1  mrg 
   1538  1.1  mrg       if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
   1539  1.1  mrg 	{
   1540  1.1  mrg 	  /* Range_check frees "e" in that case.  */
   1541  1.1  mrg 	  e = NULL;
   1542  1.1  mrg 	  goto error;
   1543  1.1  mrg 	}
   1544  1.1  mrg 
   1545  1.1  mrg       if (jn)
   1546  1.1  mrg 	gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
   1547  1.1  mrg 				     -i-1);
   1548  1.1  mrg       else
   1549  1.1  mrg 	gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
   1550  1.1  mrg 
   1551  1.1  mrg       mpfr_set (last1, last2, GFC_RND_MODE);
   1552  1.1  mrg       mpfr_set (last2, e->value.real, GFC_RND_MODE);
   1553  1.1  mrg     }
   1554  1.1  mrg 
   1555  1.1  mrg   mpfr_clear (last1);
   1556  1.1  mrg   mpfr_clear (last2);
   1557  1.1  mrg   mpfr_clear (x2rev);
   1558  1.1  mrg   return result;
   1559  1.1  mrg 
   1560  1.1  mrg error:
   1561  1.1  mrg   mpfr_clear (last1);
   1562  1.1  mrg   mpfr_clear (last2);
   1563  1.1  mrg   mpfr_clear (x2rev);
   1564  1.1  mrg   gfc_free_expr (e);
   1565  1.1  mrg   gfc_free_expr (result);
   1566  1.1  mrg   return &gfc_bad_expr;
   1567  1.1  mrg }
   1568  1.1  mrg 
   1569  1.1  mrg 
   1570  1.1  mrg gfc_expr *
   1571  1.1  mrg gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
   1572  1.1  mrg {
   1573  1.1  mrg   return gfc_simplify_bessel_n2 (order1, order2, x, true);
   1574  1.1  mrg }
   1575  1.1  mrg 
   1576  1.1  mrg 
   1577  1.1  mrg gfc_expr *
   1578  1.1  mrg gfc_simplify_bessel_y0 (gfc_expr *x)
   1579  1.1  mrg {
   1580  1.1  mrg   gfc_expr *result;
   1581  1.1  mrg 
   1582  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1583  1.1  mrg     return NULL;
   1584  1.1  mrg 
   1585  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1586  1.1  mrg   mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
   1587  1.1  mrg 
   1588  1.1  mrg   return range_check (result, "BESSEL_Y0");
   1589  1.1  mrg }
   1590  1.1  mrg 
   1591  1.1  mrg 
   1592  1.1  mrg gfc_expr *
   1593  1.1  mrg gfc_simplify_bessel_y1 (gfc_expr *x)
   1594  1.1  mrg {
   1595  1.1  mrg   gfc_expr *result;
   1596  1.1  mrg 
   1597  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1598  1.1  mrg     return NULL;
   1599  1.1  mrg 
   1600  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1601  1.1  mrg   mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
   1602  1.1  mrg 
   1603  1.1  mrg   return range_check (result, "BESSEL_Y1");
   1604  1.1  mrg }
   1605  1.1  mrg 
   1606  1.1  mrg 
   1607  1.1  mrg gfc_expr *
   1608  1.1  mrg gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
   1609  1.1  mrg {
   1610  1.1  mrg   gfc_expr *result;
   1611  1.1  mrg   long n;
   1612  1.1  mrg 
   1613  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
   1614  1.1  mrg     return NULL;
   1615  1.1  mrg 
   1616  1.1  mrg   n = mpz_get_si (order->value.integer);
   1617  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1618  1.1  mrg   mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
   1619  1.1  mrg 
   1620  1.1  mrg   return range_check (result, "BESSEL_YN");
   1621  1.1  mrg }
   1622  1.1  mrg 
   1623  1.1  mrg 
   1624  1.1  mrg gfc_expr *
   1625  1.1  mrg gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
   1626  1.1  mrg {
   1627  1.1  mrg   return gfc_simplify_bessel_n2 (order1, order2, x, false);
   1628  1.1  mrg }
   1629  1.1  mrg 
   1630  1.1  mrg 
   1631  1.1  mrg gfc_expr *
   1632  1.1  mrg gfc_simplify_bit_size (gfc_expr *e)
   1633  1.1  mrg {
   1634  1.1  mrg   int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
   1635  1.1  mrg   return gfc_get_int_expr (e->ts.kind, &e->where,
   1636  1.1  mrg 			   gfc_integer_kinds[i].bit_size);
   1637  1.1  mrg }
   1638  1.1  mrg 
   1639  1.1  mrg 
   1640  1.1  mrg gfc_expr *
   1641  1.1  mrg gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
   1642  1.1  mrg {
   1643  1.1  mrg   int b;
   1644  1.1  mrg 
   1645  1.1  mrg   if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
   1646  1.1  mrg     return NULL;
   1647  1.1  mrg 
   1648  1.1  mrg   if (gfc_extract_int (bit, &b) || b < 0)
   1649  1.1  mrg     return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
   1650  1.1  mrg 
   1651  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
   1652  1.1  mrg 			       mpz_tstbit (e->value.integer, b));
   1653  1.1  mrg }
   1654  1.1  mrg 
   1655  1.1  mrg 
   1656  1.1  mrg static int
   1657  1.1  mrg compare_bitwise (gfc_expr *i, gfc_expr *j)
   1658  1.1  mrg {
   1659  1.1  mrg   mpz_t x, y;
   1660  1.1  mrg   int k, res;
   1661  1.1  mrg 
   1662  1.1  mrg   gcc_assert (i->ts.type == BT_INTEGER);
   1663  1.1  mrg   gcc_assert (j->ts.type == BT_INTEGER);
   1664  1.1  mrg 
   1665  1.1  mrg   mpz_init_set (x, i->value.integer);
   1666  1.1  mrg   k = gfc_validate_kind (i->ts.type, i->ts.kind, false);
   1667  1.1  mrg   convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
   1668  1.1  mrg 
   1669  1.1  mrg   mpz_init_set (y, j->value.integer);
   1670  1.1  mrg   k = gfc_validate_kind (j->ts.type, j->ts.kind, false);
   1671  1.1  mrg   convert_mpz_to_unsigned (y, gfc_integer_kinds[k].bit_size);
   1672  1.1  mrg 
   1673  1.1  mrg   res = mpz_cmp (x, y);
   1674  1.1  mrg   mpz_clear (x);
   1675  1.1  mrg   mpz_clear (y);
   1676  1.1  mrg   return res;
   1677  1.1  mrg }
   1678  1.1  mrg 
   1679  1.1  mrg 
   1680  1.1  mrg gfc_expr *
   1681  1.1  mrg gfc_simplify_bge (gfc_expr *i, gfc_expr *j)
   1682  1.1  mrg {
   1683  1.1  mrg   if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
   1684  1.1  mrg     return NULL;
   1685  1.1  mrg 
   1686  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
   1687  1.1  mrg 			       compare_bitwise (i, j) >= 0);
   1688  1.1  mrg }
   1689  1.1  mrg 
   1690  1.1  mrg 
   1691  1.1  mrg gfc_expr *
   1692  1.1  mrg gfc_simplify_bgt (gfc_expr *i, gfc_expr *j)
   1693  1.1  mrg {
   1694  1.1  mrg   if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
   1695  1.1  mrg     return NULL;
   1696  1.1  mrg 
   1697  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
   1698  1.1  mrg 			       compare_bitwise (i, j) > 0);
   1699  1.1  mrg }
   1700  1.1  mrg 
   1701  1.1  mrg 
   1702  1.1  mrg gfc_expr *
   1703  1.1  mrg gfc_simplify_ble (gfc_expr *i, gfc_expr *j)
   1704  1.1  mrg {
   1705  1.1  mrg   if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
   1706  1.1  mrg     return NULL;
   1707  1.1  mrg 
   1708  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
   1709  1.1  mrg 			       compare_bitwise (i, j) <= 0);
   1710  1.1  mrg }
   1711  1.1  mrg 
   1712  1.1  mrg 
   1713  1.1  mrg gfc_expr *
   1714  1.1  mrg gfc_simplify_blt (gfc_expr *i, gfc_expr *j)
   1715  1.1  mrg {
   1716  1.1  mrg   if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
   1717  1.1  mrg     return NULL;
   1718  1.1  mrg 
   1719  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
   1720  1.1  mrg 			       compare_bitwise (i, j) < 0);
   1721  1.1  mrg }
   1722  1.1  mrg 
   1723  1.1  mrg 
   1724  1.1  mrg gfc_expr *
   1725  1.1  mrg gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
   1726  1.1  mrg {
   1727  1.1  mrg   gfc_expr *ceil, *result;
   1728  1.1  mrg   int kind;
   1729  1.1  mrg 
   1730  1.1  mrg   kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
   1731  1.1  mrg   if (kind == -1)
   1732  1.1  mrg     return &gfc_bad_expr;
   1733  1.1  mrg 
   1734  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   1735  1.1  mrg     return NULL;
   1736  1.1  mrg 
   1737  1.1  mrg   ceil = gfc_copy_expr (e);
   1738  1.1  mrg   mpfr_ceil (ceil->value.real, e->value.real);
   1739  1.1  mrg 
   1740  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
   1741  1.1  mrg   gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
   1742  1.1  mrg 
   1743  1.1  mrg   gfc_free_expr (ceil);
   1744  1.1  mrg 
   1745  1.1  mrg   return range_check (result, "CEILING");
   1746  1.1  mrg }
   1747  1.1  mrg 
   1748  1.1  mrg 
   1749  1.1  mrg gfc_expr *
   1750  1.1  mrg gfc_simplify_char (gfc_expr *e, gfc_expr *k)
   1751  1.1  mrg {
   1752  1.1  mrg   return simplify_achar_char (e, k, "CHAR", false);
   1753  1.1  mrg }
   1754  1.1  mrg 
   1755  1.1  mrg 
   1756  1.1  mrg /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX.  */
   1757  1.1  mrg 
   1758  1.1  mrg static gfc_expr *
   1759  1.1  mrg simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
   1760  1.1  mrg {
   1761  1.1  mrg   gfc_expr *result;
   1762  1.1  mrg 
   1763  1.1  mrg   if (x->expr_type != EXPR_CONSTANT
   1764  1.1  mrg       || (y != NULL && y->expr_type != EXPR_CONSTANT))
   1765  1.1  mrg     return NULL;
   1766  1.1  mrg 
   1767  1.1  mrg   result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
   1768  1.1  mrg 
   1769  1.1  mrg   switch (x->ts.type)
   1770  1.1  mrg     {
   1771  1.1  mrg       case BT_INTEGER:
   1772  1.1  mrg 	mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
   1773  1.1  mrg 	break;
   1774  1.1  mrg 
   1775  1.1  mrg       case BT_REAL:
   1776  1.1  mrg 	mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
   1777  1.1  mrg 	break;
   1778  1.1  mrg 
   1779  1.1  mrg       case BT_COMPLEX:
   1780  1.1  mrg 	mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   1781  1.1  mrg 	break;
   1782  1.1  mrg 
   1783  1.1  mrg       default:
   1784  1.1  mrg 	gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
   1785  1.1  mrg     }
   1786  1.1  mrg 
   1787  1.1  mrg   if (!y)
   1788  1.1  mrg     return range_check (result, name);
   1789  1.1  mrg 
   1790  1.1  mrg   switch (y->ts.type)
   1791  1.1  mrg     {
   1792  1.1  mrg       case BT_INTEGER:
   1793  1.1  mrg 	mpfr_set_z (mpc_imagref (result->value.complex),
   1794  1.1  mrg 		    y->value.integer, GFC_RND_MODE);
   1795  1.1  mrg 	break;
   1796  1.1  mrg 
   1797  1.1  mrg       case BT_REAL:
   1798  1.1  mrg 	mpfr_set (mpc_imagref (result->value.complex),
   1799  1.1  mrg 		  y->value.real, GFC_RND_MODE);
   1800  1.1  mrg 	break;
   1801  1.1  mrg 
   1802  1.1  mrg       default:
   1803  1.1  mrg 	gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
   1804  1.1  mrg     }
   1805  1.1  mrg 
   1806  1.1  mrg   return range_check (result, name);
   1807  1.1  mrg }
   1808  1.1  mrg 
   1809  1.1  mrg 
   1810  1.1  mrg gfc_expr *
   1811  1.1  mrg gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
   1812  1.1  mrg {
   1813  1.1  mrg   int kind;
   1814  1.1  mrg 
   1815  1.1  mrg   kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
   1816  1.1  mrg   if (kind == -1)
   1817  1.1  mrg     return &gfc_bad_expr;
   1818  1.1  mrg 
   1819  1.1  mrg   return simplify_cmplx ("CMPLX", x, y, kind);
   1820  1.1  mrg }
   1821  1.1  mrg 
   1822  1.1  mrg 
   1823  1.1  mrg gfc_expr *
   1824  1.1  mrg gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
   1825  1.1  mrg {
   1826  1.1  mrg   int kind;
   1827  1.1  mrg 
   1828  1.1  mrg   if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
   1829  1.1  mrg     kind = gfc_default_complex_kind;
   1830  1.1  mrg   else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
   1831  1.1  mrg     kind = x->ts.kind;
   1832  1.1  mrg   else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
   1833  1.1  mrg     kind = y->ts.kind;
   1834  1.1  mrg   else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
   1835  1.1  mrg     kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
   1836  1.1  mrg   else
   1837  1.1  mrg     gcc_unreachable ();
   1838  1.1  mrg 
   1839  1.1  mrg   return simplify_cmplx ("COMPLEX", x, y, kind);
   1840  1.1  mrg }
   1841  1.1  mrg 
   1842  1.1  mrg 
   1843  1.1  mrg gfc_expr *
   1844  1.1  mrg gfc_simplify_conjg (gfc_expr *e)
   1845  1.1  mrg {
   1846  1.1  mrg   gfc_expr *result;
   1847  1.1  mrg 
   1848  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   1849  1.1  mrg     return NULL;
   1850  1.1  mrg 
   1851  1.1  mrg   result = gfc_copy_expr (e);
   1852  1.1  mrg   mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
   1853  1.1  mrg 
   1854  1.1  mrg   return range_check (result, "CONJG");
   1855  1.1  mrg }
   1856  1.1  mrg 
   1857  1.1  mrg 
   1858  1.1  mrg /* Simplify atan2d (x) where the unit is degree.  */
   1859  1.1  mrg 
   1860  1.1  mrg gfc_expr *
   1861  1.1  mrg gfc_simplify_atan2d (gfc_expr *y, gfc_expr *x)
   1862  1.1  mrg {
   1863  1.1  mrg   gfc_expr *result;
   1864  1.1  mrg 
   1865  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   1866  1.1  mrg     return NULL;
   1867  1.1  mrg 
   1868  1.1  mrg   if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
   1869  1.1  mrg     {
   1870  1.1  mrg       gfc_error ("If first argument of ATAN2D at %L is zero, then the "
   1871  1.1  mrg 		 "second argument must not be zero", &y->where);
   1872  1.1  mrg       return &gfc_bad_expr;
   1873  1.1  mrg     }
   1874  1.1  mrg 
   1875  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1876  1.1  mrg   mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
   1877  1.1  mrg   rad2deg (result->value.real);
   1878  1.1  mrg 
   1879  1.1  mrg   return range_check (result, "ATAN2D");
   1880  1.1  mrg }
   1881  1.1  mrg 
   1882  1.1  mrg 
   1883  1.1  mrg gfc_expr *
   1884  1.1  mrg gfc_simplify_cos (gfc_expr *x)
   1885  1.1  mrg {
   1886  1.1  mrg   gfc_expr *result;
   1887  1.1  mrg 
   1888  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1889  1.1  mrg     return NULL;
   1890  1.1  mrg 
   1891  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1892  1.1  mrg 
   1893  1.1  mrg   switch (x->ts.type)
   1894  1.1  mrg     {
   1895  1.1  mrg       case BT_REAL:
   1896  1.1  mrg 	mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
   1897  1.1  mrg 	break;
   1898  1.1  mrg 
   1899  1.1  mrg       case BT_COMPLEX:
   1900  1.1  mrg 	gfc_set_model_kind (x->ts.kind);
   1901  1.1  mrg 	mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   1902  1.1  mrg 	break;
   1903  1.1  mrg 
   1904  1.1  mrg       default:
   1905  1.1  mrg 	gfc_internal_error ("in gfc_simplify_cos(): Bad type");
   1906  1.1  mrg     }
   1907  1.1  mrg 
   1908  1.1  mrg   return range_check (result, "COS");
   1909  1.1  mrg }
   1910  1.1  mrg 
   1911  1.1  mrg 
   1912  1.1  mrg static void
   1913  1.1  mrg deg2rad (mpfr_t x)
   1914  1.1  mrg {
   1915  1.1  mrg   mpfr_t d2r;
   1916  1.1  mrg 
   1917  1.1  mrg   mpfr_init (d2r);
   1918  1.1  mrg   mpfr_const_pi (d2r, GFC_RND_MODE);
   1919  1.1  mrg   mpfr_div_ui (d2r, d2r, 180, GFC_RND_MODE);
   1920  1.1  mrg   mpfr_mul (x, x, d2r, GFC_RND_MODE);
   1921  1.1  mrg   mpfr_clear (d2r);
   1922  1.1  mrg }
   1923  1.1  mrg 
   1924  1.1  mrg 
   1925  1.1  mrg /* Simplification routines for SIND, COSD, TAND.  */
   1926  1.1  mrg #include "trigd_fe.inc"
   1927  1.1  mrg 
   1928  1.1  mrg 
   1929  1.1  mrg /* Simplify COSD(X) where X has the unit of degree.  */
   1930  1.1  mrg 
   1931  1.1  mrg gfc_expr *
   1932  1.1  mrg gfc_simplify_cosd (gfc_expr *x)
   1933  1.1  mrg {
   1934  1.1  mrg   gfc_expr *result;
   1935  1.1  mrg 
   1936  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1937  1.1  mrg     return NULL;
   1938  1.1  mrg 
   1939  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1940  1.1  mrg   mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
   1941  1.1  mrg   simplify_cosd (result->value.real);
   1942  1.1  mrg 
   1943  1.1  mrg   return range_check (result, "COSD");
   1944  1.1  mrg }
   1945  1.1  mrg 
   1946  1.1  mrg 
   1947  1.1  mrg /* Simplify SIND(X) where X has the unit of degree.  */
   1948  1.1  mrg 
   1949  1.1  mrg gfc_expr *
   1950  1.1  mrg gfc_simplify_sind (gfc_expr *x)
   1951  1.1  mrg {
   1952  1.1  mrg   gfc_expr *result;
   1953  1.1  mrg 
   1954  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1955  1.1  mrg     return NULL;
   1956  1.1  mrg 
   1957  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1958  1.1  mrg   mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
   1959  1.1  mrg   simplify_sind (result->value.real);
   1960  1.1  mrg 
   1961  1.1  mrg   return range_check (result, "SIND");
   1962  1.1  mrg }
   1963  1.1  mrg 
   1964  1.1  mrg 
   1965  1.1  mrg /* Simplify TAND(X) where X has the unit of degree.  */
   1966  1.1  mrg 
   1967  1.1  mrg gfc_expr *
   1968  1.1  mrg gfc_simplify_tand (gfc_expr *x)
   1969  1.1  mrg {
   1970  1.1  mrg   gfc_expr *result;
   1971  1.1  mrg 
   1972  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1973  1.1  mrg     return NULL;
   1974  1.1  mrg 
   1975  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1976  1.1  mrg   mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
   1977  1.1  mrg   simplify_tand (result->value.real);
   1978  1.1  mrg 
   1979  1.1  mrg   return range_check (result, "TAND");
   1980  1.1  mrg }
   1981  1.1  mrg 
   1982  1.1  mrg 
   1983  1.1  mrg /* Simplify COTAND(X) where X has the unit of degree.  */
   1984  1.1  mrg 
   1985  1.1  mrg gfc_expr *
   1986  1.1  mrg gfc_simplify_cotand (gfc_expr *x)
   1987  1.1  mrg {
   1988  1.1  mrg   gfc_expr *result;
   1989  1.1  mrg 
   1990  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   1991  1.1  mrg     return NULL;
   1992  1.1  mrg 
   1993  1.1  mrg   /* Implement COTAND = -TAND(x+90).
   1994  1.1  mrg      TAND offers correct exact values for multiples of 30 degrees.
   1995  1.1  mrg      This implementation is also compatible with the behavior of some legacy
   1996  1.1  mrg      compilers.  Keep this consistent with gfc_conv_intrinsic_cotand.  */
   1997  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   1998  1.1  mrg   mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
   1999  1.1  mrg   mpfr_add_ui (result->value.real, result->value.real, 90, GFC_RND_MODE);
   2000  1.1  mrg   simplify_tand (result->value.real);
   2001  1.1  mrg   mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
   2002  1.1  mrg 
   2003  1.1  mrg   return range_check (result, "COTAND");
   2004  1.1  mrg }
   2005  1.1  mrg 
   2006  1.1  mrg 
   2007  1.1  mrg gfc_expr *
   2008  1.1  mrg gfc_simplify_cosh (gfc_expr *x)
   2009  1.1  mrg {
   2010  1.1  mrg   gfc_expr *result;
   2011  1.1  mrg 
   2012  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   2013  1.1  mrg     return NULL;
   2014  1.1  mrg 
   2015  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   2016  1.1  mrg 
   2017  1.1  mrg   switch (x->ts.type)
   2018  1.1  mrg     {
   2019  1.1  mrg       case BT_REAL:
   2020  1.1  mrg 	mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
   2021  1.1  mrg 	break;
   2022  1.1  mrg 
   2023  1.1  mrg       case BT_COMPLEX:
   2024  1.1  mrg 	mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   2025  1.1  mrg 	break;
   2026  1.1  mrg 
   2027  1.1  mrg       default:
   2028  1.1  mrg 	gcc_unreachable ();
   2029  1.1  mrg     }
   2030  1.1  mrg 
   2031  1.1  mrg   return range_check (result, "COSH");
   2032  1.1  mrg }
   2033  1.1  mrg 
   2034  1.1  mrg 
   2035  1.1  mrg gfc_expr *
   2036  1.1  mrg gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
   2037  1.1  mrg {
   2038  1.1  mrg   gfc_expr *result;
   2039  1.1  mrg   bool size_zero;
   2040  1.1  mrg 
   2041  1.1  mrg   size_zero = gfc_is_size_zero_array (mask);
   2042  1.1  mrg 
   2043  1.1  mrg   if (!(is_constant_array_expr (mask) || size_zero)
   2044  1.1  mrg       || !gfc_is_constant_expr (dim)
   2045  1.1  mrg       || !gfc_is_constant_expr (kind))
   2046  1.1  mrg     return NULL;
   2047  1.1  mrg 
   2048  1.1  mrg   result = transformational_result (mask, dim,
   2049  1.1  mrg 				    BT_INTEGER,
   2050  1.1  mrg 				    get_kind (BT_INTEGER, kind, "COUNT",
   2051  1.1  mrg 					      gfc_default_integer_kind),
   2052  1.1  mrg 				    &mask->where);
   2053  1.1  mrg 
   2054  1.1  mrg   init_result_expr (result, 0, NULL);
   2055  1.1  mrg 
   2056  1.1  mrg   if (size_zero)
   2057  1.1  mrg     return result;
   2058  1.1  mrg 
   2059  1.1  mrg   /* Passing MASK twice, once as data array, once as mask.
   2060  1.1  mrg      Whenever gfc_count is called, '1' is added to the result.  */
   2061  1.1  mrg   return !dim || mask->rank == 1 ?
   2062  1.1  mrg     simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
   2063  1.1  mrg     simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL);
   2064  1.1  mrg }
   2065  1.1  mrg 
   2066  1.1  mrg /* Simplification routine for cshift. This works by copying the array
   2067  1.1  mrg    expressions into a one-dimensional array, shuffling the values into another
   2068  1.1  mrg    one-dimensional array and creating the new array expression from this.  The
   2069  1.1  mrg    shuffling part is basically taken from the library routine.  */
   2070  1.1  mrg 
   2071  1.1  mrg gfc_expr *
   2072  1.1  mrg gfc_simplify_cshift (gfc_expr *array, gfc_expr *shift, gfc_expr *dim)
   2073  1.1  mrg {
   2074  1.1  mrg   gfc_expr *result;
   2075  1.1  mrg   int which;
   2076  1.1  mrg   gfc_expr **arrayvec, **resultvec;
   2077  1.1  mrg   gfc_expr **rptr, **sptr;
   2078  1.1  mrg   mpz_t size;
   2079  1.1  mrg   size_t arraysize, shiftsize, i;
   2080  1.1  mrg   gfc_constructor *array_ctor, *shift_ctor;
   2081  1.1  mrg   ssize_t *shiftvec, *hptr;
   2082  1.1  mrg   ssize_t shift_val, len;
   2083  1.1  mrg   ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
   2084  1.1  mrg     hs_ex[GFC_MAX_DIMENSIONS + 1],
   2085  1.1  mrg     hstride[GFC_MAX_DIMENSIONS], sstride[GFC_MAX_DIMENSIONS],
   2086  1.1  mrg     a_extent[GFC_MAX_DIMENSIONS], a_stride[GFC_MAX_DIMENSIONS],
   2087  1.1  mrg     h_extent[GFC_MAX_DIMENSIONS],
   2088  1.1  mrg     ss_ex[GFC_MAX_DIMENSIONS + 1];
   2089  1.1  mrg   ssize_t rsoffset;
   2090  1.1  mrg   int d, n;
   2091  1.1  mrg   bool continue_loop;
   2092  1.1  mrg   gfc_expr **src, **dest;
   2093  1.1  mrg 
   2094  1.1  mrg   if (!is_constant_array_expr (array))
   2095  1.1  mrg     return NULL;
   2096  1.1  mrg 
   2097  1.1  mrg   if (shift->rank > 0)
   2098  1.1  mrg     gfc_simplify_expr (shift, 1);
   2099  1.1  mrg 
   2100  1.1  mrg   if (!gfc_is_constant_expr (shift))
   2101  1.1  mrg     return NULL;
   2102  1.1  mrg 
   2103  1.1  mrg   /* Make dim zero-based.  */
   2104  1.1  mrg   if (dim)
   2105  1.1  mrg     {
   2106  1.1  mrg       if (!gfc_is_constant_expr (dim))
   2107  1.1  mrg 	return NULL;
   2108  1.1  mrg       which = mpz_get_si (dim->value.integer) - 1;
   2109  1.1  mrg     }
   2110  1.1  mrg   else
   2111  1.1  mrg     which = 0;
   2112  1.1  mrg 
   2113  1.1  mrg   if (array->shape == NULL)
   2114  1.1  mrg     return NULL;
   2115  1.1  mrg 
   2116  1.1  mrg   gfc_array_size (array, &size);
   2117  1.1  mrg   arraysize = mpz_get_ui (size);
   2118  1.1  mrg   mpz_clear (size);
   2119  1.1  mrg 
   2120  1.1  mrg   result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
   2121  1.1  mrg   result->shape = gfc_copy_shape (array->shape, array->rank);
   2122  1.1  mrg   result->rank = array->rank;
   2123  1.1  mrg   result->ts.u.derived = array->ts.u.derived;
   2124  1.1  mrg 
   2125  1.1  mrg   if (arraysize == 0)
   2126  1.1  mrg     return result;
   2127  1.1  mrg 
   2128  1.1  mrg   arrayvec = XCNEWVEC (gfc_expr *, arraysize);
   2129  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
   2130  1.1  mrg   for (i = 0; i < arraysize; i++)
   2131  1.1  mrg     {
   2132  1.1  mrg       arrayvec[i] = array_ctor->expr;
   2133  1.1  mrg       array_ctor = gfc_constructor_next (array_ctor);
   2134  1.1  mrg     }
   2135  1.1  mrg 
   2136  1.1  mrg   resultvec = XCNEWVEC (gfc_expr *, arraysize);
   2137  1.1  mrg 
   2138  1.1  mrg   sstride[0] = 0;
   2139  1.1  mrg   extent[0] = 1;
   2140  1.1  mrg   count[0] = 0;
   2141  1.1  mrg 
   2142  1.1  mrg   for (d=0; d < array->rank; d++)
   2143  1.1  mrg     {
   2144  1.1  mrg       a_extent[d] = mpz_get_si (array->shape[d]);
   2145  1.1  mrg       a_stride[d] = d == 0 ? 1 : a_stride[d-1] * a_extent[d-1];
   2146  1.1  mrg     }
   2147  1.1  mrg 
   2148  1.1  mrg   if (shift->rank > 0)
   2149  1.1  mrg     {
   2150  1.1  mrg       gfc_array_size (shift, &size);
   2151  1.1  mrg       shiftsize = mpz_get_ui (size);
   2152  1.1  mrg       mpz_clear (size);
   2153  1.1  mrg       shiftvec = XCNEWVEC (ssize_t, shiftsize);
   2154  1.1  mrg       shift_ctor = gfc_constructor_first (shift->value.constructor);
   2155  1.1  mrg       for (d = 0; d < shift->rank; d++)
   2156  1.1  mrg 	{
   2157  1.1  mrg 	  h_extent[d] = mpz_get_si (shift->shape[d]);
   2158  1.1  mrg 	  hstride[d] = d == 0 ? 1 : hstride[d-1] * h_extent[d-1];
   2159  1.1  mrg 	}
   2160  1.1  mrg     }
   2161  1.1  mrg   else
   2162  1.1  mrg     shiftvec = NULL;
   2163  1.1  mrg 
   2164  1.1  mrg   /* Shut up compiler */
   2165  1.1  mrg   len = 1;
   2166  1.1  mrg   rsoffset = 1;
   2167  1.1  mrg 
   2168  1.1  mrg   n = 0;
   2169  1.1  mrg   for (d=0; d < array->rank; d++)
   2170  1.1  mrg     {
   2171  1.1  mrg       if (d == which)
   2172  1.1  mrg 	{
   2173  1.1  mrg 	  rsoffset = a_stride[d];
   2174  1.1  mrg 	  len = a_extent[d];
   2175  1.1  mrg 	}
   2176  1.1  mrg       else
   2177  1.1  mrg 	{
   2178  1.1  mrg 	  count[n] = 0;
   2179  1.1  mrg 	  extent[n] = a_extent[d];
   2180  1.1  mrg 	  sstride[n] = a_stride[d];
   2181  1.1  mrg 	  ss_ex[n] = sstride[n] * extent[n];
   2182  1.1  mrg 	  if (shiftvec)
   2183  1.1  mrg 	    hs_ex[n] = hstride[n] * extent[n];
   2184  1.1  mrg 	  n++;
   2185  1.1  mrg 	}
   2186  1.1  mrg     }
   2187  1.1  mrg   ss_ex[n] = 0;
   2188  1.1  mrg   hs_ex[n] = 0;
   2189  1.1  mrg 
   2190  1.1  mrg   if (shiftvec)
   2191  1.1  mrg     {
   2192  1.1  mrg       for (i = 0; i < shiftsize; i++)
   2193  1.1  mrg 	{
   2194  1.1  mrg 	  ssize_t val;
   2195  1.1  mrg 	  val = mpz_get_si (shift_ctor->expr->value.integer);
   2196  1.1  mrg 	  val = val % len;
   2197  1.1  mrg 	  if (val < 0)
   2198  1.1  mrg 	    val += len;
   2199  1.1  mrg 	  shiftvec[i] = val;
   2200  1.1  mrg 	  shift_ctor = gfc_constructor_next (shift_ctor);
   2201  1.1  mrg 	}
   2202  1.1  mrg       shift_val = 0;
   2203  1.1  mrg     }
   2204  1.1  mrg   else
   2205  1.1  mrg     {
   2206  1.1  mrg       shift_val = mpz_get_si (shift->value.integer);
   2207  1.1  mrg       shift_val = shift_val % len;
   2208  1.1  mrg       if (shift_val < 0)
   2209  1.1  mrg 	shift_val += len;
   2210  1.1  mrg     }
   2211  1.1  mrg 
   2212  1.1  mrg   continue_loop = true;
   2213  1.1  mrg   d = array->rank;
   2214  1.1  mrg   rptr = resultvec;
   2215  1.1  mrg   sptr = arrayvec;
   2216  1.1  mrg   hptr = shiftvec;
   2217  1.1  mrg 
   2218  1.1  mrg   while (continue_loop)
   2219  1.1  mrg     {
   2220  1.1  mrg       ssize_t sh;
   2221  1.1  mrg       if (shiftvec)
   2222  1.1  mrg 	sh = *hptr;
   2223  1.1  mrg       else
   2224  1.1  mrg 	sh = shift_val;
   2225  1.1  mrg 
   2226  1.1  mrg       src = &sptr[sh * rsoffset];
   2227  1.1  mrg       dest = rptr;
   2228  1.1  mrg       for (n = 0; n < len - sh; n++)
   2229  1.1  mrg 	{
   2230  1.1  mrg 	  *dest = *src;
   2231  1.1  mrg 	  dest += rsoffset;
   2232  1.1  mrg 	  src += rsoffset;
   2233  1.1  mrg 	}
   2234  1.1  mrg       src = sptr;
   2235  1.1  mrg       for ( n = 0; n < sh; n++)
   2236  1.1  mrg 	{
   2237  1.1  mrg 	  *dest = *src;
   2238  1.1  mrg 	  dest += rsoffset;
   2239  1.1  mrg 	  src += rsoffset;
   2240  1.1  mrg 	}
   2241  1.1  mrg       rptr += sstride[0];
   2242  1.1  mrg       sptr += sstride[0];
   2243  1.1  mrg       if (shiftvec)
   2244  1.1  mrg 	hptr += hstride[0];
   2245  1.1  mrg       count[0]++;
   2246  1.1  mrg       n = 0;
   2247  1.1  mrg       while (count[n] == extent[n])
   2248  1.1  mrg 	{
   2249  1.1  mrg 	  count[n] = 0;
   2250  1.1  mrg 	  rptr -= ss_ex[n];
   2251  1.1  mrg 	  sptr -= ss_ex[n];
   2252  1.1  mrg 	  if (shiftvec)
   2253  1.1  mrg 	    hptr -= hs_ex[n];
   2254  1.1  mrg 	  n++;
   2255  1.1  mrg 	  if (n >= d - 1)
   2256  1.1  mrg 	    {
   2257  1.1  mrg 	      continue_loop = false;
   2258  1.1  mrg 	      break;
   2259  1.1  mrg 	    }
   2260  1.1  mrg 	  else
   2261  1.1  mrg 	    {
   2262  1.1  mrg 	      count[n]++;
   2263  1.1  mrg 	      rptr += sstride[n];
   2264  1.1  mrg 	      sptr += sstride[n];
   2265  1.1  mrg 	      if (shiftvec)
   2266  1.1  mrg 		hptr += hstride[n];
   2267  1.1  mrg 	    }
   2268  1.1  mrg 	}
   2269  1.1  mrg     }
   2270  1.1  mrg 
   2271  1.1  mrg   for (i = 0; i < arraysize; i++)
   2272  1.1  mrg     {
   2273  1.1  mrg       gfc_constructor_append_expr (&result->value.constructor,
   2274  1.1  mrg 				   gfc_copy_expr (resultvec[i]),
   2275  1.1  mrg 				   NULL);
   2276  1.1  mrg     }
   2277  1.1  mrg   return result;
   2278  1.1  mrg }
   2279  1.1  mrg 
   2280  1.1  mrg 
   2281  1.1  mrg gfc_expr *
   2282  1.1  mrg gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
   2283  1.1  mrg {
   2284  1.1  mrg   return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
   2285  1.1  mrg }
   2286  1.1  mrg 
   2287  1.1  mrg 
   2288  1.1  mrg gfc_expr *
   2289  1.1  mrg gfc_simplify_dble (gfc_expr *e)
   2290  1.1  mrg {
   2291  1.1  mrg   gfc_expr *result = NULL;
   2292  1.1  mrg   int tmp1, tmp2;
   2293  1.1  mrg 
   2294  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   2295  1.1  mrg     return NULL;
   2296  1.1  mrg 
   2297  1.1  mrg   /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
   2298  1.1  mrg      warnings.  */
   2299  1.1  mrg   tmp1 = warn_conversion;
   2300  1.1  mrg   tmp2 = warn_conversion_extra;
   2301  1.1  mrg   warn_conversion = warn_conversion_extra = 0;
   2302  1.1  mrg 
   2303  1.1  mrg   result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
   2304  1.1  mrg 
   2305  1.1  mrg   warn_conversion = tmp1;
   2306  1.1  mrg   warn_conversion_extra = tmp2;
   2307  1.1  mrg 
   2308  1.1  mrg   if (result == &gfc_bad_expr)
   2309  1.1  mrg     return &gfc_bad_expr;
   2310  1.1  mrg 
   2311  1.1  mrg   return range_check (result, "DBLE");
   2312  1.1  mrg }
   2313  1.1  mrg 
   2314  1.1  mrg 
   2315  1.1  mrg gfc_expr *
   2316  1.1  mrg gfc_simplify_digits (gfc_expr *x)
   2317  1.1  mrg {
   2318  1.1  mrg   int i, digits;
   2319  1.1  mrg 
   2320  1.1  mrg   i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
   2321  1.1  mrg 
   2322  1.1  mrg   switch (x->ts.type)
   2323  1.1  mrg     {
   2324  1.1  mrg       case BT_INTEGER:
   2325  1.1  mrg 	digits = gfc_integer_kinds[i].digits;
   2326  1.1  mrg 	break;
   2327  1.1  mrg 
   2328  1.1  mrg       case BT_REAL:
   2329  1.1  mrg       case BT_COMPLEX:
   2330  1.1  mrg 	digits = gfc_real_kinds[i].digits;
   2331  1.1  mrg 	break;
   2332  1.1  mrg 
   2333  1.1  mrg       default:
   2334  1.1  mrg 	gcc_unreachable ();
   2335  1.1  mrg     }
   2336  1.1  mrg 
   2337  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
   2338  1.1  mrg }
   2339  1.1  mrg 
   2340  1.1  mrg 
   2341  1.1  mrg gfc_expr *
   2342  1.1  mrg gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
   2343  1.1  mrg {
   2344  1.1  mrg   gfc_expr *result;
   2345  1.1  mrg   int kind;
   2346  1.1  mrg 
   2347  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   2348  1.1  mrg     return NULL;
   2349  1.1  mrg 
   2350  1.1  mrg   kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
   2351  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
   2352  1.1  mrg 
   2353  1.1  mrg   switch (x->ts.type)
   2354  1.1  mrg     {
   2355  1.1  mrg       case BT_INTEGER:
   2356  1.1  mrg 	if (mpz_cmp (x->value.integer, y->value.integer) > 0)
   2357  1.1  mrg 	  mpz_sub (result->value.integer, x->value.integer, y->value.integer);
   2358  1.1  mrg 	else
   2359  1.1  mrg 	  mpz_set_ui (result->value.integer, 0);
   2360  1.1  mrg 
   2361  1.1  mrg 	break;
   2362  1.1  mrg 
   2363  1.1  mrg       case BT_REAL:
   2364  1.1  mrg 	if (mpfr_cmp (x->value.real, y->value.real) > 0)
   2365  1.1  mrg 	  mpfr_sub (result->value.real, x->value.real, y->value.real,
   2366  1.1  mrg 		    GFC_RND_MODE);
   2367  1.1  mrg 	else
   2368  1.1  mrg 	  mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
   2369  1.1  mrg 
   2370  1.1  mrg 	break;
   2371  1.1  mrg 
   2372  1.1  mrg       default:
   2373  1.1  mrg 	gfc_internal_error ("gfc_simplify_dim(): Bad type");
   2374  1.1  mrg     }
   2375  1.1  mrg 
   2376  1.1  mrg   return range_check (result, "DIM");
   2377  1.1  mrg }
   2378  1.1  mrg 
   2379  1.1  mrg 
   2380  1.1  mrg gfc_expr*
   2381  1.1  mrg gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
   2382  1.1  mrg {
   2383  1.1  mrg   /* If vector_a is a zero-sized array, the result is 0 for INTEGER,
   2384  1.1  mrg      REAL, and COMPLEX types and .false. for LOGICAL.  */
   2385  1.1  mrg   if (vector_a->shape && mpz_get_si (vector_a->shape[0]) == 0)
   2386  1.1  mrg     {
   2387  1.1  mrg       if (vector_a->ts.type == BT_LOGICAL)
   2388  1.1  mrg 	return gfc_get_logical_expr (gfc_default_logical_kind, NULL, false);
   2389  1.1  mrg       else
   2390  1.1  mrg 	return gfc_get_int_expr (gfc_default_integer_kind, NULL, 0);
   2391  1.1  mrg     }
   2392  1.1  mrg 
   2393  1.1  mrg   if (!is_constant_array_expr (vector_a)
   2394  1.1  mrg       || !is_constant_array_expr (vector_b))
   2395  1.1  mrg     return NULL;
   2396  1.1  mrg 
   2397  1.1  mrg   return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0, true);
   2398  1.1  mrg }
   2399  1.1  mrg 
   2400  1.1  mrg 
   2401  1.1  mrg gfc_expr *
   2402  1.1  mrg gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
   2403  1.1  mrg {
   2404  1.1  mrg   gfc_expr *a1, *a2, *result;
   2405  1.1  mrg 
   2406  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   2407  1.1  mrg     return NULL;
   2408  1.1  mrg 
   2409  1.1  mrg   a1 = gfc_real2real (x, gfc_default_double_kind);
   2410  1.1  mrg   a2 = gfc_real2real (y, gfc_default_double_kind);
   2411  1.1  mrg 
   2412  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
   2413  1.1  mrg   mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
   2414  1.1  mrg 
   2415  1.1  mrg   gfc_free_expr (a2);
   2416  1.1  mrg   gfc_free_expr (a1);
   2417  1.1  mrg 
   2418  1.1  mrg   return range_check (result, "DPROD");
   2419  1.1  mrg }
   2420  1.1  mrg 
   2421  1.1  mrg 
   2422  1.1  mrg static gfc_expr *
   2423  1.1  mrg simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg,
   2424  1.1  mrg 		      bool right)
   2425  1.1  mrg {
   2426  1.1  mrg   gfc_expr *result;
   2427  1.1  mrg   int i, k, size, shift;
   2428  1.1  mrg 
   2429  1.1  mrg   if (arg1->expr_type != EXPR_CONSTANT || arg2->expr_type != EXPR_CONSTANT
   2430  1.1  mrg       || shiftarg->expr_type != EXPR_CONSTANT)
   2431  1.1  mrg     return NULL;
   2432  1.1  mrg 
   2433  1.1  mrg   k = gfc_validate_kind (BT_INTEGER, arg1->ts.kind, false);
   2434  1.1  mrg   size = gfc_integer_kinds[k].bit_size;
   2435  1.1  mrg 
   2436  1.1  mrg   gfc_extract_int (shiftarg, &shift);
   2437  1.1  mrg 
   2438  1.1  mrg   /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT).  */
   2439  1.1  mrg   if (right)
   2440  1.1  mrg     shift = size - shift;
   2441  1.1  mrg 
   2442  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, arg1->ts.kind, &arg1->where);
   2443  1.1  mrg   mpz_set_ui (result->value.integer, 0);
   2444  1.1  mrg 
   2445  1.1  mrg   for (i = 0; i < shift; i++)
   2446  1.1  mrg     if (mpz_tstbit (arg2->value.integer, size - shift + i))
   2447  1.1  mrg       mpz_setbit (result->value.integer, i);
   2448  1.1  mrg 
   2449  1.1  mrg   for (i = 0; i < size - shift; i++)
   2450  1.1  mrg     if (mpz_tstbit (arg1->value.integer, i))
   2451  1.1  mrg       mpz_setbit (result->value.integer, shift + i);
   2452  1.1  mrg 
   2453  1.1  mrg   /* Convert to a signed value.  */
   2454  1.1  mrg   gfc_convert_mpz_to_signed (result->value.integer, size);
   2455  1.1  mrg 
   2456  1.1  mrg   return result;
   2457  1.1  mrg }
   2458  1.1  mrg 
   2459  1.1  mrg 
   2460  1.1  mrg gfc_expr *
   2461  1.1  mrg gfc_simplify_dshiftr (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
   2462  1.1  mrg {
   2463  1.1  mrg   return simplify_dshift (arg1, arg2, shiftarg, true);
   2464  1.1  mrg }
   2465  1.1  mrg 
   2466  1.1  mrg 
   2467  1.1  mrg gfc_expr *
   2468  1.1  mrg gfc_simplify_dshiftl (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
   2469  1.1  mrg {
   2470  1.1  mrg   return simplify_dshift (arg1, arg2, shiftarg, false);
   2471  1.1  mrg }
   2472  1.1  mrg 
   2473  1.1  mrg 
   2474  1.1  mrg gfc_expr *
   2475  1.1  mrg gfc_simplify_eoshift (gfc_expr *array, gfc_expr *shift, gfc_expr *boundary,
   2476  1.1  mrg 		   gfc_expr *dim)
   2477  1.1  mrg {
   2478  1.1  mrg   bool temp_boundary;
   2479  1.1  mrg   gfc_expr *bnd;
   2480  1.1  mrg   gfc_expr *result;
   2481  1.1  mrg   int which;
   2482  1.1  mrg   gfc_expr **arrayvec, **resultvec;
   2483  1.1  mrg   gfc_expr **rptr, **sptr;
   2484  1.1  mrg   mpz_t size;
   2485  1.1  mrg   size_t arraysize, i;
   2486  1.1  mrg   gfc_constructor *array_ctor, *shift_ctor, *bnd_ctor;
   2487  1.1  mrg   ssize_t shift_val, len;
   2488  1.1  mrg   ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
   2489  1.1  mrg     sstride[GFC_MAX_DIMENSIONS], a_extent[GFC_MAX_DIMENSIONS],
   2490  1.1  mrg     a_stride[GFC_MAX_DIMENSIONS], ss_ex[GFC_MAX_DIMENSIONS + 1];
   2491  1.1  mrg   ssize_t rsoffset;
   2492  1.1  mrg   int d, n;
   2493  1.1  mrg   bool continue_loop;
   2494  1.1  mrg   gfc_expr **src, **dest;
   2495  1.1  mrg   size_t s_len;
   2496  1.1  mrg 
   2497  1.1  mrg   if (!is_constant_array_expr (array))
   2498  1.1  mrg     return NULL;
   2499  1.1  mrg 
   2500  1.1  mrg   if (shift->rank > 0)
   2501  1.1  mrg     gfc_simplify_expr (shift, 1);
   2502  1.1  mrg 
   2503  1.1  mrg   if (!gfc_is_constant_expr (shift))
   2504  1.1  mrg     return NULL;
   2505  1.1  mrg 
   2506  1.1  mrg   if (boundary)
   2507  1.1  mrg     {
   2508  1.1  mrg       if (boundary->rank > 0)
   2509  1.1  mrg 	gfc_simplify_expr (boundary, 1);
   2510  1.1  mrg 
   2511  1.1  mrg       if (!gfc_is_constant_expr (boundary))
   2512  1.1  mrg 	  return NULL;
   2513  1.1  mrg     }
   2514  1.1  mrg 
   2515  1.1  mrg   if (dim)
   2516  1.1  mrg     {
   2517  1.1  mrg       if (!gfc_is_constant_expr (dim))
   2518  1.1  mrg 	return NULL;
   2519  1.1  mrg       which = mpz_get_si (dim->value.integer) - 1;
   2520  1.1  mrg     }
   2521  1.1  mrg   else
   2522  1.1  mrg     which = 0;
   2523  1.1  mrg 
   2524  1.1  mrg   s_len = 0;
   2525  1.1  mrg   if (boundary == NULL)
   2526  1.1  mrg     {
   2527  1.1  mrg       temp_boundary = true;
   2528  1.1  mrg       switch (array->ts.type)
   2529  1.1  mrg 	{
   2530  1.1  mrg 
   2531  1.1  mrg 	case BT_INTEGER:
   2532  1.1  mrg 	  bnd = gfc_get_int_expr (array->ts.kind, NULL, 0);
   2533  1.1  mrg 	  break;
   2534  1.1  mrg 
   2535  1.1  mrg 	case BT_LOGICAL:
   2536  1.1  mrg 	  bnd = gfc_get_logical_expr (array->ts.kind, NULL, 0);
   2537  1.1  mrg 	  break;
   2538  1.1  mrg 
   2539  1.1  mrg 	case BT_REAL:
   2540  1.1  mrg 	  bnd = gfc_get_constant_expr (array->ts.type, array->ts.kind, &gfc_current_locus);
   2541  1.1  mrg 	  mpfr_set_ui (bnd->value.real, 0, GFC_RND_MODE);
   2542  1.1  mrg 	  break;
   2543  1.1  mrg 
   2544  1.1  mrg 	case BT_COMPLEX:
   2545  1.1  mrg 	  bnd = gfc_get_constant_expr (array->ts.type, array->ts.kind, &gfc_current_locus);
   2546  1.1  mrg 	  mpc_set_ui (bnd->value.complex, 0, GFC_RND_MODE);
   2547  1.1  mrg 	  break;
   2548  1.1  mrg 
   2549  1.1  mrg 	case BT_CHARACTER:
   2550  1.1  mrg 	  s_len = mpz_get_ui (array->ts.u.cl->length->value.integer);
   2551  1.1  mrg 	  bnd = gfc_get_character_expr (array->ts.kind, &gfc_current_locus, NULL, s_len);
   2552  1.1  mrg 	  break;
   2553  1.1  mrg 
   2554  1.1  mrg 	default:
   2555  1.1  mrg 	  gcc_unreachable();
   2556  1.1  mrg 
   2557  1.1  mrg 	}
   2558  1.1  mrg     }
   2559  1.1  mrg   else
   2560  1.1  mrg     {
   2561  1.1  mrg       temp_boundary = false;
   2562  1.1  mrg       bnd = boundary;
   2563  1.1  mrg     }
   2564  1.1  mrg 
   2565  1.1  mrg   gfc_array_size (array, &size);
   2566  1.1  mrg   arraysize = mpz_get_ui (size);
   2567  1.1  mrg   mpz_clear (size);
   2568  1.1  mrg 
   2569  1.1  mrg   result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
   2570  1.1  mrg   result->shape = gfc_copy_shape (array->shape, array->rank);
   2571  1.1  mrg   result->rank = array->rank;
   2572  1.1  mrg   result->ts = array->ts;
   2573  1.1  mrg 
   2574  1.1  mrg   if (arraysize == 0)
   2575  1.1  mrg     goto final;
   2576  1.1  mrg 
   2577  1.1  mrg   if (array->shape == NULL)
   2578  1.1  mrg     goto final;
   2579  1.1  mrg 
   2580  1.1  mrg   arrayvec = XCNEWVEC (gfc_expr *, arraysize);
   2581  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
   2582  1.1  mrg   for (i = 0; i < arraysize; i++)
   2583  1.1  mrg     {
   2584  1.1  mrg       arrayvec[i] = array_ctor->expr;
   2585  1.1  mrg       array_ctor = gfc_constructor_next (array_ctor);
   2586  1.1  mrg     }
   2587  1.1  mrg 
   2588  1.1  mrg   resultvec = XCNEWVEC (gfc_expr *, arraysize);
   2589  1.1  mrg 
   2590  1.1  mrg   extent[0] = 1;
   2591  1.1  mrg   count[0] = 0;
   2592  1.1  mrg 
   2593  1.1  mrg   for (d=0; d < array->rank; d++)
   2594  1.1  mrg     {
   2595  1.1  mrg       a_extent[d] = mpz_get_si (array->shape[d]);
   2596  1.1  mrg       a_stride[d] = d == 0 ? 1 : a_stride[d-1] * a_extent[d-1];
   2597  1.1  mrg     }
   2598  1.1  mrg 
   2599  1.1  mrg   if (shift->rank > 0)
   2600  1.1  mrg     {
   2601  1.1  mrg       shift_ctor = gfc_constructor_first (shift->value.constructor);
   2602  1.1  mrg       shift_val = 0;
   2603  1.1  mrg     }
   2604  1.1  mrg   else
   2605  1.1  mrg     {
   2606  1.1  mrg       shift_ctor = NULL;
   2607  1.1  mrg       shift_val = mpz_get_si (shift->value.integer);
   2608  1.1  mrg     }
   2609  1.1  mrg 
   2610  1.1  mrg   if (bnd->rank > 0)
   2611  1.1  mrg     bnd_ctor = gfc_constructor_first (bnd->value.constructor);
   2612  1.1  mrg   else
   2613  1.1  mrg     bnd_ctor = NULL;
   2614  1.1  mrg 
   2615  1.1  mrg   /* Shut up compiler */
   2616  1.1  mrg   len = 1;
   2617  1.1  mrg   rsoffset = 1;
   2618  1.1  mrg 
   2619  1.1  mrg   n = 0;
   2620  1.1  mrg   for (d=0; d < array->rank; d++)
   2621  1.1  mrg     {
   2622  1.1  mrg       if (d == which)
   2623  1.1  mrg 	{
   2624  1.1  mrg 	  rsoffset = a_stride[d];
   2625  1.1  mrg 	  len = a_extent[d];
   2626  1.1  mrg 	}
   2627  1.1  mrg       else
   2628  1.1  mrg 	{
   2629  1.1  mrg 	  count[n] = 0;
   2630  1.1  mrg 	  extent[n] = a_extent[d];
   2631  1.1  mrg 	  sstride[n] = a_stride[d];
   2632  1.1  mrg 	  ss_ex[n] = sstride[n] * extent[n];
   2633  1.1  mrg 	  n++;
   2634  1.1  mrg 	}
   2635  1.1  mrg     }
   2636  1.1  mrg   ss_ex[n] = 0;
   2637  1.1  mrg 
   2638  1.1  mrg   continue_loop = true;
   2639  1.1  mrg   d = array->rank;
   2640  1.1  mrg   rptr = resultvec;
   2641  1.1  mrg   sptr = arrayvec;
   2642  1.1  mrg 
   2643  1.1  mrg   while (continue_loop)
   2644  1.1  mrg     {
   2645  1.1  mrg       ssize_t sh, delta;
   2646  1.1  mrg 
   2647  1.1  mrg       if (shift_ctor)
   2648  1.1  mrg 	sh = mpz_get_si (shift_ctor->expr->value.integer);
   2649  1.1  mrg       else
   2650  1.1  mrg 	sh = shift_val;
   2651  1.1  mrg 
   2652  1.1  mrg       if (( sh >= 0 ? sh : -sh ) > len)
   2653  1.1  mrg 	{
   2654  1.1  mrg 	  delta = len;
   2655  1.1  mrg 	  sh = len;
   2656  1.1  mrg 	}
   2657  1.1  mrg       else
   2658  1.1  mrg 	delta = (sh >= 0) ? sh: -sh;
   2659  1.1  mrg 
   2660  1.1  mrg       if (sh > 0)
   2661  1.1  mrg         {
   2662  1.1  mrg           src = &sptr[delta * rsoffset];
   2663  1.1  mrg           dest = rptr;
   2664  1.1  mrg         }
   2665  1.1  mrg       else
   2666  1.1  mrg         {
   2667  1.1  mrg           src = sptr;
   2668  1.1  mrg           dest = &rptr[delta * rsoffset];
   2669  1.1  mrg         }
   2670  1.1  mrg 
   2671  1.1  mrg       for (n = 0; n < len - delta; n++)
   2672  1.1  mrg 	{
   2673  1.1  mrg 	  *dest = *src;
   2674  1.1  mrg 	  dest += rsoffset;
   2675  1.1  mrg 	  src += rsoffset;
   2676  1.1  mrg 	}
   2677  1.1  mrg 
   2678  1.1  mrg       if (sh < 0)
   2679  1.1  mrg         dest = rptr;
   2680  1.1  mrg 
   2681  1.1  mrg       n = delta;
   2682  1.1  mrg 
   2683  1.1  mrg       if (bnd_ctor)
   2684  1.1  mrg 	{
   2685  1.1  mrg 	  while (n--)
   2686  1.1  mrg 	    {
   2687  1.1  mrg 	      *dest = gfc_copy_expr (bnd_ctor->expr);
   2688  1.1  mrg 	      dest += rsoffset;
   2689  1.1  mrg 	    }
   2690  1.1  mrg 	}
   2691  1.1  mrg       else
   2692  1.1  mrg 	{
   2693  1.1  mrg 	  while (n--)
   2694  1.1  mrg 	    {
   2695  1.1  mrg 	      *dest = gfc_copy_expr (bnd);
   2696  1.1  mrg 	      dest += rsoffset;
   2697  1.1  mrg 	    }
   2698  1.1  mrg 	}
   2699  1.1  mrg       rptr += sstride[0];
   2700  1.1  mrg       sptr += sstride[0];
   2701  1.1  mrg       if (shift_ctor)
   2702  1.1  mrg 	shift_ctor =  gfc_constructor_next (shift_ctor);
   2703  1.1  mrg 
   2704  1.1  mrg       if (bnd_ctor)
   2705  1.1  mrg 	bnd_ctor = gfc_constructor_next (bnd_ctor);
   2706  1.1  mrg 
   2707  1.1  mrg       count[0]++;
   2708  1.1  mrg       n = 0;
   2709  1.1  mrg       while (count[n] == extent[n])
   2710  1.1  mrg 	{
   2711  1.1  mrg 	  count[n] = 0;
   2712  1.1  mrg 	  rptr -= ss_ex[n];
   2713  1.1  mrg 	  sptr -= ss_ex[n];
   2714  1.1  mrg 	  n++;
   2715  1.1  mrg 	  if (n >= d - 1)
   2716  1.1  mrg 	    {
   2717  1.1  mrg 	      continue_loop = false;
   2718  1.1  mrg 	      break;
   2719  1.1  mrg 	    }
   2720  1.1  mrg 	  else
   2721  1.1  mrg 	    {
   2722  1.1  mrg 	      count[n]++;
   2723  1.1  mrg 	      rptr += sstride[n];
   2724  1.1  mrg 	      sptr += sstride[n];
   2725  1.1  mrg 	    }
   2726  1.1  mrg 	}
   2727  1.1  mrg     }
   2728  1.1  mrg 
   2729  1.1  mrg   for (i = 0; i < arraysize; i++)
   2730  1.1  mrg     {
   2731  1.1  mrg       gfc_constructor_append_expr (&result->value.constructor,
   2732  1.1  mrg 				   gfc_copy_expr (resultvec[i]),
   2733  1.1  mrg 				   NULL);
   2734  1.1  mrg     }
   2735  1.1  mrg 
   2736  1.1  mrg  final:
   2737  1.1  mrg   if (temp_boundary)
   2738  1.1  mrg     gfc_free_expr (bnd);
   2739  1.1  mrg 
   2740  1.1  mrg   return result;
   2741  1.1  mrg }
   2742  1.1  mrg 
   2743  1.1  mrg gfc_expr *
   2744  1.1  mrg gfc_simplify_erf (gfc_expr *x)
   2745  1.1  mrg {
   2746  1.1  mrg   gfc_expr *result;
   2747  1.1  mrg 
   2748  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   2749  1.1  mrg     return NULL;
   2750  1.1  mrg 
   2751  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   2752  1.1  mrg   mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
   2753  1.1  mrg 
   2754  1.1  mrg   return range_check (result, "ERF");
   2755  1.1  mrg }
   2756  1.1  mrg 
   2757  1.1  mrg 
   2758  1.1  mrg gfc_expr *
   2759  1.1  mrg gfc_simplify_erfc (gfc_expr *x)
   2760  1.1  mrg {
   2761  1.1  mrg   gfc_expr *result;
   2762  1.1  mrg 
   2763  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   2764  1.1  mrg     return NULL;
   2765  1.1  mrg 
   2766  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   2767  1.1  mrg   mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
   2768  1.1  mrg 
   2769  1.1  mrg   return range_check (result, "ERFC");
   2770  1.1  mrg }
   2771  1.1  mrg 
   2772  1.1  mrg 
   2773  1.1  mrg /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2).  */
   2774  1.1  mrg 
   2775  1.1  mrg #define MAX_ITER 200
   2776  1.1  mrg #define ARG_LIMIT 12
   2777  1.1  mrg 
   2778  1.1  mrg /* Calculate ERFC_SCALED directly by its definition:
   2779  1.1  mrg 
   2780  1.1  mrg      ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
   2781  1.1  mrg 
   2782  1.1  mrg    using a large precision for intermediate results.  This is used for all
   2783  1.1  mrg    but large values of the argument.  */
   2784  1.1  mrg static void
   2785  1.1  mrg fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
   2786  1.1  mrg {
   2787  1.1  mrg   mpfr_prec_t prec;
   2788  1.1  mrg   mpfr_t a, b;
   2789  1.1  mrg 
   2790  1.1  mrg   prec = mpfr_get_default_prec ();
   2791  1.1  mrg   mpfr_set_default_prec (10 * prec);
   2792  1.1  mrg 
   2793  1.1  mrg   mpfr_init (a);
   2794  1.1  mrg   mpfr_init (b);
   2795  1.1  mrg 
   2796  1.1  mrg   mpfr_set (a, arg, GFC_RND_MODE);
   2797  1.1  mrg   mpfr_sqr (b, a, GFC_RND_MODE);
   2798  1.1  mrg   mpfr_exp (b, b, GFC_RND_MODE);
   2799  1.1  mrg   mpfr_erfc (a, a, GFC_RND_MODE);
   2800  1.1  mrg   mpfr_mul (a, a, b, GFC_RND_MODE);
   2801  1.1  mrg 
   2802  1.1  mrg   mpfr_set (res, a, GFC_RND_MODE);
   2803  1.1  mrg   mpfr_set_default_prec (prec);
   2804  1.1  mrg 
   2805  1.1  mrg   mpfr_clear (a);
   2806  1.1  mrg   mpfr_clear (b);
   2807  1.1  mrg }
   2808  1.1  mrg 
   2809  1.1  mrg /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
   2810  1.1  mrg 
   2811  1.1  mrg     ERFC_SCALED(x) = 1 / (x * sqrt(pi))
   2812  1.1  mrg                      * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
   2813  1.1  mrg                                           / (2 * x**2)**n)
   2814  1.1  mrg 
   2815  1.1  mrg   This is used for large values of the argument.  Intermediate calculations
   2816  1.1  mrg   are performed with twice the precision.  We don't do a fixed number of
   2817  1.1  mrg   iterations of the sum, but stop when it has converged to the required
   2818  1.1  mrg   precision.  */
   2819  1.1  mrg static void
   2820  1.1  mrg asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
   2821  1.1  mrg {
   2822  1.1  mrg   mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
   2823  1.1  mrg   mpz_t num;
   2824  1.1  mrg   mpfr_prec_t prec;
   2825  1.1  mrg   unsigned i;
   2826  1.1  mrg 
   2827  1.1  mrg   prec = mpfr_get_default_prec ();
   2828  1.1  mrg   mpfr_set_default_prec (2 * prec);
   2829  1.1  mrg 
   2830  1.1  mrg   mpfr_init (sum);
   2831  1.1  mrg   mpfr_init (x);
   2832  1.1  mrg   mpfr_init (u);
   2833  1.1  mrg   mpfr_init (v);
   2834  1.1  mrg   mpfr_init (w);
   2835  1.1  mrg   mpz_init (num);
   2836  1.1  mrg 
   2837  1.1  mrg   mpfr_init (oldsum);
   2838  1.1  mrg   mpfr_init (sumtrunc);
   2839  1.1  mrg   mpfr_set_prec (oldsum, prec);
   2840  1.1  mrg   mpfr_set_prec (sumtrunc, prec);
   2841  1.1  mrg 
   2842  1.1  mrg   mpfr_set (x, arg, GFC_RND_MODE);
   2843  1.1  mrg   mpfr_set_ui (sum, 1, GFC_RND_MODE);
   2844  1.1  mrg   mpz_set_ui (num, 1);
   2845  1.1  mrg 
   2846  1.1  mrg   mpfr_set (u, x, GFC_RND_MODE);
   2847  1.1  mrg   mpfr_sqr (u, u, GFC_RND_MODE);
   2848  1.1  mrg   mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
   2849  1.1  mrg   mpfr_pow_si (u, u, -1, GFC_RND_MODE);
   2850  1.1  mrg 
   2851  1.1  mrg   for (i = 1; i < MAX_ITER; i++)
   2852  1.1  mrg   {
   2853  1.1  mrg     mpfr_set (oldsum, sum, GFC_RND_MODE);
   2854  1.1  mrg 
   2855  1.1  mrg     mpz_mul_ui (num, num, 2 * i - 1);
   2856  1.1  mrg     mpz_neg (num, num);
   2857  1.1  mrg 
   2858  1.1  mrg     mpfr_set (w, u, GFC_RND_MODE);
   2859  1.1  mrg     mpfr_pow_ui (w, w, i, GFC_RND_MODE);
   2860  1.1  mrg 
   2861  1.1  mrg     mpfr_set_z (v, num, GFC_RND_MODE);
   2862  1.1  mrg     mpfr_mul (v, v, w, GFC_RND_MODE);
   2863  1.1  mrg 
   2864  1.1  mrg     mpfr_add (sum, sum, v, GFC_RND_MODE);
   2865  1.1  mrg 
   2866  1.1  mrg     mpfr_set (sumtrunc, sum, GFC_RND_MODE);
   2867  1.1  mrg     if (mpfr_cmp (sumtrunc, oldsum) == 0)
   2868  1.1  mrg       break;
   2869  1.1  mrg   }
   2870  1.1  mrg 
   2871  1.1  mrg   /* We should have converged by now; otherwise, ARG_LIMIT is probably
   2872  1.1  mrg      set too low.  */
   2873  1.1  mrg   gcc_assert (i < MAX_ITER);
   2874  1.1  mrg 
   2875  1.1  mrg   /* Divide by x * sqrt(Pi).  */
   2876  1.1  mrg   mpfr_const_pi (u, GFC_RND_MODE);
   2877  1.1  mrg   mpfr_sqrt (u, u, GFC_RND_MODE);
   2878  1.1  mrg   mpfr_mul (u, u, x, GFC_RND_MODE);
   2879  1.1  mrg   mpfr_div (sum, sum, u, GFC_RND_MODE);
   2880  1.1  mrg 
   2881  1.1  mrg   mpfr_set (res, sum, GFC_RND_MODE);
   2882  1.1  mrg   mpfr_set_default_prec (prec);
   2883  1.1  mrg 
   2884  1.1  mrg   mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
   2885  1.1  mrg   mpz_clear (num);
   2886  1.1  mrg }
   2887  1.1  mrg 
   2888  1.1  mrg 
   2889  1.1  mrg gfc_expr *
   2890  1.1  mrg gfc_simplify_erfc_scaled (gfc_expr *x)
   2891  1.1  mrg {
   2892  1.1  mrg   gfc_expr *result;
   2893  1.1  mrg 
   2894  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   2895  1.1  mrg     return NULL;
   2896  1.1  mrg 
   2897  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   2898  1.1  mrg   if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
   2899  1.1  mrg     asympt_erfc_scaled (result->value.real, x->value.real);
   2900  1.1  mrg   else
   2901  1.1  mrg     fullprec_erfc_scaled (result->value.real, x->value.real);
   2902  1.1  mrg 
   2903  1.1  mrg   return range_check (result, "ERFC_SCALED");
   2904  1.1  mrg }
   2905  1.1  mrg 
   2906  1.1  mrg #undef MAX_ITER
   2907  1.1  mrg #undef ARG_LIMIT
   2908  1.1  mrg 
   2909  1.1  mrg 
   2910  1.1  mrg gfc_expr *
   2911  1.1  mrg gfc_simplify_epsilon (gfc_expr *e)
   2912  1.1  mrg {
   2913  1.1  mrg   gfc_expr *result;
   2914  1.1  mrg   int i;
   2915  1.1  mrg 
   2916  1.1  mrg   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
   2917  1.1  mrg 
   2918  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
   2919  1.1  mrg   mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
   2920  1.1  mrg 
   2921  1.1  mrg   return range_check (result, "EPSILON");
   2922  1.1  mrg }
   2923  1.1  mrg 
   2924  1.1  mrg 
   2925  1.1  mrg gfc_expr *
   2926  1.1  mrg gfc_simplify_exp (gfc_expr *x)
   2927  1.1  mrg {
   2928  1.1  mrg   gfc_expr *result;
   2929  1.1  mrg 
   2930  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   2931  1.1  mrg     return NULL;
   2932  1.1  mrg 
   2933  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   2934  1.1  mrg 
   2935  1.1  mrg   switch (x->ts.type)
   2936  1.1  mrg     {
   2937  1.1  mrg       case BT_REAL:
   2938  1.1  mrg 	mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
   2939  1.1  mrg 	break;
   2940  1.1  mrg 
   2941  1.1  mrg       case BT_COMPLEX:
   2942  1.1  mrg 	gfc_set_model_kind (x->ts.kind);
   2943  1.1  mrg 	mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   2944  1.1  mrg 	break;
   2945  1.1  mrg 
   2946  1.1  mrg       default:
   2947  1.1  mrg 	gfc_internal_error ("in gfc_simplify_exp(): Bad type");
   2948  1.1  mrg     }
   2949  1.1  mrg 
   2950  1.1  mrg   return range_check (result, "EXP");
   2951  1.1  mrg }
   2952  1.1  mrg 
   2953  1.1  mrg 
   2954  1.1  mrg gfc_expr *
   2955  1.1  mrg gfc_simplify_exponent (gfc_expr *x)
   2956  1.1  mrg {
   2957  1.1  mrg   long int val;
   2958  1.1  mrg   gfc_expr *result;
   2959  1.1  mrg 
   2960  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   2961  1.1  mrg     return NULL;
   2962  1.1  mrg 
   2963  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
   2964  1.1  mrg 				  &x->where);
   2965  1.1  mrg 
   2966  1.1  mrg   /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
   2967  1.1  mrg   if (mpfr_inf_p (x->value.real) || mpfr_nan_p (x->value.real))
   2968  1.1  mrg     {
   2969  1.1  mrg       int i = gfc_validate_kind (BT_INTEGER, gfc_default_integer_kind, false);
   2970  1.1  mrg       mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
   2971  1.1  mrg       return result;
   2972  1.1  mrg     }
   2973  1.1  mrg 
   2974  1.1  mrg   /* EXPONENT(+/- 0.0) = 0  */
   2975  1.1  mrg   if (mpfr_zero_p (x->value.real))
   2976  1.1  mrg     {
   2977  1.1  mrg       mpz_set_ui (result->value.integer, 0);
   2978  1.1  mrg       return result;
   2979  1.1  mrg     }
   2980  1.1  mrg 
   2981  1.1  mrg   gfc_set_model (x->value.real);
   2982  1.1  mrg 
   2983  1.1  mrg   val = (long int) mpfr_get_exp (x->value.real);
   2984  1.1  mrg   mpz_set_si (result->value.integer, val);
   2985  1.1  mrg 
   2986  1.1  mrg   return range_check (result, "EXPONENT");
   2987  1.1  mrg }
   2988  1.1  mrg 
   2989  1.1  mrg 
   2990  1.1  mrg gfc_expr *
   2991  1.1  mrg gfc_simplify_failed_or_stopped_images (gfc_expr *team ATTRIBUTE_UNUSED,
   2992  1.1  mrg 				       gfc_expr *kind)
   2993  1.1  mrg {
   2994  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_NONE)
   2995  1.1  mrg     {
   2996  1.1  mrg       gfc_current_locus = *gfc_current_intrinsic_where;
   2997  1.1  mrg       gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
   2998  1.1  mrg       return &gfc_bad_expr;
   2999  1.1  mrg     }
   3000  1.1  mrg 
   3001  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_SINGLE)
   3002  1.1  mrg     {
   3003  1.1  mrg       gfc_expr *result;
   3004  1.1  mrg       int actual_kind;
   3005  1.1  mrg       if (kind)
   3006  1.1  mrg 	gfc_extract_int (kind, &actual_kind);
   3007  1.1  mrg       else
   3008  1.1  mrg 	actual_kind = gfc_default_integer_kind;
   3009  1.1  mrg 
   3010  1.1  mrg       result = gfc_get_array_expr (BT_INTEGER, actual_kind, &gfc_current_locus);
   3011  1.1  mrg       result->rank = 1;
   3012  1.1  mrg       return result;
   3013  1.1  mrg     }
   3014  1.1  mrg 
   3015  1.1  mrg   /* For fcoarray = lib no simplification is possible, because it is not known
   3016  1.1  mrg      what images failed or are stopped at compile time.  */
   3017  1.1  mrg   return NULL;
   3018  1.1  mrg }
   3019  1.1  mrg 
   3020  1.1  mrg 
   3021  1.1  mrg gfc_expr *
   3022  1.1  mrg gfc_simplify_get_team (gfc_expr *level ATTRIBUTE_UNUSED)
   3023  1.1  mrg {
   3024  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_NONE)
   3025  1.1  mrg     {
   3026  1.1  mrg       gfc_current_locus = *gfc_current_intrinsic_where;
   3027  1.1  mrg       gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
   3028  1.1  mrg       return &gfc_bad_expr;
   3029  1.1  mrg     }
   3030  1.1  mrg 
   3031  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_SINGLE)
   3032  1.1  mrg     {
   3033  1.1  mrg       gfc_expr *result;
   3034  1.1  mrg       result = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind, &gfc_current_locus);
   3035  1.1  mrg       result->rank = 0;
   3036  1.1  mrg       return result;
   3037  1.1  mrg     }
   3038  1.1  mrg 
   3039  1.1  mrg   /* For fcoarray = lib no simplification is possible, because it is not known
   3040  1.1  mrg      what images failed or are stopped at compile time.  */
   3041  1.1  mrg   return NULL;
   3042  1.1  mrg }
   3043  1.1  mrg 
   3044  1.1  mrg 
   3045  1.1  mrg gfc_expr *
   3046  1.1  mrg gfc_simplify_float (gfc_expr *a)
   3047  1.1  mrg {
   3048  1.1  mrg   gfc_expr *result;
   3049  1.1  mrg 
   3050  1.1  mrg   if (a->expr_type != EXPR_CONSTANT)
   3051  1.1  mrg     return NULL;
   3052  1.1  mrg 
   3053  1.1  mrg   result = gfc_int2real (a, gfc_default_real_kind);
   3054  1.1  mrg 
   3055  1.1  mrg   return range_check (result, "FLOAT");
   3056  1.1  mrg }
   3057  1.1  mrg 
   3058  1.1  mrg 
   3059  1.1  mrg static bool
   3060  1.1  mrg is_last_ref_vtab (gfc_expr *e)
   3061  1.1  mrg {
   3062  1.1  mrg   gfc_ref *ref;
   3063  1.1  mrg   gfc_component *comp = NULL;
   3064  1.1  mrg 
   3065  1.1  mrg   if (e->expr_type != EXPR_VARIABLE)
   3066  1.1  mrg     return false;
   3067  1.1  mrg 
   3068  1.1  mrg   for (ref = e->ref; ref; ref = ref->next)
   3069  1.1  mrg     if (ref->type == REF_COMPONENT)
   3070  1.1  mrg       comp = ref->u.c.component;
   3071  1.1  mrg 
   3072  1.1  mrg   if (!e->ref || !comp)
   3073  1.1  mrg     return e->symtree->n.sym->attr.vtab;
   3074  1.1  mrg 
   3075  1.1  mrg   if (comp->name[0] == '_' && strcmp (comp->name, "_vptr") == 0)
   3076  1.1  mrg     return true;
   3077  1.1  mrg 
   3078  1.1  mrg   return false;
   3079  1.1  mrg }
   3080  1.1  mrg 
   3081  1.1  mrg 
   3082  1.1  mrg gfc_expr *
   3083  1.1  mrg gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold)
   3084  1.1  mrg {
   3085  1.1  mrg   /* Avoid simplification of resolved symbols.  */
   3086  1.1  mrg   if (is_last_ref_vtab (a) || is_last_ref_vtab (mold))
   3087  1.1  mrg     return NULL;
   3088  1.1  mrg 
   3089  1.1  mrg   if (a->ts.type == BT_DERIVED && mold->ts.type == BT_DERIVED)
   3090  1.1  mrg     return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
   3091  1.1  mrg 				 gfc_type_is_extension_of (mold->ts.u.derived,
   3092  1.1  mrg 							   a->ts.u.derived));
   3093  1.1  mrg 
   3094  1.1  mrg   if (UNLIMITED_POLY (a) || UNLIMITED_POLY (mold))
   3095  1.1  mrg     return NULL;
   3096  1.1  mrg 
   3097  1.1  mrg   if ((a->ts.type == BT_CLASS && !gfc_expr_attr (a).class_ok)
   3098  1.1  mrg       || (mold->ts.type == BT_CLASS && !gfc_expr_attr (mold).class_ok))
   3099  1.1  mrg     return NULL;
   3100  1.1  mrg 
   3101  1.1  mrg   /* Return .false. if the dynamic type can never be an extension.  */
   3102  1.1  mrg   if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS
   3103  1.1  mrg        && !gfc_type_is_extension_of
   3104  1.1  mrg 			(mold->ts.u.derived->components->ts.u.derived,
   3105  1.1  mrg 			 a->ts.u.derived->components->ts.u.derived)
   3106  1.1  mrg        && !gfc_type_is_extension_of
   3107  1.1  mrg 			(a->ts.u.derived->components->ts.u.derived,
   3108  1.1  mrg 			 mold->ts.u.derived->components->ts.u.derived))
   3109  1.1  mrg       || (a->ts.type == BT_DERIVED && mold->ts.type == BT_CLASS
   3110  1.1  mrg 	  && !gfc_type_is_extension_of
   3111  1.1  mrg 			(mold->ts.u.derived->components->ts.u.derived,
   3112  1.1  mrg 			 a->ts.u.derived))
   3113  1.1  mrg       || (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
   3114  1.1  mrg 	  && !gfc_type_is_extension_of
   3115  1.1  mrg 			(mold->ts.u.derived,
   3116  1.1  mrg 			 a->ts.u.derived->components->ts.u.derived)
   3117  1.1  mrg 	  && !gfc_type_is_extension_of
   3118  1.1  mrg 			(a->ts.u.derived->components->ts.u.derived,
   3119  1.1  mrg 			 mold->ts.u.derived)))
   3120  1.1  mrg     return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
   3121  1.1  mrg 
   3122  1.1  mrg   /* Return .true. if the dynamic type is guaranteed to be an extension.  */
   3123  1.1  mrg   if (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
   3124  1.1  mrg       && gfc_type_is_extension_of (mold->ts.u.derived,
   3125  1.1  mrg 				   a->ts.u.derived->components->ts.u.derived))
   3126  1.1  mrg     return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, true);
   3127  1.1  mrg 
   3128  1.1  mrg   return NULL;
   3129  1.1  mrg }
   3130  1.1  mrg 
   3131  1.1  mrg 
   3132  1.1  mrg gfc_expr *
   3133  1.1  mrg gfc_simplify_same_type_as (gfc_expr *a, gfc_expr *b)
   3134  1.1  mrg {
   3135  1.1  mrg   /* Avoid simplification of resolved symbols.  */
   3136  1.1  mrg   if (is_last_ref_vtab (a) || is_last_ref_vtab (b))
   3137  1.1  mrg     return NULL;
   3138  1.1  mrg 
   3139  1.1  mrg   /* Return .false. if the dynamic type can never be the
   3140  1.1  mrg      same.  */
   3141  1.1  mrg   if (((a->ts.type == BT_CLASS && gfc_expr_attr (a).class_ok)
   3142  1.1  mrg        || (b->ts.type == BT_CLASS && gfc_expr_attr (b).class_ok))
   3143  1.1  mrg       && !gfc_type_compatible (&a->ts, &b->ts)
   3144  1.1  mrg       && !gfc_type_compatible (&b->ts, &a->ts))
   3145  1.1  mrg     return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
   3146  1.1  mrg 
   3147  1.1  mrg   if (a->ts.type != BT_DERIVED || b->ts.type != BT_DERIVED)
   3148  1.1  mrg      return NULL;
   3149  1.1  mrg 
   3150  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
   3151  1.1  mrg 			       gfc_compare_derived_types (a->ts.u.derived,
   3152  1.1  mrg 							  b->ts.u.derived));
   3153  1.1  mrg }
   3154  1.1  mrg 
   3155  1.1  mrg 
   3156  1.1  mrg gfc_expr *
   3157  1.1  mrg gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
   3158  1.1  mrg {
   3159  1.1  mrg   gfc_expr *result;
   3160  1.1  mrg   mpfr_t floor;
   3161  1.1  mrg   int kind;
   3162  1.1  mrg 
   3163  1.1  mrg   kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
   3164  1.1  mrg   if (kind == -1)
   3165  1.1  mrg     gfc_internal_error ("gfc_simplify_floor(): Bad kind");
   3166  1.1  mrg 
   3167  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   3168  1.1  mrg     return NULL;
   3169  1.1  mrg 
   3170  1.1  mrg   mpfr_init2 (floor, mpfr_get_prec (e->value.real));
   3171  1.1  mrg   mpfr_floor (floor, e->value.real);
   3172  1.1  mrg 
   3173  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
   3174  1.1  mrg   gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
   3175  1.1  mrg 
   3176  1.1  mrg   mpfr_clear (floor);
   3177  1.1  mrg 
   3178  1.1  mrg   return range_check (result, "FLOOR");
   3179  1.1  mrg }
   3180  1.1  mrg 
   3181  1.1  mrg 
   3182  1.1  mrg gfc_expr *
   3183  1.1  mrg gfc_simplify_fraction (gfc_expr *x)
   3184  1.1  mrg {
   3185  1.1  mrg   gfc_expr *result;
   3186  1.1  mrg   mpfr_exp_t e;
   3187  1.1  mrg 
   3188  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   3189  1.1  mrg     return NULL;
   3190  1.1  mrg 
   3191  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
   3192  1.1  mrg 
   3193  1.1  mrg   /* FRACTION(inf) = NaN.  */
   3194  1.1  mrg   if (mpfr_inf_p (x->value.real))
   3195  1.1  mrg     {
   3196  1.1  mrg       mpfr_set_nan (result->value.real);
   3197  1.1  mrg       return result;
   3198  1.1  mrg     }
   3199  1.1  mrg 
   3200  1.1  mrg   /* mpfr_frexp() correctly handles zeros and NaNs.  */
   3201  1.1  mrg   mpfr_frexp (&e, result->value.real, x->value.real, GFC_RND_MODE);
   3202  1.1  mrg 
   3203  1.1  mrg   return range_check (result, "FRACTION");
   3204  1.1  mrg }
   3205  1.1  mrg 
   3206  1.1  mrg 
   3207  1.1  mrg gfc_expr *
   3208  1.1  mrg gfc_simplify_gamma (gfc_expr *x)
   3209  1.1  mrg {
   3210  1.1  mrg   gfc_expr *result;
   3211  1.1  mrg 
   3212  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   3213  1.1  mrg     return NULL;
   3214  1.1  mrg 
   3215  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   3216  1.1  mrg   mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
   3217  1.1  mrg 
   3218  1.1  mrg   return range_check (result, "GAMMA");
   3219  1.1  mrg }
   3220  1.1  mrg 
   3221  1.1  mrg 
   3222  1.1  mrg gfc_expr *
   3223  1.1  mrg gfc_simplify_huge (gfc_expr *e)
   3224  1.1  mrg {
   3225  1.1  mrg   gfc_expr *result;
   3226  1.1  mrg   int i;
   3227  1.1  mrg 
   3228  1.1  mrg   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
   3229  1.1  mrg   result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
   3230  1.1  mrg 
   3231  1.1  mrg   switch (e->ts.type)
   3232  1.1  mrg     {
   3233  1.1  mrg       case BT_INTEGER:
   3234  1.1  mrg 	mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
   3235  1.1  mrg 	break;
   3236  1.1  mrg 
   3237  1.1  mrg       case BT_REAL:
   3238  1.1  mrg 	mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
   3239  1.1  mrg 	break;
   3240  1.1  mrg 
   3241  1.1  mrg       default:
   3242  1.1  mrg 	gcc_unreachable ();
   3243  1.1  mrg     }
   3244  1.1  mrg 
   3245  1.1  mrg   return result;
   3246  1.1  mrg }
   3247  1.1  mrg 
   3248  1.1  mrg 
   3249  1.1  mrg gfc_expr *
   3250  1.1  mrg gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
   3251  1.1  mrg {
   3252  1.1  mrg   gfc_expr *result;
   3253  1.1  mrg 
   3254  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   3255  1.1  mrg     return NULL;
   3256  1.1  mrg 
   3257  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   3258  1.1  mrg   mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
   3259  1.1  mrg   return range_check (result, "HYPOT");
   3260  1.1  mrg }
   3261  1.1  mrg 
   3262  1.1  mrg 
   3263  1.1  mrg /* We use the processor's collating sequence, because all
   3264  1.1  mrg    systems that gfortran currently works on are ASCII.  */
   3265  1.1  mrg 
   3266  1.1  mrg gfc_expr *
   3267  1.1  mrg gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
   3268  1.1  mrg {
   3269  1.1  mrg   gfc_expr *result;
   3270  1.1  mrg   gfc_char_t index;
   3271  1.1  mrg   int k;
   3272  1.1  mrg 
   3273  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   3274  1.1  mrg     return NULL;
   3275  1.1  mrg 
   3276  1.1  mrg   if (e->value.character.length != 1)
   3277  1.1  mrg     {
   3278  1.1  mrg       gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
   3279  1.1  mrg       return &gfc_bad_expr;
   3280  1.1  mrg     }
   3281  1.1  mrg 
   3282  1.1  mrg   index = e->value.character.string[0];
   3283  1.1  mrg 
   3284  1.1  mrg   if (warn_surprising && index > 127)
   3285  1.1  mrg     gfc_warning (OPT_Wsurprising,
   3286  1.1  mrg 		 "Argument of IACHAR function at %L outside of range 0..127",
   3287  1.1  mrg 		 &e->where);
   3288  1.1  mrg 
   3289  1.1  mrg   k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
   3290  1.1  mrg   if (k == -1)
   3291  1.1  mrg     return &gfc_bad_expr;
   3292  1.1  mrg 
   3293  1.1  mrg   result = gfc_get_int_expr (k, &e->where, index);
   3294  1.1  mrg 
   3295  1.1  mrg   return range_check (result, "IACHAR");
   3296  1.1  mrg }
   3297  1.1  mrg 
   3298  1.1  mrg 
   3299  1.1  mrg static gfc_expr *
   3300  1.1  mrg do_bit_and (gfc_expr *result, gfc_expr *e)
   3301  1.1  mrg {
   3302  1.1  mrg   gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
   3303  1.1  mrg   gcc_assert (result->ts.type == BT_INTEGER
   3304  1.1  mrg 	      && result->expr_type == EXPR_CONSTANT);
   3305  1.1  mrg 
   3306  1.1  mrg   mpz_and (result->value.integer, result->value.integer, e->value.integer);
   3307  1.1  mrg   return result;
   3308  1.1  mrg }
   3309  1.1  mrg 
   3310  1.1  mrg 
   3311  1.1  mrg gfc_expr *
   3312  1.1  mrg gfc_simplify_iall (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
   3313  1.1  mrg {
   3314  1.1  mrg   return simplify_transformation (array, dim, mask, -1, do_bit_and);
   3315  1.1  mrg }
   3316  1.1  mrg 
   3317  1.1  mrg 
   3318  1.1  mrg static gfc_expr *
   3319  1.1  mrg do_bit_ior (gfc_expr *result, gfc_expr *e)
   3320  1.1  mrg {
   3321  1.1  mrg   gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
   3322  1.1  mrg   gcc_assert (result->ts.type == BT_INTEGER
   3323  1.1  mrg 	      && result->expr_type == EXPR_CONSTANT);
   3324  1.1  mrg 
   3325  1.1  mrg   mpz_ior (result->value.integer, result->value.integer, e->value.integer);
   3326  1.1  mrg   return result;
   3327  1.1  mrg }
   3328  1.1  mrg 
   3329  1.1  mrg 
   3330  1.1  mrg gfc_expr *
   3331  1.1  mrg gfc_simplify_iany (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
   3332  1.1  mrg {
   3333  1.1  mrg   return simplify_transformation (array, dim, mask, 0, do_bit_ior);
   3334  1.1  mrg }
   3335  1.1  mrg 
   3336  1.1  mrg 
   3337  1.1  mrg gfc_expr *
   3338  1.1  mrg gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
   3339  1.1  mrg {
   3340  1.1  mrg   gfc_expr *result;
   3341  1.1  mrg 
   3342  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   3343  1.1  mrg     return NULL;
   3344  1.1  mrg 
   3345  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
   3346  1.1  mrg   mpz_and (result->value.integer, x->value.integer, y->value.integer);
   3347  1.1  mrg 
   3348  1.1  mrg   return range_check (result, "IAND");
   3349  1.1  mrg }
   3350  1.1  mrg 
   3351  1.1  mrg 
   3352  1.1  mrg gfc_expr *
   3353  1.1  mrg gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
   3354  1.1  mrg {
   3355  1.1  mrg   gfc_expr *result;
   3356  1.1  mrg   int k, pos;
   3357  1.1  mrg 
   3358  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   3359  1.1  mrg     return NULL;
   3360  1.1  mrg 
   3361  1.1  mrg   gfc_extract_int (y, &pos);
   3362  1.1  mrg 
   3363  1.1  mrg   k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
   3364  1.1  mrg 
   3365  1.1  mrg   result = gfc_copy_expr (x);
   3366  1.1  mrg 
   3367  1.1  mrg   convert_mpz_to_unsigned (result->value.integer,
   3368  1.1  mrg 			   gfc_integer_kinds[k].bit_size);
   3369  1.1  mrg 
   3370  1.1  mrg   mpz_clrbit (result->value.integer, pos);
   3371  1.1  mrg 
   3372  1.1  mrg   gfc_convert_mpz_to_signed (result->value.integer,
   3373  1.1  mrg 			 gfc_integer_kinds[k].bit_size);
   3374  1.1  mrg 
   3375  1.1  mrg   return result;
   3376  1.1  mrg }
   3377  1.1  mrg 
   3378  1.1  mrg 
   3379  1.1  mrg gfc_expr *
   3380  1.1  mrg gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
   3381  1.1  mrg {
   3382  1.1  mrg   gfc_expr *result;
   3383  1.1  mrg   int pos, len;
   3384  1.1  mrg   int i, k, bitsize;
   3385  1.1  mrg   int *bits;
   3386  1.1  mrg 
   3387  1.1  mrg   if (x->expr_type != EXPR_CONSTANT
   3388  1.1  mrg       || y->expr_type != EXPR_CONSTANT
   3389  1.1  mrg       || z->expr_type != EXPR_CONSTANT)
   3390  1.1  mrg     return NULL;
   3391  1.1  mrg 
   3392  1.1  mrg   gfc_extract_int (y, &pos);
   3393  1.1  mrg   gfc_extract_int (z, &len);
   3394  1.1  mrg 
   3395  1.1  mrg   k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
   3396  1.1  mrg 
   3397  1.1  mrg   bitsize = gfc_integer_kinds[k].bit_size;
   3398  1.1  mrg 
   3399  1.1  mrg   if (pos + len > bitsize)
   3400  1.1  mrg     {
   3401  1.1  mrg       gfc_error ("Sum of second and third arguments of IBITS exceeds "
   3402  1.1  mrg 		 "bit size at %L", &y->where);
   3403  1.1  mrg       return &gfc_bad_expr;
   3404  1.1  mrg     }
   3405  1.1  mrg 
   3406  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   3407  1.1  mrg   convert_mpz_to_unsigned (result->value.integer,
   3408  1.1  mrg 			   gfc_integer_kinds[k].bit_size);
   3409  1.1  mrg 
   3410  1.1  mrg   bits = XCNEWVEC (int, bitsize);
   3411  1.1  mrg 
   3412  1.1  mrg   for (i = 0; i < bitsize; i++)
   3413  1.1  mrg     bits[i] = 0;
   3414  1.1  mrg 
   3415  1.1  mrg   for (i = 0; i < len; i++)
   3416  1.1  mrg     bits[i] = mpz_tstbit (x->value.integer, i + pos);
   3417  1.1  mrg 
   3418  1.1  mrg   for (i = 0; i < bitsize; i++)
   3419  1.1  mrg     {
   3420  1.1  mrg       if (bits[i] == 0)
   3421  1.1  mrg 	mpz_clrbit (result->value.integer, i);
   3422  1.1  mrg       else if (bits[i] == 1)
   3423  1.1  mrg 	mpz_setbit (result->value.integer, i);
   3424  1.1  mrg       else
   3425  1.1  mrg 	gfc_internal_error ("IBITS: Bad bit");
   3426  1.1  mrg     }
   3427  1.1  mrg 
   3428  1.1  mrg   free (bits);
   3429  1.1  mrg 
   3430  1.1  mrg   gfc_convert_mpz_to_signed (result->value.integer,
   3431  1.1  mrg 			 gfc_integer_kinds[k].bit_size);
   3432  1.1  mrg 
   3433  1.1  mrg   return result;
   3434  1.1  mrg }
   3435  1.1  mrg 
   3436  1.1  mrg 
   3437  1.1  mrg gfc_expr *
   3438  1.1  mrg gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
   3439  1.1  mrg {
   3440  1.1  mrg   gfc_expr *result;
   3441  1.1  mrg   int k, pos;
   3442  1.1  mrg 
   3443  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   3444  1.1  mrg     return NULL;
   3445  1.1  mrg 
   3446  1.1  mrg   gfc_extract_int (y, &pos);
   3447  1.1  mrg 
   3448  1.1  mrg   k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
   3449  1.1  mrg 
   3450  1.1  mrg   result = gfc_copy_expr (x);
   3451  1.1  mrg 
   3452  1.1  mrg   convert_mpz_to_unsigned (result->value.integer,
   3453  1.1  mrg 			   gfc_integer_kinds[k].bit_size);
   3454  1.1  mrg 
   3455  1.1  mrg   mpz_setbit (result->value.integer, pos);
   3456  1.1  mrg 
   3457  1.1  mrg   gfc_convert_mpz_to_signed (result->value.integer,
   3458  1.1  mrg 			 gfc_integer_kinds[k].bit_size);
   3459  1.1  mrg 
   3460  1.1  mrg   return result;
   3461  1.1  mrg }
   3462  1.1  mrg 
   3463  1.1  mrg 
   3464  1.1  mrg gfc_expr *
   3465  1.1  mrg gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
   3466  1.1  mrg {
   3467  1.1  mrg   gfc_expr *result;
   3468  1.1  mrg   gfc_char_t index;
   3469  1.1  mrg   int k;
   3470  1.1  mrg 
   3471  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   3472  1.1  mrg     return NULL;
   3473  1.1  mrg 
   3474  1.1  mrg   if (e->value.character.length != 1)
   3475  1.1  mrg     {
   3476  1.1  mrg       gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
   3477  1.1  mrg       return &gfc_bad_expr;
   3478  1.1  mrg     }
   3479  1.1  mrg 
   3480  1.1  mrg   index = e->value.character.string[0];
   3481  1.1  mrg 
   3482  1.1  mrg   k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
   3483  1.1  mrg   if (k == -1)
   3484  1.1  mrg     return &gfc_bad_expr;
   3485  1.1  mrg 
   3486  1.1  mrg   result = gfc_get_int_expr (k, &e->where, index);
   3487  1.1  mrg 
   3488  1.1  mrg   return range_check (result, "ICHAR");
   3489  1.1  mrg }
   3490  1.1  mrg 
   3491  1.1  mrg 
   3492  1.1  mrg gfc_expr *
   3493  1.1  mrg gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
   3494  1.1  mrg {
   3495  1.1  mrg   gfc_expr *result;
   3496  1.1  mrg 
   3497  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   3498  1.1  mrg     return NULL;
   3499  1.1  mrg 
   3500  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
   3501  1.1  mrg   mpz_xor (result->value.integer, x->value.integer, y->value.integer);
   3502  1.1  mrg 
   3503  1.1  mrg   return range_check (result, "IEOR");
   3504  1.1  mrg }
   3505  1.1  mrg 
   3506  1.1  mrg 
   3507  1.1  mrg gfc_expr *
   3508  1.1  mrg gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
   3509  1.1  mrg {
   3510  1.1  mrg   gfc_expr *result;
   3511  1.1  mrg   bool back;
   3512  1.1  mrg   HOST_WIDE_INT len, lensub, start, last, i, index = 0;
   3513  1.1  mrg   int k, delta;
   3514  1.1  mrg 
   3515  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
   3516  1.1  mrg       || ( b != NULL && b->expr_type !=  EXPR_CONSTANT))
   3517  1.1  mrg     return NULL;
   3518  1.1  mrg 
   3519  1.1  mrg   back = (b != NULL && b->value.logical != 0);
   3520  1.1  mrg 
   3521  1.1  mrg   k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
   3522  1.1  mrg   if (k == -1)
   3523  1.1  mrg     return &gfc_bad_expr;
   3524  1.1  mrg 
   3525  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
   3526  1.1  mrg 
   3527  1.1  mrg   len = x->value.character.length;
   3528  1.1  mrg   lensub = y->value.character.length;
   3529  1.1  mrg 
   3530  1.1  mrg   if (len < lensub)
   3531  1.1  mrg     {
   3532  1.1  mrg       mpz_set_si (result->value.integer, 0);
   3533  1.1  mrg       return result;
   3534  1.1  mrg     }
   3535  1.1  mrg 
   3536  1.1  mrg   if (lensub == 0)
   3537  1.1  mrg     {
   3538  1.1  mrg       if (back)
   3539  1.1  mrg 	index = len + 1;
   3540  1.1  mrg       else
   3541  1.1  mrg 	index = 1;
   3542  1.1  mrg       goto done;
   3543  1.1  mrg     }
   3544  1.1  mrg 
   3545  1.1  mrg   if (!back)
   3546  1.1  mrg     {
   3547  1.1  mrg       last = len + 1 - lensub;
   3548  1.1  mrg       start = 0;
   3549  1.1  mrg       delta = 1;
   3550  1.1  mrg     }
   3551  1.1  mrg   else
   3552  1.1  mrg     {
   3553  1.1  mrg       last = -1;
   3554  1.1  mrg       start = len - lensub;
   3555  1.1  mrg       delta = -1;
   3556  1.1  mrg     }
   3557  1.1  mrg 
   3558  1.1  mrg   for (; start != last; start += delta)
   3559  1.1  mrg     {
   3560  1.1  mrg       for (i = 0; i < lensub; i++)
   3561  1.1  mrg 	{
   3562  1.1  mrg 	  if (x->value.character.string[start + i]
   3563  1.1  mrg 	      != y->value.character.string[i])
   3564  1.1  mrg 	    break;
   3565  1.1  mrg 	}
   3566  1.1  mrg       if (i == lensub)
   3567  1.1  mrg 	{
   3568  1.1  mrg 	  index = start + 1;
   3569  1.1  mrg 	  goto done;
   3570  1.1  mrg 	}
   3571  1.1  mrg     }
   3572  1.1  mrg 
   3573  1.1  mrg done:
   3574  1.1  mrg   mpz_set_si (result->value.integer, index);
   3575  1.1  mrg   return range_check (result, "INDEX");
   3576  1.1  mrg }
   3577  1.1  mrg 
   3578  1.1  mrg 
   3579  1.1  mrg static gfc_expr *
   3580  1.1  mrg simplify_intconv (gfc_expr *e, int kind, const char *name)
   3581  1.1  mrg {
   3582  1.1  mrg   gfc_expr *result = NULL;
   3583  1.1  mrg   int tmp1, tmp2;
   3584  1.1  mrg 
   3585  1.1  mrg   /* Convert BOZ to integer, and return without range checking.  */
   3586  1.1  mrg   if (e->ts.type == BT_BOZ)
   3587  1.1  mrg     {
   3588  1.1  mrg       if (!gfc_boz2int (e, kind))
   3589  1.1  mrg 	return NULL;
   3590  1.1  mrg       result = gfc_copy_expr (e);
   3591  1.1  mrg       return result;
   3592  1.1  mrg     }
   3593  1.1  mrg 
   3594  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   3595  1.1  mrg     return NULL;
   3596  1.1  mrg 
   3597  1.1  mrg   /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
   3598  1.1  mrg      warnings.  */
   3599  1.1  mrg   tmp1 = warn_conversion;
   3600  1.1  mrg   tmp2 = warn_conversion_extra;
   3601  1.1  mrg   warn_conversion = warn_conversion_extra = 0;
   3602  1.1  mrg 
   3603  1.1  mrg   result = gfc_convert_constant (e, BT_INTEGER, kind);
   3604  1.1  mrg 
   3605  1.1  mrg   warn_conversion = tmp1;
   3606  1.1  mrg   warn_conversion_extra = tmp2;
   3607  1.1  mrg 
   3608  1.1  mrg   if (result == &gfc_bad_expr)
   3609  1.1  mrg     return &gfc_bad_expr;
   3610  1.1  mrg 
   3611  1.1  mrg   return range_check (result, name);
   3612  1.1  mrg }
   3613  1.1  mrg 
   3614  1.1  mrg 
   3615  1.1  mrg gfc_expr *
   3616  1.1  mrg gfc_simplify_int (gfc_expr *e, gfc_expr *k)
   3617  1.1  mrg {
   3618  1.1  mrg   int kind;
   3619  1.1  mrg 
   3620  1.1  mrg   kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
   3621  1.1  mrg   if (kind == -1)
   3622  1.1  mrg     return &gfc_bad_expr;
   3623  1.1  mrg 
   3624  1.1  mrg   return simplify_intconv (e, kind, "INT");
   3625  1.1  mrg }
   3626  1.1  mrg 
   3627  1.1  mrg gfc_expr *
   3628  1.1  mrg gfc_simplify_int2 (gfc_expr *e)
   3629  1.1  mrg {
   3630  1.1  mrg   return simplify_intconv (e, 2, "INT2");
   3631  1.1  mrg }
   3632  1.1  mrg 
   3633  1.1  mrg 
   3634  1.1  mrg gfc_expr *
   3635  1.1  mrg gfc_simplify_int8 (gfc_expr *e)
   3636  1.1  mrg {
   3637  1.1  mrg   return simplify_intconv (e, 8, "INT8");
   3638  1.1  mrg }
   3639  1.1  mrg 
   3640  1.1  mrg 
   3641  1.1  mrg gfc_expr *
   3642  1.1  mrg gfc_simplify_long (gfc_expr *e)
   3643  1.1  mrg {
   3644  1.1  mrg   return simplify_intconv (e, 4, "LONG");
   3645  1.1  mrg }
   3646  1.1  mrg 
   3647  1.1  mrg 
   3648  1.1  mrg gfc_expr *
   3649  1.1  mrg gfc_simplify_ifix (gfc_expr *e)
   3650  1.1  mrg {
   3651  1.1  mrg   gfc_expr *rtrunc, *result;
   3652  1.1  mrg 
   3653  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   3654  1.1  mrg     return NULL;
   3655  1.1  mrg 
   3656  1.1  mrg   rtrunc = gfc_copy_expr (e);
   3657  1.1  mrg   mpfr_trunc (rtrunc->value.real, e->value.real);
   3658  1.1  mrg 
   3659  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
   3660  1.1  mrg 				  &e->where);
   3661  1.1  mrg   gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
   3662  1.1  mrg 
   3663  1.1  mrg   gfc_free_expr (rtrunc);
   3664  1.1  mrg 
   3665  1.1  mrg   return range_check (result, "IFIX");
   3666  1.1  mrg }
   3667  1.1  mrg 
   3668  1.1  mrg 
   3669  1.1  mrg gfc_expr *
   3670  1.1  mrg gfc_simplify_idint (gfc_expr *e)
   3671  1.1  mrg {
   3672  1.1  mrg   gfc_expr *rtrunc, *result;
   3673  1.1  mrg 
   3674  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   3675  1.1  mrg     return NULL;
   3676  1.1  mrg 
   3677  1.1  mrg   rtrunc = gfc_copy_expr (e);
   3678  1.1  mrg   mpfr_trunc (rtrunc->value.real, e->value.real);
   3679  1.1  mrg 
   3680  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
   3681  1.1  mrg 				  &e->where);
   3682  1.1  mrg   gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
   3683  1.1  mrg 
   3684  1.1  mrg   gfc_free_expr (rtrunc);
   3685  1.1  mrg 
   3686  1.1  mrg   return range_check (result, "IDINT");
   3687  1.1  mrg }
   3688  1.1  mrg 
   3689  1.1  mrg 
   3690  1.1  mrg gfc_expr *
   3691  1.1  mrg gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
   3692  1.1  mrg {
   3693  1.1  mrg   gfc_expr *result;
   3694  1.1  mrg 
   3695  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   3696  1.1  mrg     return NULL;
   3697  1.1  mrg 
   3698  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
   3699  1.1  mrg   mpz_ior (result->value.integer, x->value.integer, y->value.integer);
   3700  1.1  mrg 
   3701  1.1  mrg   return range_check (result, "IOR");
   3702  1.1  mrg }
   3703  1.1  mrg 
   3704  1.1  mrg 
   3705  1.1  mrg static gfc_expr *
   3706  1.1  mrg do_bit_xor (gfc_expr *result, gfc_expr *e)
   3707  1.1  mrg {
   3708  1.1  mrg   gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
   3709  1.1  mrg   gcc_assert (result->ts.type == BT_INTEGER
   3710  1.1  mrg 	      && result->expr_type == EXPR_CONSTANT);
   3711  1.1  mrg 
   3712  1.1  mrg   mpz_xor (result->value.integer, result->value.integer, e->value.integer);
   3713  1.1  mrg   return result;
   3714  1.1  mrg }
   3715  1.1  mrg 
   3716  1.1  mrg 
   3717  1.1  mrg gfc_expr *
   3718  1.1  mrg gfc_simplify_iparity (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
   3719  1.1  mrg {
   3720  1.1  mrg   return simplify_transformation (array, dim, mask, 0, do_bit_xor);
   3721  1.1  mrg }
   3722  1.1  mrg 
   3723  1.1  mrg 
   3724  1.1  mrg gfc_expr *
   3725  1.1  mrg gfc_simplify_is_iostat_end (gfc_expr *x)
   3726  1.1  mrg {
   3727  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   3728  1.1  mrg     return NULL;
   3729  1.1  mrg 
   3730  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
   3731  1.1  mrg 			       mpz_cmp_si (x->value.integer,
   3732  1.1  mrg 					   LIBERROR_END) == 0);
   3733  1.1  mrg }
   3734  1.1  mrg 
   3735  1.1  mrg 
   3736  1.1  mrg gfc_expr *
   3737  1.1  mrg gfc_simplify_is_iostat_eor (gfc_expr *x)
   3738  1.1  mrg {
   3739  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   3740  1.1  mrg     return NULL;
   3741  1.1  mrg 
   3742  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
   3743  1.1  mrg 			       mpz_cmp_si (x->value.integer,
   3744  1.1  mrg 					   LIBERROR_EOR) == 0);
   3745  1.1  mrg }
   3746  1.1  mrg 
   3747  1.1  mrg 
   3748  1.1  mrg gfc_expr *
   3749  1.1  mrg gfc_simplify_isnan (gfc_expr *x)
   3750  1.1  mrg {
   3751  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   3752  1.1  mrg     return NULL;
   3753  1.1  mrg 
   3754  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
   3755  1.1  mrg 			       mpfr_nan_p (x->value.real));
   3756  1.1  mrg }
   3757  1.1  mrg 
   3758  1.1  mrg 
   3759  1.1  mrg /* Performs a shift on its first argument.  Depending on the last
   3760  1.1  mrg    argument, the shift can be arithmetic, i.e. with filling from the
   3761  1.1  mrg    left like in the SHIFTA intrinsic.  */
   3762  1.1  mrg static gfc_expr *
   3763  1.1  mrg simplify_shift (gfc_expr *e, gfc_expr *s, const char *name,
   3764  1.1  mrg 		bool arithmetic, int direction)
   3765  1.1  mrg {
   3766  1.1  mrg   gfc_expr *result;
   3767  1.1  mrg   int ashift, *bits, i, k, bitsize, shift;
   3768  1.1  mrg 
   3769  1.1  mrg   if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
   3770  1.1  mrg     return NULL;
   3771  1.1  mrg 
   3772  1.1  mrg   gfc_extract_int (s, &shift);
   3773  1.1  mrg 
   3774  1.1  mrg   k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
   3775  1.1  mrg   bitsize = gfc_integer_kinds[k].bit_size;
   3776  1.1  mrg 
   3777  1.1  mrg   result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
   3778  1.1  mrg 
   3779  1.1  mrg   if (shift == 0)
   3780  1.1  mrg     {
   3781  1.1  mrg       mpz_set (result->value.integer, e->value.integer);
   3782  1.1  mrg       return result;
   3783  1.1  mrg     }
   3784  1.1  mrg 
   3785  1.1  mrg   if (direction > 0 && shift < 0)
   3786  1.1  mrg     {
   3787  1.1  mrg       /* Left shift, as in SHIFTL.  */
   3788  1.1  mrg       gfc_error ("Second argument of %s is negative at %L", name, &e->where);
   3789  1.1  mrg       return &gfc_bad_expr;
   3790  1.1  mrg     }
   3791  1.1  mrg   else if (direction < 0)
   3792  1.1  mrg     {
   3793  1.1  mrg       /* Right shift, as in SHIFTR or SHIFTA.  */
   3794  1.1  mrg       if (shift < 0)
   3795  1.1  mrg 	{
   3796  1.1  mrg 	  gfc_error ("Second argument of %s is negative at %L",
   3797  1.1  mrg 		     name, &e->where);
   3798  1.1  mrg 	  return &gfc_bad_expr;
   3799  1.1  mrg 	}
   3800  1.1  mrg 
   3801  1.1  mrg       shift = -shift;
   3802  1.1  mrg     }
   3803  1.1  mrg 
   3804  1.1  mrg   ashift = (shift >= 0 ? shift : -shift);
   3805  1.1  mrg 
   3806  1.1  mrg   if (ashift > bitsize)
   3807  1.1  mrg     {
   3808  1.1  mrg       gfc_error ("Magnitude of second argument of %s exceeds bit size "
   3809  1.1  mrg 		 "at %L", name, &e->where);
   3810  1.1  mrg       return &gfc_bad_expr;
   3811  1.1  mrg     }
   3812  1.1  mrg 
   3813  1.1  mrg   bits = XCNEWVEC (int, bitsize);
   3814  1.1  mrg 
   3815  1.1  mrg   for (i = 0; i < bitsize; i++)
   3816  1.1  mrg     bits[i] = mpz_tstbit (e->value.integer, i);
   3817  1.1  mrg 
   3818  1.1  mrg   if (shift > 0)
   3819  1.1  mrg     {
   3820  1.1  mrg       /* Left shift.  */
   3821  1.1  mrg       for (i = 0; i < shift; i++)
   3822  1.1  mrg 	mpz_clrbit (result->value.integer, i);
   3823  1.1  mrg 
   3824  1.1  mrg       for (i = 0; i < bitsize - shift; i++)
   3825  1.1  mrg 	{
   3826  1.1  mrg 	  if (bits[i] == 0)
   3827  1.1  mrg 	    mpz_clrbit (result->value.integer, i + shift);
   3828  1.1  mrg 	  else
   3829  1.1  mrg 	    mpz_setbit (result->value.integer, i + shift);
   3830  1.1  mrg 	}
   3831  1.1  mrg     }
   3832  1.1  mrg   else
   3833  1.1  mrg     {
   3834  1.1  mrg       /* Right shift.  */
   3835  1.1  mrg       if (arithmetic && bits[bitsize - 1])
   3836  1.1  mrg 	for (i = bitsize - 1; i >= bitsize - ashift; i--)
   3837  1.1  mrg 	  mpz_setbit (result->value.integer, i);
   3838  1.1  mrg       else
   3839  1.1  mrg 	for (i = bitsize - 1; i >= bitsize - ashift; i--)
   3840  1.1  mrg 	  mpz_clrbit (result->value.integer, i);
   3841  1.1  mrg 
   3842  1.1  mrg       for (i = bitsize - 1; i >= ashift; i--)
   3843  1.1  mrg 	{
   3844  1.1  mrg 	  if (bits[i] == 0)
   3845  1.1  mrg 	    mpz_clrbit (result->value.integer, i - ashift);
   3846  1.1  mrg 	  else
   3847  1.1  mrg 	    mpz_setbit (result->value.integer, i - ashift);
   3848  1.1  mrg 	}
   3849  1.1  mrg     }
   3850  1.1  mrg 
   3851  1.1  mrg   gfc_convert_mpz_to_signed (result->value.integer, bitsize);
   3852  1.1  mrg   free (bits);
   3853  1.1  mrg 
   3854  1.1  mrg   return result;
   3855  1.1  mrg }
   3856  1.1  mrg 
   3857  1.1  mrg 
   3858  1.1  mrg gfc_expr *
   3859  1.1  mrg gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
   3860  1.1  mrg {
   3861  1.1  mrg   return simplify_shift (e, s, "ISHFT", false, 0);
   3862  1.1  mrg }
   3863  1.1  mrg 
   3864  1.1  mrg 
   3865  1.1  mrg gfc_expr *
   3866  1.1  mrg gfc_simplify_lshift (gfc_expr *e, gfc_expr *s)
   3867  1.1  mrg {
   3868  1.1  mrg   return simplify_shift (e, s, "LSHIFT", false, 1);
   3869  1.1  mrg }
   3870  1.1  mrg 
   3871  1.1  mrg 
   3872  1.1  mrg gfc_expr *
   3873  1.1  mrg gfc_simplify_rshift (gfc_expr *e, gfc_expr *s)
   3874  1.1  mrg {
   3875  1.1  mrg   return simplify_shift (e, s, "RSHIFT", true, -1);
   3876  1.1  mrg }
   3877  1.1  mrg 
   3878  1.1  mrg 
   3879  1.1  mrg gfc_expr *
   3880  1.1  mrg gfc_simplify_shifta (gfc_expr *e, gfc_expr *s)
   3881  1.1  mrg {
   3882  1.1  mrg   return simplify_shift (e, s, "SHIFTA", true, -1);
   3883  1.1  mrg }
   3884  1.1  mrg 
   3885  1.1  mrg 
   3886  1.1  mrg gfc_expr *
   3887  1.1  mrg gfc_simplify_shiftl (gfc_expr *e, gfc_expr *s)
   3888  1.1  mrg {
   3889  1.1  mrg   return simplify_shift (e, s, "SHIFTL", false, 1);
   3890  1.1  mrg }
   3891  1.1  mrg 
   3892  1.1  mrg 
   3893  1.1  mrg gfc_expr *
   3894  1.1  mrg gfc_simplify_shiftr (gfc_expr *e, gfc_expr *s)
   3895  1.1  mrg {
   3896  1.1  mrg   return simplify_shift (e, s, "SHIFTR", false, -1);
   3897  1.1  mrg }
   3898  1.1  mrg 
   3899  1.1  mrg 
   3900  1.1  mrg gfc_expr *
   3901  1.1  mrg gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
   3902  1.1  mrg {
   3903  1.1  mrg   gfc_expr *result;
   3904  1.1  mrg   int shift, ashift, isize, ssize, delta, k;
   3905  1.1  mrg   int i, *bits;
   3906  1.1  mrg 
   3907  1.1  mrg   if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
   3908  1.1  mrg     return NULL;
   3909  1.1  mrg 
   3910  1.1  mrg   gfc_extract_int (s, &shift);
   3911  1.1  mrg 
   3912  1.1  mrg   k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
   3913  1.1  mrg   isize = gfc_integer_kinds[k].bit_size;
   3914  1.1  mrg 
   3915  1.1  mrg   if (sz != NULL)
   3916  1.1  mrg     {
   3917  1.1  mrg       if (sz->expr_type != EXPR_CONSTANT)
   3918  1.1  mrg 	return NULL;
   3919  1.1  mrg 
   3920  1.1  mrg       gfc_extract_int (sz, &ssize);
   3921  1.1  mrg     }
   3922  1.1  mrg   else
   3923  1.1  mrg     ssize = isize;
   3924  1.1  mrg 
   3925  1.1  mrg   if (shift >= 0)
   3926  1.1  mrg     ashift = shift;
   3927  1.1  mrg   else
   3928  1.1  mrg     ashift = -shift;
   3929  1.1  mrg 
   3930  1.1  mrg   if (ashift > ssize)
   3931  1.1  mrg     {
   3932  1.1  mrg       if (sz == NULL)
   3933  1.1  mrg 	gfc_error ("Magnitude of second argument of ISHFTC exceeds "
   3934  1.1  mrg 		   "BIT_SIZE of first argument at %C");
   3935  1.1  mrg       else
   3936  1.1  mrg 	gfc_error ("Absolute value of SHIFT shall be less than or equal "
   3937  1.1  mrg 		   "to SIZE at %C");
   3938  1.1  mrg       return &gfc_bad_expr;
   3939  1.1  mrg     }
   3940  1.1  mrg 
   3941  1.1  mrg   result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
   3942  1.1  mrg 
   3943  1.1  mrg   mpz_set (result->value.integer, e->value.integer);
   3944  1.1  mrg 
   3945  1.1  mrg   if (shift == 0)
   3946  1.1  mrg     return result;
   3947  1.1  mrg 
   3948  1.1  mrg   convert_mpz_to_unsigned (result->value.integer, isize);
   3949  1.1  mrg 
   3950  1.1  mrg   bits = XCNEWVEC (int, ssize);
   3951  1.1  mrg 
   3952  1.1  mrg   for (i = 0; i < ssize; i++)
   3953  1.1  mrg     bits[i] = mpz_tstbit (e->value.integer, i);
   3954  1.1  mrg 
   3955  1.1  mrg   delta = ssize - ashift;
   3956  1.1  mrg 
   3957  1.1  mrg   if (shift > 0)
   3958  1.1  mrg     {
   3959  1.1  mrg       for (i = 0; i < delta; i++)
   3960  1.1  mrg 	{
   3961  1.1  mrg 	  if (bits[i] == 0)
   3962  1.1  mrg 	    mpz_clrbit (result->value.integer, i + shift);
   3963  1.1  mrg 	  else
   3964  1.1  mrg 	    mpz_setbit (result->value.integer, i + shift);
   3965  1.1  mrg 	}
   3966  1.1  mrg 
   3967  1.1  mrg       for (i = delta; i < ssize; i++)
   3968  1.1  mrg 	{
   3969  1.1  mrg 	  if (bits[i] == 0)
   3970  1.1  mrg 	    mpz_clrbit (result->value.integer, i - delta);
   3971  1.1  mrg 	  else
   3972  1.1  mrg 	    mpz_setbit (result->value.integer, i - delta);
   3973  1.1  mrg 	}
   3974  1.1  mrg     }
   3975  1.1  mrg   else
   3976  1.1  mrg     {
   3977  1.1  mrg       for (i = 0; i < ashift; i++)
   3978  1.1  mrg 	{
   3979  1.1  mrg 	  if (bits[i] == 0)
   3980  1.1  mrg 	    mpz_clrbit (result->value.integer, i + delta);
   3981  1.1  mrg 	  else
   3982  1.1  mrg 	    mpz_setbit (result->value.integer, i + delta);
   3983  1.1  mrg 	}
   3984  1.1  mrg 
   3985  1.1  mrg       for (i = ashift; i < ssize; i++)
   3986  1.1  mrg 	{
   3987  1.1  mrg 	  if (bits[i] == 0)
   3988  1.1  mrg 	    mpz_clrbit (result->value.integer, i + shift);
   3989  1.1  mrg 	  else
   3990  1.1  mrg 	    mpz_setbit (result->value.integer, i + shift);
   3991  1.1  mrg 	}
   3992  1.1  mrg     }
   3993  1.1  mrg 
   3994  1.1  mrg   gfc_convert_mpz_to_signed (result->value.integer, isize);
   3995  1.1  mrg 
   3996  1.1  mrg   free (bits);
   3997  1.1  mrg   return result;
   3998  1.1  mrg }
   3999  1.1  mrg 
   4000  1.1  mrg 
   4001  1.1  mrg gfc_expr *
   4002  1.1  mrg gfc_simplify_kind (gfc_expr *e)
   4003  1.1  mrg {
   4004  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
   4005  1.1  mrg }
   4006  1.1  mrg 
   4007  1.1  mrg 
   4008  1.1  mrg static gfc_expr *
   4009  1.1  mrg simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
   4010  1.1  mrg 		    gfc_array_spec *as, gfc_ref *ref, bool coarray)
   4011  1.1  mrg {
   4012  1.1  mrg   gfc_expr *l, *u, *result;
   4013  1.1  mrg   int k;
   4014  1.1  mrg 
   4015  1.1  mrg   k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
   4016  1.1  mrg 		gfc_default_integer_kind);
   4017  1.1  mrg   if (k == -1)
   4018  1.1  mrg     return &gfc_bad_expr;
   4019  1.1  mrg 
   4020  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
   4021  1.1  mrg 
   4022  1.1  mrg   /* For non-variables, LBOUND(expr, DIM=n) = 1 and
   4023  1.1  mrg      UBOUND(expr, DIM=n) = SIZE(expr, DIM=n).  */
   4024  1.1  mrg   if (!coarray && array->expr_type != EXPR_VARIABLE)
   4025  1.1  mrg     {
   4026  1.1  mrg       if (upper)
   4027  1.1  mrg 	{
   4028  1.1  mrg 	  gfc_expr* dim = result;
   4029  1.1  mrg 	  mpz_set_si (dim->value.integer, d);
   4030  1.1  mrg 
   4031  1.1  mrg 	  result = simplify_size (array, dim, k);
   4032  1.1  mrg 	  gfc_free_expr (dim);
   4033  1.1  mrg 	  if (!result)
   4034  1.1  mrg 	    goto returnNull;
   4035  1.1  mrg 	}
   4036  1.1  mrg       else
   4037  1.1  mrg 	mpz_set_si (result->value.integer, 1);
   4038  1.1  mrg 
   4039  1.1  mrg       goto done;
   4040  1.1  mrg     }
   4041  1.1  mrg 
   4042  1.1  mrg   /* Otherwise, we have a variable expression.  */
   4043  1.1  mrg   gcc_assert (array->expr_type == EXPR_VARIABLE);
   4044  1.1  mrg   gcc_assert (as);
   4045  1.1  mrg 
   4046  1.1  mrg   if (!gfc_resolve_array_spec (as, 0))
   4047  1.1  mrg     return NULL;
   4048  1.1  mrg 
   4049  1.1  mrg   /* The last dimension of an assumed-size array is special.  */
   4050  1.1  mrg   if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
   4051  1.1  mrg       || (coarray && d == as->rank + as->corank
   4052  1.1  mrg 	  && (!upper || flag_coarray == GFC_FCOARRAY_SINGLE)))
   4053  1.1  mrg     {
   4054  1.1  mrg       if (as->lower[d-1] && as->lower[d-1]->expr_type == EXPR_CONSTANT)
   4055  1.1  mrg 	{
   4056  1.1  mrg 	  gfc_free_expr (result);
   4057  1.1  mrg 	  return gfc_copy_expr (as->lower[d-1]);
   4058  1.1  mrg 	}
   4059  1.1  mrg 
   4060  1.1  mrg       goto returnNull;
   4061  1.1  mrg     }
   4062  1.1  mrg 
   4063  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
   4064  1.1  mrg 
   4065  1.1  mrg   /* Then, we need to know the extent of the given dimension.  */
   4066  1.1  mrg   if (coarray || (ref->u.ar.type == AR_FULL && !ref->next))
   4067  1.1  mrg     {
   4068  1.1  mrg       gfc_expr *declared_bound;
   4069  1.1  mrg       int empty_bound;
   4070  1.1  mrg       bool constant_lbound, constant_ubound;
   4071  1.1  mrg 
   4072  1.1  mrg       l = as->lower[d-1];
   4073  1.1  mrg       u = as->upper[d-1];
   4074  1.1  mrg 
   4075  1.1  mrg       gcc_assert (l != NULL);
   4076  1.1  mrg 
   4077  1.1  mrg       constant_lbound = l->expr_type == EXPR_CONSTANT;
   4078  1.1  mrg       constant_ubound = u && u->expr_type == EXPR_CONSTANT;
   4079  1.1  mrg 
   4080  1.1  mrg       empty_bound = upper ? 0 : 1;
   4081  1.1  mrg       declared_bound = upper ? u : l;
   4082  1.1  mrg 
   4083  1.1  mrg       if ((!upper && !constant_lbound)
   4084  1.1  mrg 	  || (upper && !constant_ubound))
   4085  1.1  mrg 	goto returnNull;
   4086  1.1  mrg 
   4087  1.1  mrg       if (!coarray)
   4088  1.1  mrg 	{
   4089  1.1  mrg 	  /* For {L,U}BOUND, the value depends on whether the array
   4090  1.1  mrg 	     is empty.  We can nevertheless simplify if the declared bound
   4091  1.1  mrg 	     has the same value as that of an empty array, in which case
   4092  1.1  mrg 	     the result isn't dependent on the array emptyness.  */
   4093  1.1  mrg 	  if (mpz_cmp_si (declared_bound->value.integer, empty_bound) == 0)
   4094  1.1  mrg 	    mpz_set_si (result->value.integer, empty_bound);
   4095  1.1  mrg 	  else if (!constant_lbound || !constant_ubound)
   4096  1.1  mrg 	    /* Array emptyness can't be determined, we can't simplify.  */
   4097  1.1  mrg 	    goto returnNull;
   4098  1.1  mrg 	  else if (mpz_cmp (l->value.integer, u->value.integer) > 0)
   4099  1.1  mrg 	    mpz_set_si (result->value.integer, empty_bound);
   4100  1.1  mrg 	  else
   4101  1.1  mrg 	    mpz_set (result->value.integer, declared_bound->value.integer);
   4102  1.1  mrg 	}
   4103  1.1  mrg       else
   4104  1.1  mrg 	mpz_set (result->value.integer, declared_bound->value.integer);
   4105  1.1  mrg     }
   4106  1.1  mrg   else
   4107  1.1  mrg     {
   4108  1.1  mrg       if (upper)
   4109  1.1  mrg 	{
   4110  1.1  mrg 	  int d2 = 0, cnt = 0;
   4111  1.1  mrg 	  for (int idx = 0; idx < ref->u.ar.dimen; ++idx)
   4112  1.1  mrg 	    {
   4113  1.1  mrg 	      if (ref->u.ar.dimen_type[idx] == DIMEN_ELEMENT)
   4114  1.1  mrg 		d2++;
   4115  1.1  mrg 	      else if (cnt < d - 1)
   4116  1.1  mrg 		cnt++;
   4117  1.1  mrg 	      else
   4118  1.1  mrg 		break;
   4119  1.1  mrg 	    }
   4120  1.1  mrg 	  if (!gfc_ref_dimen_size (&ref->u.ar, d2 + d - 1, &result->value.integer, NULL))
   4121  1.1  mrg 	    goto returnNull;
   4122  1.1  mrg 	}
   4123  1.1  mrg       else
   4124  1.1  mrg 	mpz_set_si (result->value.integer, (long int) 1);
   4125  1.1  mrg     }
   4126  1.1  mrg 
   4127  1.1  mrg done:
   4128  1.1  mrg   return range_check (result, upper ? "UBOUND" : "LBOUND");
   4129  1.1  mrg 
   4130  1.1  mrg returnNull:
   4131  1.1  mrg   gfc_free_expr (result);
   4132  1.1  mrg   return NULL;
   4133  1.1  mrg }
   4134  1.1  mrg 
   4135  1.1  mrg 
   4136  1.1  mrg static gfc_expr *
   4137  1.1  mrg simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
   4138  1.1  mrg {
   4139  1.1  mrg   gfc_ref *ref;
   4140  1.1  mrg   gfc_array_spec *as;
   4141  1.1  mrg   ar_type type = AR_UNKNOWN;
   4142  1.1  mrg   int d;
   4143  1.1  mrg 
   4144  1.1  mrg   if (array->ts.type == BT_CLASS)
   4145  1.1  mrg     return NULL;
   4146  1.1  mrg 
   4147  1.1  mrg   if (array->expr_type != EXPR_VARIABLE)
   4148  1.1  mrg     {
   4149  1.1  mrg       as = NULL;
   4150  1.1  mrg       ref = NULL;
   4151  1.1  mrg       goto done;
   4152  1.1  mrg     }
   4153  1.1  mrg 
   4154  1.1  mrg   /* Do not attempt to resolve if error has already been issued.  */
   4155  1.1  mrg   if (array->symtree->n.sym->error)
   4156  1.1  mrg     return NULL;
   4157  1.1  mrg 
   4158  1.1  mrg   /* Follow any component references.  */
   4159  1.1  mrg   as = array->symtree->n.sym->as;
   4160  1.1  mrg   for (ref = array->ref; ref; ref = ref->next)
   4161  1.1  mrg     {
   4162  1.1  mrg       switch (ref->type)
   4163  1.1  mrg 	{
   4164  1.1  mrg 	case REF_ARRAY:
   4165  1.1  mrg 	  type = ref->u.ar.type;
   4166  1.1  mrg 	  switch (ref->u.ar.type)
   4167  1.1  mrg 	    {
   4168  1.1  mrg 	    case AR_ELEMENT:
   4169  1.1  mrg 	      as = NULL;
   4170  1.1  mrg 	      continue;
   4171  1.1  mrg 
   4172  1.1  mrg 	    case AR_FULL:
   4173  1.1  mrg 	      /* We're done because 'as' has already been set in the
   4174  1.1  mrg 		 previous iteration.  */
   4175  1.1  mrg 	      goto done;
   4176  1.1  mrg 
   4177  1.1  mrg 	    case AR_UNKNOWN:
   4178  1.1  mrg 	      return NULL;
   4179  1.1  mrg 
   4180  1.1  mrg 	    case AR_SECTION:
   4181  1.1  mrg 	      as = ref->u.ar.as;
   4182  1.1  mrg 	      goto done;
   4183  1.1  mrg 	    }
   4184  1.1  mrg 
   4185  1.1  mrg 	  gcc_unreachable ();
   4186  1.1  mrg 
   4187  1.1  mrg 	case REF_COMPONENT:
   4188  1.1  mrg 	  as = ref->u.c.component->as;
   4189  1.1  mrg 	  continue;
   4190  1.1  mrg 
   4191  1.1  mrg 	case REF_SUBSTRING:
   4192  1.1  mrg 	case REF_INQUIRY:
   4193  1.1  mrg 	  continue;
   4194  1.1  mrg 	}
   4195  1.1  mrg     }
   4196  1.1  mrg 
   4197  1.1  mrg   gcc_unreachable ();
   4198  1.1  mrg 
   4199  1.1  mrg  done:
   4200  1.1  mrg 
   4201  1.1  mrg   if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_RANK
   4202  1.1  mrg 	     || (as->type == AS_ASSUMED_SHAPE && upper)))
   4203  1.1  mrg     return NULL;
   4204  1.1  mrg 
   4205  1.1  mrg   /* 'array' shall not be an unallocated allocatable variable or a pointer that
   4206  1.1  mrg      is not associated.  */
   4207  1.1  mrg   if (array->expr_type == EXPR_VARIABLE
   4208  1.1  mrg       && (gfc_expr_attr (array).allocatable || gfc_expr_attr (array).pointer))
   4209  1.1  mrg     return NULL;
   4210  1.1  mrg 
   4211  1.1  mrg   gcc_assert (!as
   4212  1.1  mrg 	      || (as->type != AS_DEFERRED
   4213  1.1  mrg 		  && array->expr_type == EXPR_VARIABLE
   4214  1.1  mrg 		  && !gfc_expr_attr (array).allocatable
   4215  1.1  mrg 		  && !gfc_expr_attr (array).pointer));
   4216  1.1  mrg 
   4217  1.1  mrg   if (dim == NULL)
   4218  1.1  mrg     {
   4219  1.1  mrg       /* Multi-dimensional bounds.  */
   4220  1.1  mrg       gfc_expr *bounds[GFC_MAX_DIMENSIONS];
   4221  1.1  mrg       gfc_expr *e;
   4222  1.1  mrg       int k;
   4223  1.1  mrg 
   4224  1.1  mrg       /* UBOUND(ARRAY) is not valid for an assumed-size array.  */
   4225  1.1  mrg       if (upper && type == AR_FULL && as && as->type == AS_ASSUMED_SIZE)
   4226  1.1  mrg 	{
   4227  1.1  mrg 	  /* An error message will be emitted in
   4228  1.1  mrg 	     check_assumed_size_reference (resolve.cc).  */
   4229  1.1  mrg 	  return &gfc_bad_expr;
   4230  1.1  mrg 	}
   4231  1.1  mrg 
   4232  1.1  mrg       /* Simplify the bounds for each dimension.  */
   4233  1.1  mrg       for (d = 0; d < array->rank; d++)
   4234  1.1  mrg 	{
   4235  1.1  mrg 	  bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
   4236  1.1  mrg 					  false);
   4237  1.1  mrg 	  if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
   4238  1.1  mrg 	    {
   4239  1.1  mrg 	      int j;
   4240  1.1  mrg 
   4241  1.1  mrg 	      for (j = 0; j < d; j++)
   4242  1.1  mrg 		gfc_free_expr (bounds[j]);
   4243  1.1  mrg 
   4244  1.1  mrg 	      if (gfc_seen_div0)
   4245  1.1  mrg 		return &gfc_bad_expr;
   4246  1.1  mrg 	      else
   4247  1.1  mrg 		return bounds[d];
   4248  1.1  mrg 	    }
   4249  1.1  mrg 	}
   4250  1.1  mrg 
   4251  1.1  mrg       /* Allocate the result expression.  */
   4252  1.1  mrg       k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
   4253  1.1  mrg 		    gfc_default_integer_kind);
   4254  1.1  mrg       if (k == -1)
   4255  1.1  mrg 	return &gfc_bad_expr;
   4256  1.1  mrg 
   4257  1.1  mrg       e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
   4258  1.1  mrg 
   4259  1.1  mrg       /* The result is a rank 1 array; its size is the rank of the first
   4260  1.1  mrg 	 argument to {L,U}BOUND.  */
   4261  1.1  mrg       e->rank = 1;
   4262  1.1  mrg       e->shape = gfc_get_shape (1);
   4263  1.1  mrg       mpz_init_set_ui (e->shape[0], array->rank);
   4264  1.1  mrg 
   4265  1.1  mrg       /* Create the constructor for this array.  */
   4266  1.1  mrg       for (d = 0; d < array->rank; d++)
   4267  1.1  mrg 	gfc_constructor_append_expr (&e->value.constructor,
   4268  1.1  mrg 				     bounds[d], &e->where);
   4269  1.1  mrg 
   4270  1.1  mrg       return e;
   4271  1.1  mrg     }
   4272  1.1  mrg   else
   4273  1.1  mrg     {
   4274  1.1  mrg       /* A DIM argument is specified.  */
   4275  1.1  mrg       if (dim->expr_type != EXPR_CONSTANT)
   4276  1.1  mrg 	return NULL;
   4277  1.1  mrg 
   4278  1.1  mrg       d = mpz_get_si (dim->value.integer);
   4279  1.1  mrg 
   4280  1.1  mrg       if ((d < 1 || d > array->rank)
   4281  1.1  mrg 	  || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
   4282  1.1  mrg 	{
   4283  1.1  mrg 	  gfc_error ("DIM argument at %L is out of bounds", &dim->where);
   4284  1.1  mrg 	  return &gfc_bad_expr;
   4285  1.1  mrg 	}
   4286  1.1  mrg 
   4287  1.1  mrg       if (as && as->type == AS_ASSUMED_RANK)
   4288  1.1  mrg 	return NULL;
   4289  1.1  mrg 
   4290  1.1  mrg       return simplify_bound_dim (array, kind, d, upper, as, ref, false);
   4291  1.1  mrg     }
   4292  1.1  mrg }
   4293  1.1  mrg 
   4294  1.1  mrg 
   4295  1.1  mrg static gfc_expr *
   4296  1.1  mrg simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
   4297  1.1  mrg {
   4298  1.1  mrg   gfc_ref *ref;
   4299  1.1  mrg   gfc_array_spec *as;
   4300  1.1  mrg   int d;
   4301  1.1  mrg 
   4302  1.1  mrg   if (array->expr_type != EXPR_VARIABLE)
   4303  1.1  mrg     return NULL;
   4304  1.1  mrg 
   4305  1.1  mrg   /* Follow any component references.  */
   4306  1.1  mrg   as = (array->ts.type == BT_CLASS && array->ts.u.derived->components)
   4307  1.1  mrg        ? array->ts.u.derived->components->as
   4308  1.1  mrg        : array->symtree->n.sym->as;
   4309  1.1  mrg   for (ref = array->ref; ref; ref = ref->next)
   4310  1.1  mrg     {
   4311  1.1  mrg       switch (ref->type)
   4312  1.1  mrg 	{
   4313  1.1  mrg 	case REF_ARRAY:
   4314  1.1  mrg 	  switch (ref->u.ar.type)
   4315  1.1  mrg 	    {
   4316  1.1  mrg 	    case AR_ELEMENT:
   4317  1.1  mrg 	      if (ref->u.ar.as->corank > 0)
   4318  1.1  mrg 		{
   4319  1.1  mrg 		  gcc_assert (as == ref->u.ar.as);
   4320  1.1  mrg 		  goto done;
   4321  1.1  mrg 		}
   4322  1.1  mrg 	      as = NULL;
   4323  1.1  mrg 	      continue;
   4324  1.1  mrg 
   4325  1.1  mrg 	    case AR_FULL:
   4326  1.1  mrg 	      /* We're done because 'as' has already been set in the
   4327  1.1  mrg 		 previous iteration.  */
   4328  1.1  mrg 	      goto done;
   4329  1.1  mrg 
   4330  1.1  mrg 	    case AR_UNKNOWN:
   4331  1.1  mrg 	      return NULL;
   4332  1.1  mrg 
   4333  1.1  mrg 	    case AR_SECTION:
   4334  1.1  mrg 	      as = ref->u.ar.as;
   4335  1.1  mrg 	      goto done;
   4336  1.1  mrg 	    }
   4337  1.1  mrg 
   4338  1.1  mrg 	  gcc_unreachable ();
   4339  1.1  mrg 
   4340  1.1  mrg 	case REF_COMPONENT:
   4341  1.1  mrg 	  as = ref->u.c.component->as;
   4342  1.1  mrg 	  continue;
   4343  1.1  mrg 
   4344  1.1  mrg 	case REF_SUBSTRING:
   4345  1.1  mrg 	case REF_INQUIRY:
   4346  1.1  mrg 	  continue;
   4347  1.1  mrg 	}
   4348  1.1  mrg     }
   4349  1.1  mrg 
   4350  1.1  mrg   if (!as)
   4351  1.1  mrg     gcc_unreachable ();
   4352  1.1  mrg 
   4353  1.1  mrg  done:
   4354  1.1  mrg 
   4355  1.1  mrg   if (as->cotype == AS_DEFERRED || as->cotype == AS_ASSUMED_SHAPE)
   4356  1.1  mrg     return NULL;
   4357  1.1  mrg 
   4358  1.1  mrg   if (dim == NULL)
   4359  1.1  mrg     {
   4360  1.1  mrg       /* Multi-dimensional cobounds.  */
   4361  1.1  mrg       gfc_expr *bounds[GFC_MAX_DIMENSIONS];
   4362  1.1  mrg       gfc_expr *e;
   4363  1.1  mrg       int k;
   4364  1.1  mrg 
   4365  1.1  mrg       /* Simplify the cobounds for each dimension.  */
   4366  1.1  mrg       for (d = 0; d < as->corank; d++)
   4367  1.1  mrg 	{
   4368  1.1  mrg 	  bounds[d] = simplify_bound_dim (array, kind, d + 1 + as->rank,
   4369  1.1  mrg 					  upper, as, ref, true);
   4370  1.1  mrg 	  if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
   4371  1.1  mrg 	    {
   4372  1.1  mrg 	      int j;
   4373  1.1  mrg 
   4374  1.1  mrg 	      for (j = 0; j < d; j++)
   4375  1.1  mrg 		gfc_free_expr (bounds[j]);
   4376  1.1  mrg 	      return bounds[d];
   4377  1.1  mrg 	    }
   4378  1.1  mrg 	}
   4379  1.1  mrg 
   4380  1.1  mrg       /* Allocate the result expression.  */
   4381  1.1  mrg       e = gfc_get_expr ();
   4382  1.1  mrg       e->where = array->where;
   4383  1.1  mrg       e->expr_type = EXPR_ARRAY;
   4384  1.1  mrg       e->ts.type = BT_INTEGER;
   4385  1.1  mrg       k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
   4386  1.1  mrg 		    gfc_default_integer_kind);
   4387  1.1  mrg       if (k == -1)
   4388  1.1  mrg 	{
   4389  1.1  mrg 	  gfc_free_expr (e);
   4390  1.1  mrg 	  return &gfc_bad_expr;
   4391  1.1  mrg 	}
   4392  1.1  mrg       e->ts.kind = k;
   4393  1.1  mrg 
   4394  1.1  mrg       /* The result is a rank 1 array; its size is the rank of the first
   4395  1.1  mrg 	 argument to {L,U}COBOUND.  */
   4396  1.1  mrg       e->rank = 1;
   4397  1.1  mrg       e->shape = gfc_get_shape (1);
   4398  1.1  mrg       mpz_init_set_ui (e->shape[0], as->corank);
   4399  1.1  mrg 
   4400  1.1  mrg       /* Create the constructor for this array.  */
   4401  1.1  mrg       for (d = 0; d < as->corank; d++)
   4402  1.1  mrg 	gfc_constructor_append_expr (&e->value.constructor,
   4403  1.1  mrg 				     bounds[d], &e->where);
   4404  1.1  mrg       return e;
   4405  1.1  mrg     }
   4406  1.1  mrg   else
   4407  1.1  mrg     {
   4408  1.1  mrg       /* A DIM argument is specified.  */
   4409  1.1  mrg       if (dim->expr_type != EXPR_CONSTANT)
   4410  1.1  mrg 	return NULL;
   4411  1.1  mrg 
   4412  1.1  mrg       d = mpz_get_si (dim->value.integer);
   4413  1.1  mrg 
   4414  1.1  mrg       if (d < 1 || d > as->corank)
   4415  1.1  mrg 	{
   4416  1.1  mrg 	  gfc_error ("DIM argument at %L is out of bounds", &dim->where);
   4417  1.1  mrg 	  return &gfc_bad_expr;
   4418  1.1  mrg 	}
   4419  1.1  mrg 
   4420  1.1  mrg       return simplify_bound_dim (array, kind, d+as->rank, upper, as, ref, true);
   4421  1.1  mrg     }
   4422  1.1  mrg }
   4423  1.1  mrg 
   4424  1.1  mrg 
   4425  1.1  mrg gfc_expr *
   4426  1.1  mrg gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
   4427  1.1  mrg {
   4428  1.1  mrg   return simplify_bound (array, dim, kind, 0);
   4429  1.1  mrg }
   4430  1.1  mrg 
   4431  1.1  mrg 
   4432  1.1  mrg gfc_expr *
   4433  1.1  mrg gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
   4434  1.1  mrg {
   4435  1.1  mrg   return simplify_cobound (array, dim, kind, 0);
   4436  1.1  mrg }
   4437  1.1  mrg 
   4438  1.1  mrg gfc_expr *
   4439  1.1  mrg gfc_simplify_leadz (gfc_expr *e)
   4440  1.1  mrg {
   4441  1.1  mrg   unsigned long lz, bs;
   4442  1.1  mrg   int i;
   4443  1.1  mrg 
   4444  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   4445  1.1  mrg     return NULL;
   4446  1.1  mrg 
   4447  1.1  mrg   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
   4448  1.1  mrg   bs = gfc_integer_kinds[i].bit_size;
   4449  1.1  mrg   if (mpz_cmp_si (e->value.integer, 0) == 0)
   4450  1.1  mrg     lz = bs;
   4451  1.1  mrg   else if (mpz_cmp_si (e->value.integer, 0) < 0)
   4452  1.1  mrg     lz = 0;
   4453  1.1  mrg   else
   4454  1.1  mrg     lz = bs - mpz_sizeinbase (e->value.integer, 2);
   4455  1.1  mrg 
   4456  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
   4457  1.1  mrg }
   4458  1.1  mrg 
   4459  1.1  mrg 
   4460  1.1  mrg /* Check for constant length of a substring.  */
   4461  1.1  mrg 
   4462  1.1  mrg static bool
   4463  1.1  mrg substring_has_constant_len (gfc_expr *e)
   4464  1.1  mrg {
   4465  1.1  mrg   gfc_ref *ref;
   4466  1.1  mrg   HOST_WIDE_INT istart, iend, length;
   4467  1.1  mrg   bool equal_length = false;
   4468  1.1  mrg 
   4469  1.1  mrg   if (e->ts.type != BT_CHARACTER)
   4470  1.1  mrg     return false;
   4471  1.1  mrg 
   4472  1.1  mrg   for (ref = e->ref; ref; ref = ref->next)
   4473  1.1  mrg     if (ref->type != REF_COMPONENT && ref->type != REF_ARRAY)
   4474  1.1  mrg       break;
   4475  1.1  mrg 
   4476  1.1  mrg   if (!ref
   4477  1.1  mrg       || ref->type != REF_SUBSTRING
   4478  1.1  mrg       || !ref->u.ss.start
   4479  1.1  mrg       || ref->u.ss.start->expr_type != EXPR_CONSTANT
   4480  1.1  mrg       || !ref->u.ss.end
   4481  1.1  mrg       || ref->u.ss.end->expr_type != EXPR_CONSTANT)
   4482  1.1  mrg     return false;
   4483  1.1  mrg 
   4484  1.1  mrg   /* Basic checks on substring starting and ending indices.  */
   4485  1.1  mrg   if (!gfc_resolve_substring (ref, &equal_length))
   4486  1.1  mrg     return false;
   4487  1.1  mrg 
   4488  1.1  mrg   istart = gfc_mpz_get_hwi (ref->u.ss.start->value.integer);
   4489  1.1  mrg   iend = gfc_mpz_get_hwi (ref->u.ss.end->value.integer);
   4490  1.1  mrg 
   4491  1.1  mrg   if (istart <= iend)
   4492  1.1  mrg     length = iend - istart + 1;
   4493  1.1  mrg   else
   4494  1.1  mrg     length = 0;
   4495  1.1  mrg 
   4496  1.1  mrg   /* Fix substring length.  */
   4497  1.1  mrg   e->value.character.length = length;
   4498  1.1  mrg 
   4499  1.1  mrg   return true;
   4500  1.1  mrg }
   4501  1.1  mrg 
   4502  1.1  mrg 
   4503  1.1  mrg gfc_expr *
   4504  1.1  mrg gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
   4505  1.1  mrg {
   4506  1.1  mrg   gfc_expr *result;
   4507  1.1  mrg   int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
   4508  1.1  mrg 
   4509  1.1  mrg   if (k == -1)
   4510  1.1  mrg     return &gfc_bad_expr;
   4511  1.1  mrg 
   4512  1.1  mrg   if (e->expr_type == EXPR_CONSTANT
   4513  1.1  mrg       || substring_has_constant_len (e))
   4514  1.1  mrg     {
   4515  1.1  mrg       result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
   4516  1.1  mrg       mpz_set_si (result->value.integer, e->value.character.length);
   4517  1.1  mrg       return range_check (result, "LEN");
   4518  1.1  mrg     }
   4519  1.1  mrg   else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
   4520  1.1  mrg 	   && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
   4521  1.1  mrg 	   && e->ts.u.cl->length->ts.type == BT_INTEGER)
   4522  1.1  mrg     {
   4523  1.1  mrg       result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
   4524  1.1  mrg       mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
   4525  1.1  mrg       return range_check (result, "LEN");
   4526  1.1  mrg     }
   4527  1.1  mrg   else if (e->expr_type == EXPR_VARIABLE && e->ts.type == BT_CHARACTER
   4528  1.1  mrg 	   && e->symtree->n.sym)
   4529  1.1  mrg     {
   4530  1.1  mrg       if (e->symtree->n.sym->ts.type != BT_DERIVED
   4531  1.1  mrg 	  && e->symtree->n.sym->assoc && e->symtree->n.sym->assoc->target
   4532  1.1  mrg 	  && e->symtree->n.sym->assoc->target->ts.type == BT_DERIVED
   4533  1.1  mrg 	  && e->symtree->n.sym->assoc->target->symtree->n.sym
   4534  1.1  mrg 	  && UNLIMITED_POLY (e->symtree->n.sym->assoc->target->symtree->n.sym))
   4535  1.1  mrg 	/* The expression in assoc->target points to a ref to the _data
   4536  1.1  mrg 	   component of the unlimited polymorphic entity.  To get the _len
   4537  1.1  mrg 	   component the last _data ref needs to be stripped and a ref to the
   4538  1.1  mrg 	   _len component added.  */
   4539  1.1  mrg 	return gfc_get_len_component (e->symtree->n.sym->assoc->target, k);
   4540  1.1  mrg       else if (e->symtree->n.sym->ts.type == BT_DERIVED
   4541  1.1  mrg 	       && e->ref && e->ref->type == REF_COMPONENT
   4542  1.1  mrg 	       && e->ref->u.c.component->attr.pdt_string
   4543  1.1  mrg 	       && e->ref->u.c.component->ts.type == BT_CHARACTER
   4544  1.1  mrg 	       && e->ref->u.c.component->ts.u.cl->length)
   4545  1.1  mrg 	{
   4546  1.1  mrg 	  if (gfc_init_expr_flag)
   4547  1.1  mrg 	    {
   4548  1.1  mrg 	      gfc_expr* tmp;
   4549  1.1  mrg 	      tmp = gfc_pdt_find_component_copy_initializer (e->symtree->n.sym,
   4550  1.1  mrg 							     e->ref->u.c
   4551  1.1  mrg 							     .component->ts.u.cl
   4552  1.1  mrg 							     ->length->symtree
   4553  1.1  mrg 							     ->name);
   4554  1.1  mrg 	      if (tmp)
   4555  1.1  mrg 		return tmp;
   4556  1.1  mrg 	    }
   4557  1.1  mrg 	  else
   4558  1.1  mrg 	    {
   4559  1.1  mrg 	      gfc_expr *len_expr = gfc_copy_expr (e);
   4560  1.1  mrg 	      gfc_free_ref_list (len_expr->ref);
   4561  1.1  mrg 	      len_expr->ref = NULL;
   4562  1.1  mrg 	      gfc_find_component (len_expr->symtree->n.sym->ts.u.derived, e->ref
   4563  1.1  mrg 				  ->u.c.component->ts.u.cl->length->symtree
   4564  1.1  mrg 				  ->name,
   4565  1.1  mrg 				  false, true, &len_expr->ref);
   4566  1.1  mrg 	      len_expr->ts = len_expr->ref->u.c.component->ts;
   4567  1.1  mrg 	      return len_expr;
   4568  1.1  mrg 	    }
   4569  1.1  mrg 	}
   4570  1.1  mrg     }
   4571  1.1  mrg   return NULL;
   4572  1.1  mrg }
   4573  1.1  mrg 
   4574  1.1  mrg 
   4575  1.1  mrg gfc_expr *
   4576  1.1  mrg gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
   4577  1.1  mrg {
   4578  1.1  mrg   gfc_expr *result;
   4579  1.1  mrg   size_t count, len, i;
   4580  1.1  mrg   int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
   4581  1.1  mrg 
   4582  1.1  mrg   if (k == -1)
   4583  1.1  mrg     return &gfc_bad_expr;
   4584  1.1  mrg 
   4585  1.1  mrg   /* If the expression is either an array element or section, an array
   4586  1.1  mrg      parameter must be built so that the reference can be applied. Constant
   4587  1.1  mrg      references should have already been simplified away. All other cases
   4588  1.1  mrg      can proceed to translation, where kind conversion will occur silently.  */
   4589  1.1  mrg   if (e->expr_type == EXPR_VARIABLE
   4590  1.1  mrg       && e->ts.type == BT_CHARACTER
   4591  1.1  mrg       && e->symtree->n.sym->attr.flavor == FL_PARAMETER
   4592  1.1  mrg       && e->ref && e->ref->type == REF_ARRAY
   4593  1.1  mrg       && e->ref->u.ar.type != AR_FULL
   4594  1.1  mrg       && e->symtree->n.sym->value)
   4595  1.1  mrg     {
   4596  1.1  mrg       char name[2*GFC_MAX_SYMBOL_LEN + 12];
   4597  1.1  mrg       gfc_namespace *ns = e->symtree->n.sym->ns;
   4598  1.1  mrg       gfc_symtree *st;
   4599  1.1  mrg       gfc_expr *expr;
   4600  1.1  mrg       gfc_expr *p;
   4601  1.1  mrg       gfc_constructor *c;
   4602  1.1  mrg       int cnt = 0;
   4603  1.1  mrg 
   4604  1.1  mrg       sprintf (name, "_len_trim_%s_%s", e->symtree->n.sym->name,
   4605  1.1  mrg 	       ns->proc_name->name);
   4606  1.1  mrg       st = gfc_find_symtree (ns->sym_root, name);
   4607  1.1  mrg       if (st)
   4608  1.1  mrg 	goto already_built;
   4609  1.1  mrg 
   4610  1.1  mrg       /* Recursively call this fcn to simplify the constructor elements.  */
   4611  1.1  mrg       expr = gfc_copy_expr (e->symtree->n.sym->value);
   4612  1.1  mrg       expr->ts.type = BT_INTEGER;
   4613  1.1  mrg       expr->ts.kind = k;
   4614  1.1  mrg       expr->ts.u.cl = NULL;
   4615  1.1  mrg       c = gfc_constructor_first (expr->value.constructor);
   4616  1.1  mrg       for (; c; c = gfc_constructor_next (c))
   4617  1.1  mrg 	{
   4618  1.1  mrg 	  if (c->iterator)
   4619  1.1  mrg 	    continue;
   4620  1.1  mrg 
   4621  1.1  mrg 	  if (c->expr && c->expr->ts.type == BT_CHARACTER)
   4622  1.1  mrg 	    {
   4623  1.1  mrg 	      p = gfc_simplify_len_trim (c->expr, kind);
   4624  1.1  mrg 	      if (p == NULL)
   4625  1.1  mrg 		goto clean_up;
   4626  1.1  mrg 	      gfc_replace_expr (c->expr, p);
   4627  1.1  mrg 	      cnt++;
   4628  1.1  mrg 	    }
   4629  1.1  mrg 	}
   4630  1.1  mrg 
   4631  1.1  mrg       if (cnt)
   4632  1.1  mrg 	{
   4633  1.1  mrg 	  /* Build a new parameter to take the result.  */
   4634  1.1  mrg 	  st = gfc_new_symtree (&ns->sym_root, name);
   4635  1.1  mrg 	  st->n.sym = gfc_new_symbol (st->name, ns);
   4636  1.1  mrg 	  st->n.sym->value = expr;
   4637  1.1  mrg 	  st->n.sym->ts = expr->ts;
   4638  1.1  mrg 	  st->n.sym->attr.dimension = 1;
   4639  1.1  mrg 	  st->n.sym->attr.save = SAVE_IMPLICIT;
   4640  1.1  mrg 	  st->n.sym->attr.flavor = FL_PARAMETER;
   4641  1.1  mrg 	  st->n.sym->as = gfc_copy_array_spec (e->symtree->n.sym->as);
   4642  1.1  mrg 	  gfc_set_sym_referenced (st->n.sym);
   4643  1.1  mrg 	  st->n.sym->refs++;
   4644  1.1  mrg 	  gfc_commit_symbol (st->n.sym);
   4645  1.1  mrg 
   4646  1.1  mrg already_built:
   4647  1.1  mrg 	  /* Build a return expression.  */
   4648  1.1  mrg 	  expr = gfc_copy_expr (e);
   4649  1.1  mrg 	  expr->ts = st->n.sym->ts;
   4650  1.1  mrg 	  expr->symtree = st;
   4651  1.1  mrg 	  gfc_expression_rank (expr);
   4652  1.1  mrg 	  return expr;
   4653  1.1  mrg 	}
   4654  1.1  mrg 
   4655  1.1  mrg clean_up:
   4656  1.1  mrg       gfc_free_expr (expr);
   4657  1.1  mrg       return NULL;
   4658  1.1  mrg     }
   4659  1.1  mrg 
   4660  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   4661  1.1  mrg     return NULL;
   4662  1.1  mrg 
   4663  1.1  mrg   len = e->value.character.length;
   4664  1.1  mrg   for (count = 0, i = 1; i <= len; i++)
   4665  1.1  mrg     if (e->value.character.string[len - i] == ' ')
   4666  1.1  mrg       count++;
   4667  1.1  mrg     else
   4668  1.1  mrg       break;
   4669  1.1  mrg 
   4670  1.1  mrg   result = gfc_get_int_expr (k, &e->where, len - count);
   4671  1.1  mrg   return range_check (result, "LEN_TRIM");
   4672  1.1  mrg }
   4673  1.1  mrg 
   4674  1.1  mrg gfc_expr *
   4675  1.1  mrg gfc_simplify_lgamma (gfc_expr *x)
   4676  1.1  mrg {
   4677  1.1  mrg   gfc_expr *result;
   4678  1.1  mrg   int sg;
   4679  1.1  mrg 
   4680  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   4681  1.1  mrg     return NULL;
   4682  1.1  mrg 
   4683  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   4684  1.1  mrg   mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
   4685  1.1  mrg 
   4686  1.1  mrg   return range_check (result, "LGAMMA");
   4687  1.1  mrg }
   4688  1.1  mrg 
   4689  1.1  mrg 
   4690  1.1  mrg gfc_expr *
   4691  1.1  mrg gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
   4692  1.1  mrg {
   4693  1.1  mrg   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
   4694  1.1  mrg     return NULL;
   4695  1.1  mrg 
   4696  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
   4697  1.1  mrg 			       gfc_compare_string (a, b) >= 0);
   4698  1.1  mrg }
   4699  1.1  mrg 
   4700  1.1  mrg 
   4701  1.1  mrg gfc_expr *
   4702  1.1  mrg gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
   4703  1.1  mrg {
   4704  1.1  mrg   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
   4705  1.1  mrg     return NULL;
   4706  1.1  mrg 
   4707  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
   4708  1.1  mrg 			       gfc_compare_string (a, b) > 0);
   4709  1.1  mrg }
   4710  1.1  mrg 
   4711  1.1  mrg 
   4712  1.1  mrg gfc_expr *
   4713  1.1  mrg gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
   4714  1.1  mrg {
   4715  1.1  mrg   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
   4716  1.1  mrg     return NULL;
   4717  1.1  mrg 
   4718  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
   4719  1.1  mrg 			       gfc_compare_string (a, b) <= 0);
   4720  1.1  mrg }
   4721  1.1  mrg 
   4722  1.1  mrg 
   4723  1.1  mrg gfc_expr *
   4724  1.1  mrg gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
   4725  1.1  mrg {
   4726  1.1  mrg   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
   4727  1.1  mrg     return NULL;
   4728  1.1  mrg 
   4729  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
   4730  1.1  mrg 			       gfc_compare_string (a, b) < 0);
   4731  1.1  mrg }
   4732  1.1  mrg 
   4733  1.1  mrg 
   4734  1.1  mrg gfc_expr *
   4735  1.1  mrg gfc_simplify_log (gfc_expr *x)
   4736  1.1  mrg {
   4737  1.1  mrg   gfc_expr *result;
   4738  1.1  mrg 
   4739  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   4740  1.1  mrg     return NULL;
   4741  1.1  mrg 
   4742  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   4743  1.1  mrg 
   4744  1.1  mrg   switch (x->ts.type)
   4745  1.1  mrg     {
   4746  1.1  mrg     case BT_REAL:
   4747  1.1  mrg       if (mpfr_sgn (x->value.real) <= 0)
   4748  1.1  mrg 	{
   4749  1.1  mrg 	  gfc_error ("Argument of LOG at %L cannot be less than or equal "
   4750  1.1  mrg 		     "to zero", &x->where);
   4751  1.1  mrg 	  gfc_free_expr (result);
   4752  1.1  mrg 	  return &gfc_bad_expr;
   4753  1.1  mrg 	}
   4754  1.1  mrg 
   4755  1.1  mrg       mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
   4756  1.1  mrg       break;
   4757  1.1  mrg 
   4758  1.1  mrg     case BT_COMPLEX:
   4759  1.1  mrg       if (mpfr_zero_p (mpc_realref (x->value.complex))
   4760  1.1  mrg 	  && mpfr_zero_p (mpc_imagref (x->value.complex)))
   4761  1.1  mrg 	{
   4762  1.1  mrg 	  gfc_error ("Complex argument of LOG at %L cannot be zero",
   4763  1.1  mrg 		     &x->where);
   4764  1.1  mrg 	  gfc_free_expr (result);
   4765  1.1  mrg 	  return &gfc_bad_expr;
   4766  1.1  mrg 	}
   4767  1.1  mrg 
   4768  1.1  mrg       gfc_set_model_kind (x->ts.kind);
   4769  1.1  mrg       mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   4770  1.1  mrg       break;
   4771  1.1  mrg 
   4772  1.1  mrg     default:
   4773  1.1  mrg       gfc_internal_error ("gfc_simplify_log: bad type");
   4774  1.1  mrg     }
   4775  1.1  mrg 
   4776  1.1  mrg   return range_check (result, "LOG");
   4777  1.1  mrg }
   4778  1.1  mrg 
   4779  1.1  mrg 
   4780  1.1  mrg gfc_expr *
   4781  1.1  mrg gfc_simplify_log10 (gfc_expr *x)
   4782  1.1  mrg {
   4783  1.1  mrg   gfc_expr *result;
   4784  1.1  mrg 
   4785  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   4786  1.1  mrg     return NULL;
   4787  1.1  mrg 
   4788  1.1  mrg   if (mpfr_sgn (x->value.real) <= 0)
   4789  1.1  mrg     {
   4790  1.1  mrg       gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
   4791  1.1  mrg 		 "to zero", &x->where);
   4792  1.1  mrg       return &gfc_bad_expr;
   4793  1.1  mrg     }
   4794  1.1  mrg 
   4795  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   4796  1.1  mrg   mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
   4797  1.1  mrg 
   4798  1.1  mrg   return range_check (result, "LOG10");
   4799  1.1  mrg }
   4800  1.1  mrg 
   4801  1.1  mrg 
   4802  1.1  mrg gfc_expr *
   4803  1.1  mrg gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
   4804  1.1  mrg {
   4805  1.1  mrg   int kind;
   4806  1.1  mrg 
   4807  1.1  mrg   kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
   4808  1.1  mrg   if (kind < 0)
   4809  1.1  mrg     return &gfc_bad_expr;
   4810  1.1  mrg 
   4811  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   4812  1.1  mrg     return NULL;
   4813  1.1  mrg 
   4814  1.1  mrg   return gfc_get_logical_expr (kind, &e->where, e->value.logical);
   4815  1.1  mrg }
   4816  1.1  mrg 
   4817  1.1  mrg 
   4818  1.1  mrg gfc_expr*
   4819  1.1  mrg gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
   4820  1.1  mrg {
   4821  1.1  mrg   gfc_expr *result;
   4822  1.1  mrg   int row, result_rows, col, result_columns;
   4823  1.1  mrg   int stride_a, offset_a, stride_b, offset_b;
   4824  1.1  mrg 
   4825  1.1  mrg   if (!is_constant_array_expr (matrix_a)
   4826  1.1  mrg       || !is_constant_array_expr (matrix_b))
   4827  1.1  mrg     return NULL;
   4828  1.1  mrg 
   4829  1.1  mrg   /* MATMUL should do mixed-mode arithmetic.  Set the result type.  */
   4830  1.1  mrg   if (matrix_a->ts.type != matrix_b->ts.type)
   4831  1.1  mrg     {
   4832  1.1  mrg       gfc_expr e;
   4833  1.1  mrg       e.expr_type = EXPR_OP;
   4834  1.1  mrg       gfc_clear_ts (&e.ts);
   4835  1.1  mrg       e.value.op.op = INTRINSIC_NONE;
   4836  1.1  mrg       e.value.op.op1 = matrix_a;
   4837  1.1  mrg       e.value.op.op2 = matrix_b;
   4838  1.1  mrg       gfc_type_convert_binary (&e, 1);
   4839  1.1  mrg       result = gfc_get_array_expr (e.ts.type, e.ts.kind, &matrix_a->where);
   4840  1.1  mrg     }
   4841  1.1  mrg   else
   4842  1.1  mrg     {
   4843  1.1  mrg       result = gfc_get_array_expr (matrix_a->ts.type, matrix_a->ts.kind,
   4844  1.1  mrg 				   &matrix_a->where);
   4845  1.1  mrg     }
   4846  1.1  mrg 
   4847  1.1  mrg   if (matrix_a->rank == 1 && matrix_b->rank == 2)
   4848  1.1  mrg     {
   4849  1.1  mrg       result_rows = 1;
   4850  1.1  mrg       result_columns = mpz_get_si (matrix_b->shape[1]);
   4851  1.1  mrg       stride_a = 1;
   4852  1.1  mrg       stride_b = mpz_get_si (matrix_b->shape[0]);
   4853  1.1  mrg 
   4854  1.1  mrg       result->rank = 1;
   4855  1.1  mrg       result->shape = gfc_get_shape (result->rank);
   4856  1.1  mrg       mpz_init_set_si (result->shape[0], result_columns);
   4857  1.1  mrg     }
   4858  1.1  mrg   else if (matrix_a->rank == 2 && matrix_b->rank == 1)
   4859  1.1  mrg     {
   4860  1.1  mrg       result_rows = mpz_get_si (matrix_a->shape[0]);
   4861  1.1  mrg       result_columns = 1;
   4862  1.1  mrg       stride_a = mpz_get_si (matrix_a->shape[0]);
   4863  1.1  mrg       stride_b = 1;
   4864  1.1  mrg 
   4865  1.1  mrg       result->rank = 1;
   4866  1.1  mrg       result->shape = gfc_get_shape (result->rank);
   4867  1.1  mrg       mpz_init_set_si (result->shape[0], result_rows);
   4868  1.1  mrg     }
   4869  1.1  mrg   else if (matrix_a->rank == 2 && matrix_b->rank == 2)
   4870  1.1  mrg     {
   4871  1.1  mrg       result_rows = mpz_get_si (matrix_a->shape[0]);
   4872  1.1  mrg       result_columns = mpz_get_si (matrix_b->shape[1]);
   4873  1.1  mrg       stride_a = mpz_get_si (matrix_a->shape[0]);
   4874  1.1  mrg       stride_b = mpz_get_si (matrix_b->shape[0]);
   4875  1.1  mrg 
   4876  1.1  mrg       result->rank = 2;
   4877  1.1  mrg       result->shape = gfc_get_shape (result->rank);
   4878  1.1  mrg       mpz_init_set_si (result->shape[0], result_rows);
   4879  1.1  mrg       mpz_init_set_si (result->shape[1], result_columns);
   4880  1.1  mrg     }
   4881  1.1  mrg   else
   4882  1.1  mrg     gcc_unreachable();
   4883  1.1  mrg 
   4884  1.1  mrg   offset_b = 0;
   4885  1.1  mrg   for (col = 0; col < result_columns; ++col)
   4886  1.1  mrg     {
   4887  1.1  mrg       offset_a = 0;
   4888  1.1  mrg 
   4889  1.1  mrg       for (row = 0; row < result_rows; ++row)
   4890  1.1  mrg 	{
   4891  1.1  mrg 	  gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
   4892  1.1  mrg 					     matrix_b, 1, offset_b, false);
   4893  1.1  mrg 	  gfc_constructor_append_expr (&result->value.constructor,
   4894  1.1  mrg 				       e, NULL);
   4895  1.1  mrg 
   4896  1.1  mrg 	  offset_a += 1;
   4897  1.1  mrg         }
   4898  1.1  mrg 
   4899  1.1  mrg       offset_b += stride_b;
   4900  1.1  mrg     }
   4901  1.1  mrg 
   4902  1.1  mrg   return result;
   4903  1.1  mrg }
   4904  1.1  mrg 
   4905  1.1  mrg 
   4906  1.1  mrg gfc_expr *
   4907  1.1  mrg gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
   4908  1.1  mrg {
   4909  1.1  mrg   gfc_expr *result;
   4910  1.1  mrg   int kind, arg, k;
   4911  1.1  mrg 
   4912  1.1  mrg   if (i->expr_type != EXPR_CONSTANT)
   4913  1.1  mrg     return NULL;
   4914  1.1  mrg 
   4915  1.1  mrg   kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind);
   4916  1.1  mrg   if (kind == -1)
   4917  1.1  mrg     return &gfc_bad_expr;
   4918  1.1  mrg   k = gfc_validate_kind (BT_INTEGER, kind, false);
   4919  1.1  mrg 
   4920  1.1  mrg   bool fail = gfc_extract_int (i, &arg);
   4921  1.1  mrg   gcc_assert (!fail);
   4922  1.1  mrg 
   4923  1.1  mrg   if (!gfc_check_mask (i, kind_arg))
   4924  1.1  mrg     return &gfc_bad_expr;
   4925  1.1  mrg 
   4926  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
   4927  1.1  mrg 
   4928  1.1  mrg   /* MASKR(n) = 2^n - 1 */
   4929  1.1  mrg   mpz_set_ui (result->value.integer, 1);
   4930  1.1  mrg   mpz_mul_2exp (result->value.integer, result->value.integer, arg);
   4931  1.1  mrg   mpz_sub_ui (result->value.integer, result->value.integer, 1);
   4932  1.1  mrg 
   4933  1.1  mrg   gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
   4934  1.1  mrg 
   4935  1.1  mrg   return result;
   4936  1.1  mrg }
   4937  1.1  mrg 
   4938  1.1  mrg 
   4939  1.1  mrg gfc_expr *
   4940  1.1  mrg gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
   4941  1.1  mrg {
   4942  1.1  mrg   gfc_expr *result;
   4943  1.1  mrg   int kind, arg, k;
   4944  1.1  mrg   mpz_t z;
   4945  1.1  mrg 
   4946  1.1  mrg   if (i->expr_type != EXPR_CONSTANT)
   4947  1.1  mrg     return NULL;
   4948  1.1  mrg 
   4949  1.1  mrg   kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind);
   4950  1.1  mrg   if (kind == -1)
   4951  1.1  mrg     return &gfc_bad_expr;
   4952  1.1  mrg   k = gfc_validate_kind (BT_INTEGER, kind, false);
   4953  1.1  mrg 
   4954  1.1  mrg   bool fail = gfc_extract_int (i, &arg);
   4955  1.1  mrg   gcc_assert (!fail);
   4956  1.1  mrg 
   4957  1.1  mrg   if (!gfc_check_mask (i, kind_arg))
   4958  1.1  mrg     return &gfc_bad_expr;
   4959  1.1  mrg 
   4960  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
   4961  1.1  mrg 
   4962  1.1  mrg   /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
   4963  1.1  mrg   mpz_init_set_ui (z, 1);
   4964  1.1  mrg   mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size);
   4965  1.1  mrg   mpz_set_ui (result->value.integer, 1);
   4966  1.1  mrg   mpz_mul_2exp (result->value.integer, result->value.integer,
   4967  1.1  mrg 		gfc_integer_kinds[k].bit_size - arg);
   4968  1.1  mrg   mpz_sub (result->value.integer, z, result->value.integer);
   4969  1.1  mrg   mpz_clear (z);
   4970  1.1  mrg 
   4971  1.1  mrg   gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
   4972  1.1  mrg 
   4973  1.1  mrg   return result;
   4974  1.1  mrg }
   4975  1.1  mrg 
   4976  1.1  mrg 
   4977  1.1  mrg gfc_expr *
   4978  1.1  mrg gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
   4979  1.1  mrg {
   4980  1.1  mrg   gfc_expr * result;
   4981  1.1  mrg   gfc_constructor *tsource_ctor, *fsource_ctor, *mask_ctor;
   4982  1.1  mrg 
   4983  1.1  mrg   if (mask->expr_type == EXPR_CONSTANT)
   4984  1.1  mrg     {
   4985  1.1  mrg       result = gfc_copy_expr (mask->value.logical ? tsource : fsource);
   4986  1.1  mrg       /* Parenthesis is needed to get lower bounds of 1.  */
   4987  1.1  mrg       result = gfc_get_parentheses (result);
   4988  1.1  mrg       gfc_simplify_expr (result, 1);
   4989  1.1  mrg       return result;
   4990  1.1  mrg     }
   4991  1.1  mrg 
   4992  1.1  mrg   if (!mask->rank || !is_constant_array_expr (mask)
   4993  1.1  mrg       || !is_constant_array_expr (tsource) || !is_constant_array_expr (fsource))
   4994  1.1  mrg     return NULL;
   4995  1.1  mrg 
   4996  1.1  mrg   result = gfc_get_array_expr (tsource->ts.type, tsource->ts.kind,
   4997  1.1  mrg 			       &tsource->where);
   4998  1.1  mrg   if (tsource->ts.type == BT_DERIVED)
   4999  1.1  mrg     result->ts.u.derived = tsource->ts.u.derived;
   5000  1.1  mrg   else if (tsource->ts.type == BT_CHARACTER)
   5001  1.1  mrg     result->ts.u.cl = tsource->ts.u.cl;
   5002  1.1  mrg 
   5003  1.1  mrg   tsource_ctor = gfc_constructor_first (tsource->value.constructor);
   5004  1.1  mrg   fsource_ctor = gfc_constructor_first (fsource->value.constructor);
   5005  1.1  mrg   mask_ctor = gfc_constructor_first (mask->value.constructor);
   5006  1.1  mrg 
   5007  1.1  mrg   while (mask_ctor)
   5008  1.1  mrg     {
   5009  1.1  mrg       if (mask_ctor->expr->value.logical)
   5010  1.1  mrg 	gfc_constructor_append_expr (&result->value.constructor,
   5011  1.1  mrg 				     gfc_copy_expr (tsource_ctor->expr),
   5012  1.1  mrg 				     NULL);
   5013  1.1  mrg       else
   5014  1.1  mrg 	gfc_constructor_append_expr (&result->value.constructor,
   5015  1.1  mrg 				     gfc_copy_expr (fsource_ctor->expr),
   5016  1.1  mrg 				     NULL);
   5017  1.1  mrg       tsource_ctor = gfc_constructor_next (tsource_ctor);
   5018  1.1  mrg       fsource_ctor = gfc_constructor_next (fsource_ctor);
   5019  1.1  mrg       mask_ctor = gfc_constructor_next (mask_ctor);
   5020  1.1  mrg     }
   5021  1.1  mrg 
   5022  1.1  mrg   result->shape = gfc_get_shape (1);
   5023  1.1  mrg   gfc_array_size (result, &result->shape[0]);
   5024  1.1  mrg 
   5025  1.1  mrg   return result;
   5026  1.1  mrg }
   5027  1.1  mrg 
   5028  1.1  mrg 
   5029  1.1  mrg gfc_expr *
   5030  1.1  mrg gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr)
   5031  1.1  mrg {
   5032  1.1  mrg   mpz_t arg1, arg2, mask;
   5033  1.1  mrg   gfc_expr *result;
   5034  1.1  mrg 
   5035  1.1  mrg   if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT
   5036  1.1  mrg       || mask_expr->expr_type != EXPR_CONSTANT)
   5037  1.1  mrg     return NULL;
   5038  1.1  mrg 
   5039  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where);
   5040  1.1  mrg 
   5041  1.1  mrg   /* Convert all argument to unsigned.  */
   5042  1.1  mrg   mpz_init_set (arg1, i->value.integer);
   5043  1.1  mrg   mpz_init_set (arg2, j->value.integer);
   5044  1.1  mrg   mpz_init_set (mask, mask_expr->value.integer);
   5045  1.1  mrg 
   5046  1.1  mrg   /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))).  */
   5047  1.1  mrg   mpz_and (arg1, arg1, mask);
   5048  1.1  mrg   mpz_com (mask, mask);
   5049  1.1  mrg   mpz_and (arg2, arg2, mask);
   5050  1.1  mrg   mpz_ior (result->value.integer, arg1, arg2);
   5051  1.1  mrg 
   5052  1.1  mrg   mpz_clear (arg1);
   5053  1.1  mrg   mpz_clear (arg2);
   5054  1.1  mrg   mpz_clear (mask);
   5055  1.1  mrg 
   5056  1.1  mrg   return result;
   5057  1.1  mrg }
   5058  1.1  mrg 
   5059  1.1  mrg 
   5060  1.1  mrg /* Selects between current value and extremum for simplify_min_max
   5061  1.1  mrg    and simplify_minval_maxval.  */
   5062  1.1  mrg static int
   5063  1.1  mrg min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign, bool back_val)
   5064  1.1  mrg {
   5065  1.1  mrg   int ret;
   5066  1.1  mrg 
   5067  1.1  mrg   switch (arg->ts.type)
   5068  1.1  mrg     {
   5069  1.1  mrg       case BT_INTEGER:
   5070  1.1  mrg 	if (extremum->ts.kind < arg->ts.kind)
   5071  1.1  mrg 	  extremum->ts.kind = arg->ts.kind;
   5072  1.1  mrg 	ret = mpz_cmp (arg->value.integer,
   5073  1.1  mrg 		       extremum->value.integer) * sign;
   5074  1.1  mrg 	if (ret > 0)
   5075  1.1  mrg 	  mpz_set (extremum->value.integer, arg->value.integer);
   5076  1.1  mrg 	break;
   5077  1.1  mrg 
   5078  1.1  mrg       case BT_REAL:
   5079  1.1  mrg 	if (extremum->ts.kind < arg->ts.kind)
   5080  1.1  mrg 	  extremum->ts.kind = arg->ts.kind;
   5081  1.1  mrg 	if (mpfr_nan_p (extremum->value.real))
   5082  1.1  mrg 	  {
   5083  1.1  mrg 	    ret = 1;
   5084  1.1  mrg 	    mpfr_set (extremum->value.real, arg->value.real, GFC_RND_MODE);
   5085  1.1  mrg 	  }
   5086  1.1  mrg 	else if (mpfr_nan_p (arg->value.real))
   5087  1.1  mrg 	  ret = -1;
   5088  1.1  mrg 	else
   5089  1.1  mrg 	  {
   5090  1.1  mrg 	    ret = mpfr_cmp (arg->value.real, extremum->value.real) * sign;
   5091  1.1  mrg 	    if (ret > 0)
   5092  1.1  mrg 	      mpfr_set (extremum->value.real, arg->value.real, GFC_RND_MODE);
   5093  1.1  mrg 	  }
   5094  1.1  mrg 	break;
   5095  1.1  mrg 
   5096  1.1  mrg       case BT_CHARACTER:
   5097  1.1  mrg #define LENGTH(x) ((x)->value.character.length)
   5098  1.1  mrg #define STRING(x) ((x)->value.character.string)
   5099  1.1  mrg 	if (LENGTH (extremum) < LENGTH(arg))
   5100  1.1  mrg 	  {
   5101  1.1  mrg 	    gfc_char_t *tmp = STRING(extremum);
   5102  1.1  mrg 
   5103  1.1  mrg 	    STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
   5104  1.1  mrg 	    memcpy (STRING(extremum), tmp,
   5105  1.1  mrg 		      LENGTH(extremum) * sizeof (gfc_char_t));
   5106  1.1  mrg 	    gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
   5107  1.1  mrg 			       LENGTH(arg) - LENGTH(extremum));
   5108  1.1  mrg 	    STRING(extremum)[LENGTH(arg)] = '\0';  /* For debugger  */
   5109  1.1  mrg 	    LENGTH(extremum) = LENGTH(arg);
   5110  1.1  mrg 	    free (tmp);
   5111  1.1  mrg 	  }
   5112  1.1  mrg 	ret = gfc_compare_string (arg, extremum) * sign;
   5113  1.1  mrg 	if (ret > 0)
   5114  1.1  mrg 	  {
   5115  1.1  mrg 	    free (STRING(extremum));
   5116  1.1  mrg 	    STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
   5117  1.1  mrg 	    memcpy (STRING(extremum), STRING(arg),
   5118  1.1  mrg 		      LENGTH(arg) * sizeof (gfc_char_t));
   5119  1.1  mrg 	    gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
   5120  1.1  mrg 			       LENGTH(extremum) - LENGTH(arg));
   5121  1.1  mrg 	    STRING(extremum)[LENGTH(extremum)] = '\0';  /* For debugger  */
   5122  1.1  mrg 	  }
   5123  1.1  mrg #undef LENGTH
   5124  1.1  mrg #undef STRING
   5125  1.1  mrg 	break;
   5126  1.1  mrg 
   5127  1.1  mrg       default:
   5128  1.1  mrg 	gfc_internal_error ("simplify_min_max(): Bad type in arglist");
   5129  1.1  mrg     }
   5130  1.1  mrg   if (back_val && ret == 0)
   5131  1.1  mrg     ret = 1;
   5132  1.1  mrg 
   5133  1.1  mrg   return ret;
   5134  1.1  mrg }
   5135  1.1  mrg 
   5136  1.1  mrg 
   5137  1.1  mrg /* This function is special since MAX() can take any number of
   5138  1.1  mrg    arguments.  The simplified expression is a rewritten version of the
   5139  1.1  mrg    argument list containing at most one constant element.  Other
   5140  1.1  mrg    constant elements are deleted.  Because the argument list has
   5141  1.1  mrg    already been checked, this function always succeeds.  sign is 1 for
   5142  1.1  mrg    MAX(), -1 for MIN().  */
   5143  1.1  mrg 
   5144  1.1  mrg static gfc_expr *
   5145  1.1  mrg simplify_min_max (gfc_expr *expr, int sign)
   5146  1.1  mrg {
   5147  1.1  mrg   int tmp1, tmp2;
   5148  1.1  mrg   gfc_actual_arglist *arg, *last, *extremum;
   5149  1.1  mrg   gfc_expr *tmp, *ret;
   5150  1.1  mrg   const char *fname;
   5151  1.1  mrg 
   5152  1.1  mrg   last = NULL;
   5153  1.1  mrg   extremum = NULL;
   5154  1.1  mrg 
   5155  1.1  mrg   arg = expr->value.function.actual;
   5156  1.1  mrg 
   5157  1.1  mrg   for (; arg; last = arg, arg = arg->next)
   5158  1.1  mrg     {
   5159  1.1  mrg       if (arg->expr->expr_type != EXPR_CONSTANT)
   5160  1.1  mrg 	continue;
   5161  1.1  mrg 
   5162  1.1  mrg       if (extremum == NULL)
   5163  1.1  mrg 	{
   5164  1.1  mrg 	  extremum = arg;
   5165  1.1  mrg 	  continue;
   5166  1.1  mrg 	}
   5167  1.1  mrg 
   5168  1.1  mrg       min_max_choose (arg->expr, extremum->expr, sign);
   5169  1.1  mrg 
   5170  1.1  mrg       /* Delete the extra constant argument.  */
   5171  1.1  mrg       last->next = arg->next;
   5172  1.1  mrg 
   5173  1.1  mrg       arg->next = NULL;
   5174  1.1  mrg       gfc_free_actual_arglist (arg);
   5175  1.1  mrg       arg = last;
   5176  1.1  mrg     }
   5177  1.1  mrg 
   5178  1.1  mrg   /* If there is one value left, replace the function call with the
   5179  1.1  mrg      expression.  */
   5180  1.1  mrg   if (expr->value.function.actual->next != NULL)
   5181  1.1  mrg     return NULL;
   5182  1.1  mrg 
   5183  1.1  mrg   /* Handle special cases of specific functions (min|max)1 and
   5184  1.1  mrg      a(min|max)0.  */
   5185  1.1  mrg 
   5186  1.1  mrg   tmp = expr->value.function.actual->expr;
   5187  1.1  mrg   fname = expr->value.function.isym->name;
   5188  1.1  mrg 
   5189  1.1  mrg   if ((tmp->ts.type != BT_INTEGER || tmp->ts.kind != gfc_integer_4_kind)
   5190  1.1  mrg       && (strcmp (fname, "min1") == 0 || strcmp (fname, "max1") == 0))
   5191  1.1  mrg     {
   5192  1.1  mrg       /* Explicit conversion, turn off -Wconversion and -Wconversion-extra
   5193  1.1  mrg 	 warnings.  */
   5194  1.1  mrg       tmp1 = warn_conversion;
   5195  1.1  mrg       tmp2 = warn_conversion_extra;
   5196  1.1  mrg       warn_conversion = warn_conversion_extra = 0;
   5197  1.1  mrg 
   5198  1.1  mrg       ret = gfc_convert_constant (tmp, BT_INTEGER, gfc_integer_4_kind);
   5199  1.1  mrg 
   5200  1.1  mrg       warn_conversion = tmp1;
   5201  1.1  mrg       warn_conversion_extra = tmp2;
   5202  1.1  mrg     }
   5203  1.1  mrg   else if ((tmp->ts.type != BT_REAL || tmp->ts.kind != gfc_real_4_kind)
   5204  1.1  mrg 	   && (strcmp (fname, "amin0") == 0 || strcmp (fname, "amax0") == 0))
   5205  1.1  mrg     {
   5206  1.1  mrg       ret = gfc_convert_constant (tmp, BT_REAL, gfc_real_4_kind);
   5207  1.1  mrg     }
   5208  1.1  mrg   else
   5209  1.1  mrg     ret = gfc_copy_expr (tmp);
   5210  1.1  mrg 
   5211  1.1  mrg   return ret;
   5212  1.1  mrg 
   5213  1.1  mrg }
   5214  1.1  mrg 
   5215  1.1  mrg 
   5216  1.1  mrg gfc_expr *
   5217  1.1  mrg gfc_simplify_min (gfc_expr *e)
   5218  1.1  mrg {
   5219  1.1  mrg   return simplify_min_max (e, -1);
   5220  1.1  mrg }
   5221  1.1  mrg 
   5222  1.1  mrg 
   5223  1.1  mrg gfc_expr *
   5224  1.1  mrg gfc_simplify_max (gfc_expr *e)
   5225  1.1  mrg {
   5226  1.1  mrg   return simplify_min_max (e, 1);
   5227  1.1  mrg }
   5228  1.1  mrg 
   5229  1.1  mrg /* Helper function for gfc_simplify_minval.  */
   5230  1.1  mrg 
   5231  1.1  mrg static gfc_expr *
   5232  1.1  mrg gfc_min (gfc_expr *op1, gfc_expr *op2)
   5233  1.1  mrg {
   5234  1.1  mrg   min_max_choose (op1, op2, -1);
   5235  1.1  mrg   gfc_free_expr (op1);
   5236  1.1  mrg   return op2;
   5237  1.1  mrg }
   5238  1.1  mrg 
   5239  1.1  mrg /* Simplify minval for constant arrays.  */
   5240  1.1  mrg 
   5241  1.1  mrg gfc_expr *
   5242  1.1  mrg gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
   5243  1.1  mrg {
   5244  1.1  mrg   return simplify_transformation (array, dim, mask, INT_MAX, gfc_min);
   5245  1.1  mrg }
   5246  1.1  mrg 
   5247  1.1  mrg /* Helper function for gfc_simplify_maxval.  */
   5248  1.1  mrg 
   5249  1.1  mrg static gfc_expr *
   5250  1.1  mrg gfc_max (gfc_expr *op1, gfc_expr *op2)
   5251  1.1  mrg {
   5252  1.1  mrg   min_max_choose (op1, op2, 1);
   5253  1.1  mrg   gfc_free_expr (op1);
   5254  1.1  mrg   return op2;
   5255  1.1  mrg }
   5256  1.1  mrg 
   5257  1.1  mrg 
   5258  1.1  mrg /* Simplify maxval for constant arrays.  */
   5259  1.1  mrg 
   5260  1.1  mrg gfc_expr *
   5261  1.1  mrg gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
   5262  1.1  mrg {
   5263  1.1  mrg   return simplify_transformation (array, dim, mask, INT_MIN, gfc_max);
   5264  1.1  mrg }
   5265  1.1  mrg 
   5266  1.1  mrg 
   5267  1.1  mrg /* Transform minloc or maxloc of an array, according to MASK,
   5268  1.1  mrg    to the scalar result.  This code is mostly identical to
   5269  1.1  mrg    simplify_transformation_to_scalar.  */
   5270  1.1  mrg 
   5271  1.1  mrg static gfc_expr *
   5272  1.1  mrg simplify_minmaxloc_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
   5273  1.1  mrg 			      gfc_expr *extremum, int sign, bool back_val)
   5274  1.1  mrg {
   5275  1.1  mrg   gfc_expr *a, *m;
   5276  1.1  mrg   gfc_constructor *array_ctor, *mask_ctor;
   5277  1.1  mrg   mpz_t count;
   5278  1.1  mrg 
   5279  1.1  mrg   mpz_set_si (result->value.integer, 0);
   5280  1.1  mrg 
   5281  1.1  mrg 
   5282  1.1  mrg   /* Shortcut for constant .FALSE. MASK.  */
   5283  1.1  mrg   if (mask
   5284  1.1  mrg       && mask->expr_type == EXPR_CONSTANT
   5285  1.1  mrg       && !mask->value.logical)
   5286  1.1  mrg     return result;
   5287  1.1  mrg 
   5288  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
   5289  1.1  mrg   if (mask && mask->expr_type == EXPR_ARRAY)
   5290  1.1  mrg     mask_ctor = gfc_constructor_first (mask->value.constructor);
   5291  1.1  mrg   else
   5292  1.1  mrg     mask_ctor = NULL;
   5293  1.1  mrg 
   5294  1.1  mrg   mpz_init_set_si (count, 0);
   5295  1.1  mrg   while (array_ctor)
   5296  1.1  mrg     {
   5297  1.1  mrg       mpz_add_ui (count, count, 1);
   5298  1.1  mrg       a = array_ctor->expr;
   5299  1.1  mrg       array_ctor = gfc_constructor_next (array_ctor);
   5300  1.1  mrg       /* A constant MASK equals .TRUE. here and can be ignored.  */
   5301  1.1  mrg       if (mask_ctor)
   5302  1.1  mrg 	{
   5303  1.1  mrg 	  m = mask_ctor->expr;
   5304  1.1  mrg 	  mask_ctor = gfc_constructor_next (mask_ctor);
   5305  1.1  mrg 	  if (!m->value.logical)
   5306  1.1  mrg 	    continue;
   5307  1.1  mrg 	}
   5308  1.1  mrg       if (min_max_choose (a, extremum, sign, back_val) > 0)
   5309  1.1  mrg 	mpz_set (result->value.integer, count);
   5310  1.1  mrg     }
   5311  1.1  mrg   mpz_clear (count);
   5312  1.1  mrg   gfc_free_expr (extremum);
   5313  1.1  mrg   return result;
   5314  1.1  mrg }
   5315  1.1  mrg 
   5316  1.1  mrg /* Simplify minloc / maxloc in the absence of a dim argument.  */
   5317  1.1  mrg 
   5318  1.1  mrg static gfc_expr *
   5319  1.1  mrg simplify_minmaxloc_nodim (gfc_expr *result, gfc_expr *extremum,
   5320  1.1  mrg 			  gfc_expr *array, gfc_expr *mask, int sign,
   5321  1.1  mrg 			  bool back_val)
   5322  1.1  mrg {
   5323  1.1  mrg   ssize_t res[GFC_MAX_DIMENSIONS];
   5324  1.1  mrg   int i, n;
   5325  1.1  mrg   gfc_constructor *result_ctor, *array_ctor, *mask_ctor;
   5326  1.1  mrg   ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
   5327  1.1  mrg     sstride[GFC_MAX_DIMENSIONS];
   5328  1.1  mrg   gfc_expr *a, *m;
   5329  1.1  mrg   bool continue_loop;
   5330  1.1  mrg   bool ma;
   5331  1.1  mrg 
   5332  1.1  mrg   for (i = 0; i<array->rank; i++)
   5333  1.1  mrg     res[i] = -1;
   5334  1.1  mrg 
   5335  1.1  mrg   /* Shortcut for constant .FALSE. MASK.  */
   5336  1.1  mrg   if (mask
   5337  1.1  mrg       && mask->expr_type == EXPR_CONSTANT
   5338  1.1  mrg       && !mask->value.logical)
   5339  1.1  mrg     goto finish;
   5340  1.1  mrg 
   5341  1.1  mrg   if (array->shape == NULL)
   5342  1.1  mrg     goto finish;
   5343  1.1  mrg 
   5344  1.1  mrg   for (i = 0; i < array->rank; i++)
   5345  1.1  mrg     {
   5346  1.1  mrg       count[i] = 0;
   5347  1.1  mrg       sstride[i] = (i == 0) ? 1 : sstride[i-1] * mpz_get_si (array->shape[i-1]);
   5348  1.1  mrg       extent[i] = mpz_get_si (array->shape[i]);
   5349  1.1  mrg       if (extent[i] <= 0)
   5350  1.1  mrg 	goto finish;
   5351  1.1  mrg     }
   5352  1.1  mrg 
   5353  1.1  mrg   continue_loop = true;
   5354  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
   5355  1.1  mrg   if (mask && mask->rank > 0)
   5356  1.1  mrg     mask_ctor = gfc_constructor_first (mask->value.constructor);
   5357  1.1  mrg   else
   5358  1.1  mrg     mask_ctor = NULL;
   5359  1.1  mrg 
   5360  1.1  mrg   /* Loop over the array elements (and mask), keeping track of
   5361  1.1  mrg      the indices to return.  */
   5362  1.1  mrg   while (continue_loop)
   5363  1.1  mrg     {
   5364  1.1  mrg       do
   5365  1.1  mrg 	{
   5366  1.1  mrg 	  a = array_ctor->expr;
   5367  1.1  mrg 	  if (mask_ctor)
   5368  1.1  mrg 	    {
   5369  1.1  mrg 	      m = mask_ctor->expr;
   5370  1.1  mrg 	      ma = m->value.logical;
   5371  1.1  mrg 	      mask_ctor = gfc_constructor_next (mask_ctor);
   5372  1.1  mrg 	    }
   5373  1.1  mrg 	  else
   5374  1.1  mrg 	    ma = true;
   5375  1.1  mrg 
   5376  1.1  mrg 	  if (ma && min_max_choose (a, extremum, sign, back_val) > 0)
   5377  1.1  mrg 	    {
   5378  1.1  mrg 	      for (i = 0; i<array->rank; i++)
   5379  1.1  mrg 		res[i] = count[i];
   5380  1.1  mrg 	    }
   5381  1.1  mrg 	  array_ctor = gfc_constructor_next (array_ctor);
   5382  1.1  mrg 	  count[0] ++;
   5383  1.1  mrg 	} while (count[0] != extent[0]);
   5384  1.1  mrg       n = 0;
   5385  1.1  mrg       do
   5386  1.1  mrg 	{
   5387  1.1  mrg 	  /* When we get to the end of a dimension, reset it and increment
   5388  1.1  mrg 	     the next dimension.  */
   5389  1.1  mrg 	  count[n] = 0;
   5390  1.1  mrg 	  n++;
   5391  1.1  mrg 	  if (n >= array->rank)
   5392  1.1  mrg 	    {
   5393  1.1  mrg 	      continue_loop = false;
   5394  1.1  mrg 	      break;
   5395  1.1  mrg 	    }
   5396  1.1  mrg 	  else
   5397  1.1  mrg 	    count[n] ++;
   5398  1.1  mrg 	} while (count[n] == extent[n]);
   5399  1.1  mrg     }
   5400  1.1  mrg 
   5401  1.1  mrg  finish:
   5402  1.1  mrg   gfc_free_expr (extremum);
   5403  1.1  mrg   result_ctor = gfc_constructor_first (result->value.constructor);
   5404  1.1  mrg   for (i = 0; i<array->rank; i++)
   5405  1.1  mrg     {
   5406  1.1  mrg       gfc_expr *r_expr;
   5407  1.1  mrg       r_expr = result_ctor->expr;
   5408  1.1  mrg       mpz_set_si (r_expr->value.integer, res[i] + 1);
   5409  1.1  mrg       result_ctor = gfc_constructor_next (result_ctor);
   5410  1.1  mrg     }
   5411  1.1  mrg   return result;
   5412  1.1  mrg }
   5413  1.1  mrg 
   5414  1.1  mrg /* Helper function for gfc_simplify_minmaxloc - build an array
   5415  1.1  mrg    expression with n elements.  */
   5416  1.1  mrg 
   5417  1.1  mrg static gfc_expr *
   5418  1.1  mrg new_array (bt type, int kind, int n, locus *where)
   5419  1.1  mrg {
   5420  1.1  mrg   gfc_expr *result;
   5421  1.1  mrg   int i;
   5422  1.1  mrg 
   5423  1.1  mrg   result = gfc_get_array_expr (type, kind, where);
   5424  1.1  mrg   result->rank = 1;
   5425  1.1  mrg   result->shape = gfc_get_shape(1);
   5426  1.1  mrg   mpz_init_set_si (result->shape[0], n);
   5427  1.1  mrg   for (i = 0; i < n; i++)
   5428  1.1  mrg     {
   5429  1.1  mrg       gfc_constructor_append_expr (&result->value.constructor,
   5430  1.1  mrg 				   gfc_get_constant_expr (type, kind, where),
   5431  1.1  mrg 				   NULL);
   5432  1.1  mrg     }
   5433  1.1  mrg 
   5434  1.1  mrg   return result;
   5435  1.1  mrg }
   5436  1.1  mrg 
   5437  1.1  mrg /* Simplify minloc and maxloc. This code is mostly identical to
   5438  1.1  mrg    simplify_transformation_to_array.  */
   5439  1.1  mrg 
   5440  1.1  mrg static gfc_expr *
   5441  1.1  mrg simplify_minmaxloc_to_array (gfc_expr *result, gfc_expr *array,
   5442  1.1  mrg 			     gfc_expr *dim, gfc_expr *mask,
   5443  1.1  mrg 			     gfc_expr *extremum, int sign, bool back_val)
   5444  1.1  mrg {
   5445  1.1  mrg   mpz_t size;
   5446  1.1  mrg   int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
   5447  1.1  mrg   gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
   5448  1.1  mrg   gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
   5449  1.1  mrg 
   5450  1.1  mrg   int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
   5451  1.1  mrg       sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
   5452  1.1  mrg       tmpstride[GFC_MAX_DIMENSIONS];
   5453  1.1  mrg 
   5454  1.1  mrg   /* Shortcut for constant .FALSE. MASK.  */
   5455  1.1  mrg   if (mask
   5456  1.1  mrg       && mask->expr_type == EXPR_CONSTANT
   5457  1.1  mrg       && !mask->value.logical)
   5458  1.1  mrg     return result;
   5459  1.1  mrg 
   5460  1.1  mrg   /* Build an indexed table for array element expressions to minimize
   5461  1.1  mrg      linked-list traversal. Masked elements are set to NULL.  */
   5462  1.1  mrg   gfc_array_size (array, &size);
   5463  1.1  mrg   arraysize = mpz_get_ui (size);
   5464  1.1  mrg   mpz_clear (size);
   5465  1.1  mrg 
   5466  1.1  mrg   arrayvec = XCNEWVEC (gfc_expr*, arraysize);
   5467  1.1  mrg 
   5468  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
   5469  1.1  mrg   mask_ctor = NULL;
   5470  1.1  mrg   if (mask && mask->expr_type == EXPR_ARRAY)
   5471  1.1  mrg     mask_ctor = gfc_constructor_first (mask->value.constructor);
   5472  1.1  mrg 
   5473  1.1  mrg   for (i = 0; i < arraysize; ++i)
   5474  1.1  mrg     {
   5475  1.1  mrg       arrayvec[i] = array_ctor->expr;
   5476  1.1  mrg       array_ctor = gfc_constructor_next (array_ctor);
   5477  1.1  mrg 
   5478  1.1  mrg       if (mask_ctor)
   5479  1.1  mrg 	{
   5480  1.1  mrg 	  if (!mask_ctor->expr->value.logical)
   5481  1.1  mrg 	    arrayvec[i] = NULL;
   5482  1.1  mrg 
   5483  1.1  mrg 	  mask_ctor = gfc_constructor_next (mask_ctor);
   5484  1.1  mrg 	}
   5485  1.1  mrg     }
   5486  1.1  mrg 
   5487  1.1  mrg   /* Same for the result expression.  */
   5488  1.1  mrg   gfc_array_size (result, &size);
   5489  1.1  mrg   resultsize = mpz_get_ui (size);
   5490  1.1  mrg   mpz_clear (size);
   5491  1.1  mrg 
   5492  1.1  mrg   resultvec = XCNEWVEC (gfc_expr*, resultsize);
   5493  1.1  mrg   result_ctor = gfc_constructor_first (result->value.constructor);
   5494  1.1  mrg   for (i = 0; i < resultsize; ++i)
   5495  1.1  mrg     {
   5496  1.1  mrg       resultvec[i] = result_ctor->expr;
   5497  1.1  mrg       result_ctor = gfc_constructor_next (result_ctor);
   5498  1.1  mrg     }
   5499  1.1  mrg 
   5500  1.1  mrg   gfc_extract_int (dim, &dim_index);
   5501  1.1  mrg   dim_index -= 1;               /* zero-base index */
   5502  1.1  mrg   dim_extent = 0;
   5503  1.1  mrg   dim_stride = 0;
   5504  1.1  mrg 
   5505  1.1  mrg   for (i = 0, n = 0; i < array->rank; ++i)
   5506  1.1  mrg     {
   5507  1.1  mrg       count[i] = 0;
   5508  1.1  mrg       tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
   5509  1.1  mrg       if (i == dim_index)
   5510  1.1  mrg 	{
   5511  1.1  mrg 	  dim_extent = mpz_get_si (array->shape[i]);
   5512  1.1  mrg 	  dim_stride = tmpstride[i];
   5513  1.1  mrg 	  continue;
   5514  1.1  mrg 	}
   5515  1.1  mrg 
   5516  1.1  mrg       extent[n] = mpz_get_si (array->shape[i]);
   5517  1.1  mrg       sstride[n] = tmpstride[i];
   5518  1.1  mrg       dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
   5519  1.1  mrg       n += 1;
   5520  1.1  mrg     }
   5521  1.1  mrg 
   5522  1.1  mrg   done = resultsize <= 0;
   5523  1.1  mrg   base = arrayvec;
   5524  1.1  mrg   dest = resultvec;
   5525  1.1  mrg   while (!done)
   5526  1.1  mrg     {
   5527  1.1  mrg       gfc_expr *ex;
   5528  1.1  mrg       ex = gfc_copy_expr (extremum);
   5529  1.1  mrg       for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
   5530  1.1  mrg 	{
   5531  1.1  mrg 	  if (*src && min_max_choose (*src, ex, sign, back_val) > 0)
   5532  1.1  mrg 	    mpz_set_si ((*dest)->value.integer, n + 1);
   5533  1.1  mrg 	}
   5534  1.1  mrg 
   5535  1.1  mrg       count[0]++;
   5536  1.1  mrg       base += sstride[0];
   5537  1.1  mrg       dest += dstride[0];
   5538  1.1  mrg       gfc_free_expr (ex);
   5539  1.1  mrg 
   5540  1.1  mrg       n = 0;
   5541  1.1  mrg       while (!done && count[n] == extent[n])
   5542  1.1  mrg 	{
   5543  1.1  mrg 	  count[n] = 0;
   5544  1.1  mrg 	  base -= sstride[n] * extent[n];
   5545  1.1  mrg 	  dest -= dstride[n] * extent[n];
   5546  1.1  mrg 
   5547  1.1  mrg 	  n++;
   5548  1.1  mrg 	  if (n < result->rank)
   5549  1.1  mrg 	    {
   5550  1.1  mrg 	      /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
   5551  1.1  mrg 		 times, we'd warn for the last iteration, because the
   5552  1.1  mrg 		 array index will have already been incremented to the
   5553  1.1  mrg 		 array sizes, and we can't tell that this must make
   5554  1.1  mrg 		 the test against result->rank false, because ranks
   5555  1.1  mrg 		 must not exceed GFC_MAX_DIMENSIONS.  */
   5556  1.1  mrg 	      GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray-bounds)
   5557  1.1  mrg 	      count[n]++;
   5558  1.1  mrg 	      base += sstride[n];
   5559  1.1  mrg 	      dest += dstride[n];
   5560  1.1  mrg 	      GCC_DIAGNOSTIC_POP
   5561  1.1  mrg 	    }
   5562  1.1  mrg 	  else
   5563  1.1  mrg 	    done = true;
   5564  1.1  mrg        }
   5565  1.1  mrg     }
   5566  1.1  mrg 
   5567  1.1  mrg   /* Place updated expression in result constructor.  */
   5568  1.1  mrg   result_ctor = gfc_constructor_first (result->value.constructor);
   5569  1.1  mrg   for (i = 0; i < resultsize; ++i)
   5570  1.1  mrg     {
   5571  1.1  mrg       result_ctor->expr = resultvec[i];
   5572  1.1  mrg       result_ctor = gfc_constructor_next (result_ctor);
   5573  1.1  mrg     }
   5574  1.1  mrg 
   5575  1.1  mrg   free (arrayvec);
   5576  1.1  mrg   free (resultvec);
   5577  1.1  mrg   free (extremum);
   5578  1.1  mrg   return result;
   5579  1.1  mrg }
   5580  1.1  mrg 
   5581  1.1  mrg /* Simplify minloc and maxloc for constant arrays.  */
   5582  1.1  mrg 
   5583  1.1  mrg static gfc_expr *
   5584  1.1  mrg gfc_simplify_minmaxloc (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
   5585  1.1  mrg 			gfc_expr *kind, gfc_expr *back, int sign)
   5586  1.1  mrg {
   5587  1.1  mrg   gfc_expr *result;
   5588  1.1  mrg   gfc_expr *extremum;
   5589  1.1  mrg   int ikind;
   5590  1.1  mrg   int init_val;
   5591  1.1  mrg   bool back_val = false;
   5592  1.1  mrg 
   5593  1.1  mrg   if (!is_constant_array_expr (array)
   5594  1.1  mrg       || !gfc_is_constant_expr (dim))
   5595  1.1  mrg     return NULL;
   5596  1.1  mrg 
   5597  1.1  mrg   if (mask
   5598  1.1  mrg       && !is_constant_array_expr (mask)
   5599  1.1  mrg       && mask->expr_type != EXPR_CONSTANT)
   5600  1.1  mrg     return NULL;
   5601  1.1  mrg 
   5602  1.1  mrg   if (kind)
   5603  1.1  mrg     {
   5604  1.1  mrg       if (gfc_extract_int (kind, &ikind, -1))
   5605  1.1  mrg 	return NULL;
   5606  1.1  mrg     }
   5607  1.1  mrg   else
   5608  1.1  mrg     ikind = gfc_default_integer_kind;
   5609  1.1  mrg 
   5610  1.1  mrg   if (back)
   5611  1.1  mrg     {
   5612  1.1  mrg       if (back->expr_type != EXPR_CONSTANT)
   5613  1.1  mrg 	return NULL;
   5614  1.1  mrg 
   5615  1.1  mrg       back_val = back->value.logical;
   5616  1.1  mrg     }
   5617  1.1  mrg 
   5618  1.1  mrg   if (sign < 0)
   5619  1.1  mrg     init_val = INT_MAX;
   5620  1.1  mrg   else if (sign > 0)
   5621  1.1  mrg     init_val = INT_MIN;
   5622  1.1  mrg   else
   5623  1.1  mrg     gcc_unreachable();
   5624  1.1  mrg 
   5625  1.1  mrg   extremum = gfc_get_constant_expr (array->ts.type, array->ts.kind, &array->where);
   5626  1.1  mrg   init_result_expr (extremum, init_val, array);
   5627  1.1  mrg 
   5628  1.1  mrg   if (dim)
   5629  1.1  mrg     {
   5630  1.1  mrg       result = transformational_result (array, dim, BT_INTEGER,
   5631  1.1  mrg 					ikind, &array->where);
   5632  1.1  mrg       init_result_expr (result, 0, array);
   5633  1.1  mrg 
   5634  1.1  mrg       if (array->rank == 1)
   5635  1.1  mrg 	return simplify_minmaxloc_to_scalar (result, array, mask, extremum,
   5636  1.1  mrg 					     sign, back_val);
   5637  1.1  mrg       else
   5638  1.1  mrg 	return simplify_minmaxloc_to_array (result, array, dim, mask, extremum,
   5639  1.1  mrg 					    sign, back_val);
   5640  1.1  mrg     }
   5641  1.1  mrg   else
   5642  1.1  mrg     {
   5643  1.1  mrg       result = new_array (BT_INTEGER, ikind, array->rank, &array->where);
   5644  1.1  mrg       return simplify_minmaxloc_nodim (result, extremum, array, mask,
   5645  1.1  mrg 				       sign, back_val);
   5646  1.1  mrg     }
   5647  1.1  mrg }
   5648  1.1  mrg 
   5649  1.1  mrg gfc_expr *
   5650  1.1  mrg gfc_simplify_minloc (gfc_expr *array, gfc_expr *dim, gfc_expr *mask, gfc_expr *kind,
   5651  1.1  mrg 		     gfc_expr *back)
   5652  1.1  mrg {
   5653  1.1  mrg   return gfc_simplify_minmaxloc (array, dim, mask, kind, back, -1);
   5654  1.1  mrg }
   5655  1.1  mrg 
   5656  1.1  mrg gfc_expr *
   5657  1.1  mrg gfc_simplify_maxloc (gfc_expr *array, gfc_expr *dim, gfc_expr *mask, gfc_expr *kind,
   5658  1.1  mrg 		     gfc_expr *back)
   5659  1.1  mrg {
   5660  1.1  mrg   return gfc_simplify_minmaxloc (array, dim, mask, kind, back, 1);
   5661  1.1  mrg }
   5662  1.1  mrg 
   5663  1.1  mrg /* Simplify findloc to scalar.  Similar to
   5664  1.1  mrg    simplify_minmaxloc_to_scalar.  */
   5665  1.1  mrg 
   5666  1.1  mrg static gfc_expr *
   5667  1.1  mrg simplify_findloc_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *value,
   5668  1.1  mrg 			    gfc_expr *mask, int back_val)
   5669  1.1  mrg {
   5670  1.1  mrg   gfc_expr *a, *m;
   5671  1.1  mrg   gfc_constructor *array_ctor, *mask_ctor;
   5672  1.1  mrg   mpz_t count;
   5673  1.1  mrg 
   5674  1.1  mrg   mpz_set_si (result->value.integer, 0);
   5675  1.1  mrg 
   5676  1.1  mrg   /* Shortcut for constant .FALSE. MASK.  */
   5677  1.1  mrg   if (mask
   5678  1.1  mrg       && mask->expr_type == EXPR_CONSTANT
   5679  1.1  mrg       && !mask->value.logical)
   5680  1.1  mrg     return result;
   5681  1.1  mrg 
   5682  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
   5683  1.1  mrg   if (mask && mask->expr_type == EXPR_ARRAY)
   5684  1.1  mrg     mask_ctor = gfc_constructor_first (mask->value.constructor);
   5685  1.1  mrg   else
   5686  1.1  mrg     mask_ctor = NULL;
   5687  1.1  mrg 
   5688  1.1  mrg   mpz_init_set_si (count, 0);
   5689  1.1  mrg   while (array_ctor)
   5690  1.1  mrg     {
   5691  1.1  mrg       mpz_add_ui (count, count, 1);
   5692  1.1  mrg       a = array_ctor->expr;
   5693  1.1  mrg       array_ctor = gfc_constructor_next (array_ctor);
   5694  1.1  mrg       /* A constant MASK equals .TRUE. here and can be ignored.  */
   5695  1.1  mrg       if (mask_ctor)
   5696  1.1  mrg 	{
   5697  1.1  mrg 	  m = mask_ctor->expr;
   5698  1.1  mrg 	  mask_ctor = gfc_constructor_next (mask_ctor);
   5699  1.1  mrg 	  if (!m->value.logical)
   5700  1.1  mrg 	    continue;
   5701  1.1  mrg 	}
   5702  1.1  mrg       if (gfc_compare_expr (a, value, INTRINSIC_EQ) == 0)
   5703  1.1  mrg 	{
   5704  1.1  mrg 	  /* We have a match.  If BACK is true, continue so we find
   5705  1.1  mrg 	     the last one.  */
   5706  1.1  mrg 	  mpz_set (result->value.integer, count);
   5707  1.1  mrg 	  if (!back_val)
   5708  1.1  mrg 	    break;
   5709  1.1  mrg 	}
   5710  1.1  mrg     }
   5711  1.1  mrg   mpz_clear (count);
   5712  1.1  mrg   return result;
   5713  1.1  mrg }
   5714  1.1  mrg 
   5715  1.1  mrg /* Simplify findloc in the absence of a dim argument.  Similar to
   5716  1.1  mrg    simplify_minmaxloc_nodim.  */
   5717  1.1  mrg 
   5718  1.1  mrg static gfc_expr *
   5719  1.1  mrg simplify_findloc_nodim (gfc_expr *result, gfc_expr *value, gfc_expr *array,
   5720  1.1  mrg 			gfc_expr *mask, bool back_val)
   5721  1.1  mrg {
   5722  1.1  mrg   ssize_t res[GFC_MAX_DIMENSIONS];
   5723  1.1  mrg   int i, n;
   5724  1.1  mrg   gfc_constructor *result_ctor, *array_ctor, *mask_ctor;
   5725  1.1  mrg   ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
   5726  1.1  mrg     sstride[GFC_MAX_DIMENSIONS];
   5727  1.1  mrg   gfc_expr *a, *m;
   5728  1.1  mrg   bool continue_loop;
   5729  1.1  mrg   bool ma;
   5730  1.1  mrg 
   5731  1.1  mrg   for (i = 0; i < array->rank; i++)
   5732  1.1  mrg     res[i] = -1;
   5733  1.1  mrg 
   5734  1.1  mrg   /* Shortcut for constant .FALSE. MASK.  */
   5735  1.1  mrg   if (mask
   5736  1.1  mrg       && mask->expr_type == EXPR_CONSTANT
   5737  1.1  mrg       && !mask->value.logical)
   5738  1.1  mrg     goto finish;
   5739  1.1  mrg 
   5740  1.1  mrg   for (i = 0; i < array->rank; i++)
   5741  1.1  mrg     {
   5742  1.1  mrg       count[i] = 0;
   5743  1.1  mrg       sstride[i] = (i == 0) ? 1 : sstride[i-1] * mpz_get_si (array->shape[i-1]);
   5744  1.1  mrg       extent[i] = mpz_get_si (array->shape[i]);
   5745  1.1  mrg       if (extent[i] <= 0)
   5746  1.1  mrg 	goto finish;
   5747  1.1  mrg     }
   5748  1.1  mrg 
   5749  1.1  mrg   continue_loop = true;
   5750  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
   5751  1.1  mrg   if (mask && mask->rank > 0)
   5752  1.1  mrg     mask_ctor = gfc_constructor_first (mask->value.constructor);
   5753  1.1  mrg   else
   5754  1.1  mrg     mask_ctor = NULL;
   5755  1.1  mrg 
   5756  1.1  mrg   /* Loop over the array elements (and mask), keeping track of
   5757  1.1  mrg      the indices to return.  */
   5758  1.1  mrg   while (continue_loop)
   5759  1.1  mrg     {
   5760  1.1  mrg       do
   5761  1.1  mrg 	{
   5762  1.1  mrg 	  a = array_ctor->expr;
   5763  1.1  mrg 	  if (mask_ctor)
   5764  1.1  mrg 	    {
   5765  1.1  mrg 	      m = mask_ctor->expr;
   5766  1.1  mrg 	      ma = m->value.logical;
   5767  1.1  mrg 	      mask_ctor = gfc_constructor_next (mask_ctor);
   5768  1.1  mrg 	    }
   5769  1.1  mrg 	  else
   5770  1.1  mrg 	    ma = true;
   5771  1.1  mrg 
   5772  1.1  mrg 	  if (ma && gfc_compare_expr (a, value, INTRINSIC_EQ) == 0)
   5773  1.1  mrg 	    {
   5774  1.1  mrg 	      for (i = 0; i < array->rank; i++)
   5775  1.1  mrg 		res[i] = count[i];
   5776  1.1  mrg 	      if (!back_val)
   5777  1.1  mrg 		goto finish;
   5778  1.1  mrg 	    }
   5779  1.1  mrg 	  array_ctor = gfc_constructor_next (array_ctor);
   5780  1.1  mrg 	  count[0] ++;
   5781  1.1  mrg 	} while (count[0] != extent[0]);
   5782  1.1  mrg       n = 0;
   5783  1.1  mrg       do
   5784  1.1  mrg 	{
   5785  1.1  mrg 	  /* When we get to the end of a dimension, reset it and increment
   5786  1.1  mrg 	     the next dimension.  */
   5787  1.1  mrg 	  count[n] = 0;
   5788  1.1  mrg 	  n++;
   5789  1.1  mrg 	  if (n >= array->rank)
   5790  1.1  mrg 	    {
   5791  1.1  mrg 	      continue_loop = false;
   5792  1.1  mrg 	      break;
   5793  1.1  mrg 	    }
   5794  1.1  mrg 	  else
   5795  1.1  mrg 	    count[n] ++;
   5796  1.1  mrg 	} while (count[n] == extent[n]);
   5797  1.1  mrg     }
   5798  1.1  mrg 
   5799  1.1  mrg finish:
   5800  1.1  mrg   result_ctor = gfc_constructor_first (result->value.constructor);
   5801  1.1  mrg   for (i = 0; i < array->rank; i++)
   5802  1.1  mrg     {
   5803  1.1  mrg       gfc_expr *r_expr;
   5804  1.1  mrg       r_expr = result_ctor->expr;
   5805  1.1  mrg       mpz_set_si (r_expr->value.integer, res[i] + 1);
   5806  1.1  mrg       result_ctor = gfc_constructor_next (result_ctor);
   5807  1.1  mrg     }
   5808  1.1  mrg   return result;
   5809  1.1  mrg }
   5810  1.1  mrg 
   5811  1.1  mrg 
   5812  1.1  mrg /* Simplify findloc to an array.  Similar to
   5813  1.1  mrg    simplify_minmaxloc_to_array.  */
   5814  1.1  mrg 
   5815  1.1  mrg static gfc_expr *
   5816  1.1  mrg simplify_findloc_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *value,
   5817  1.1  mrg 			   gfc_expr *dim, gfc_expr *mask, bool back_val)
   5818  1.1  mrg {
   5819  1.1  mrg   mpz_t size;
   5820  1.1  mrg   int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
   5821  1.1  mrg   gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
   5822  1.1  mrg   gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
   5823  1.1  mrg 
   5824  1.1  mrg   int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
   5825  1.1  mrg       sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
   5826  1.1  mrg       tmpstride[GFC_MAX_DIMENSIONS];
   5827  1.1  mrg 
   5828  1.1  mrg   /* Shortcut for constant .FALSE. MASK.  */
   5829  1.1  mrg   if (mask
   5830  1.1  mrg       && mask->expr_type == EXPR_CONSTANT
   5831  1.1  mrg       && !mask->value.logical)
   5832  1.1  mrg     return result;
   5833  1.1  mrg 
   5834  1.1  mrg   /* Build an indexed table for array element expressions to minimize
   5835  1.1  mrg      linked-list traversal. Masked elements are set to NULL.  */
   5836  1.1  mrg   gfc_array_size (array, &size);
   5837  1.1  mrg   arraysize = mpz_get_ui (size);
   5838  1.1  mrg   mpz_clear (size);
   5839  1.1  mrg 
   5840  1.1  mrg   arrayvec = XCNEWVEC (gfc_expr*, arraysize);
   5841  1.1  mrg 
   5842  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
   5843  1.1  mrg   mask_ctor = NULL;
   5844  1.1  mrg   if (mask && mask->expr_type == EXPR_ARRAY)
   5845  1.1  mrg     mask_ctor = gfc_constructor_first (mask->value.constructor);
   5846  1.1  mrg 
   5847  1.1  mrg   for (i = 0; i < arraysize; ++i)
   5848  1.1  mrg     {
   5849  1.1  mrg       arrayvec[i] = array_ctor->expr;
   5850  1.1  mrg       array_ctor = gfc_constructor_next (array_ctor);
   5851  1.1  mrg 
   5852  1.1  mrg       if (mask_ctor)
   5853  1.1  mrg 	{
   5854  1.1  mrg 	  if (!mask_ctor->expr->value.logical)
   5855  1.1  mrg 	    arrayvec[i] = NULL;
   5856  1.1  mrg 
   5857  1.1  mrg 	  mask_ctor = gfc_constructor_next (mask_ctor);
   5858  1.1  mrg 	}
   5859  1.1  mrg     }
   5860  1.1  mrg 
   5861  1.1  mrg   /* Same for the result expression.  */
   5862  1.1  mrg   gfc_array_size (result, &size);
   5863  1.1  mrg   resultsize = mpz_get_ui (size);
   5864  1.1  mrg   mpz_clear (size);
   5865  1.1  mrg 
   5866  1.1  mrg   resultvec = XCNEWVEC (gfc_expr*, resultsize);
   5867  1.1  mrg   result_ctor = gfc_constructor_first (result->value.constructor);
   5868  1.1  mrg   for (i = 0; i < resultsize; ++i)
   5869  1.1  mrg     {
   5870  1.1  mrg       resultvec[i] = result_ctor->expr;
   5871  1.1  mrg       result_ctor = gfc_constructor_next (result_ctor);
   5872  1.1  mrg     }
   5873  1.1  mrg 
   5874  1.1  mrg   gfc_extract_int (dim, &dim_index);
   5875  1.1  mrg 
   5876  1.1  mrg   dim_index -= 1;	/* Zero-base index.  */
   5877  1.1  mrg   dim_extent = 0;
   5878  1.1  mrg   dim_stride = 0;
   5879  1.1  mrg 
   5880  1.1  mrg   for (i = 0, n = 0; i < array->rank; ++i)
   5881  1.1  mrg     {
   5882  1.1  mrg       count[i] = 0;
   5883  1.1  mrg       tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
   5884  1.1  mrg       if (i == dim_index)
   5885  1.1  mrg 	{
   5886  1.1  mrg 	  dim_extent = mpz_get_si (array->shape[i]);
   5887  1.1  mrg 	  dim_stride = tmpstride[i];
   5888  1.1  mrg 	  continue;
   5889  1.1  mrg 	}
   5890  1.1  mrg 
   5891  1.1  mrg       extent[n] = mpz_get_si (array->shape[i]);
   5892  1.1  mrg       sstride[n] = tmpstride[i];
   5893  1.1  mrg       dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
   5894  1.1  mrg       n += 1;
   5895  1.1  mrg     }
   5896  1.1  mrg 
   5897  1.1  mrg   done = resultsize <= 0;
   5898  1.1  mrg   base = arrayvec;
   5899  1.1  mrg   dest = resultvec;
   5900  1.1  mrg   while (!done)
   5901  1.1  mrg     {
   5902  1.1  mrg       for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
   5903  1.1  mrg 	{
   5904  1.1  mrg 	  if (*src && gfc_compare_expr (*src, value, INTRINSIC_EQ) == 0)
   5905  1.1  mrg 	    {
   5906  1.1  mrg 	      mpz_set_si ((*dest)->value.integer, n + 1);
   5907  1.1  mrg 	      if (!back_val)
   5908  1.1  mrg 		break;
   5909  1.1  mrg 	    }
   5910  1.1  mrg 	}
   5911  1.1  mrg 
   5912  1.1  mrg       count[0]++;
   5913  1.1  mrg       base += sstride[0];
   5914  1.1  mrg       dest += dstride[0];
   5915  1.1  mrg 
   5916  1.1  mrg       n = 0;
   5917  1.1  mrg       while (!done && count[n] == extent[n])
   5918  1.1  mrg 	{
   5919  1.1  mrg 	  count[n] = 0;
   5920  1.1  mrg 	  base -= sstride[n] * extent[n];
   5921  1.1  mrg 	  dest -= dstride[n] * extent[n];
   5922  1.1  mrg 
   5923  1.1  mrg 	  n++;
   5924  1.1  mrg 	  if (n < result->rank)
   5925  1.1  mrg 	    {
   5926  1.1  mrg 	      /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
   5927  1.1  mrg 		 times, we'd warn for the last iteration, because the
   5928  1.1  mrg 		 array index will have already been incremented to the
   5929  1.1  mrg 		 array sizes, and we can't tell that this must make
   5930  1.1  mrg 		 the test against result->rank false, because ranks
   5931  1.1  mrg 		 must not exceed GFC_MAX_DIMENSIONS.  */
   5932  1.1  mrg 	      GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray-bounds)
   5933  1.1  mrg 	      count[n]++;
   5934  1.1  mrg 	      base += sstride[n];
   5935  1.1  mrg 	      dest += dstride[n];
   5936  1.1  mrg 	      GCC_DIAGNOSTIC_POP
   5937  1.1  mrg 	    }
   5938  1.1  mrg 	  else
   5939  1.1  mrg 	    done = true;
   5940  1.1  mrg        }
   5941  1.1  mrg     }
   5942  1.1  mrg 
   5943  1.1  mrg   /* Place updated expression in result constructor.  */
   5944  1.1  mrg   result_ctor = gfc_constructor_first (result->value.constructor);
   5945  1.1  mrg   for (i = 0; i < resultsize; ++i)
   5946  1.1  mrg     {
   5947  1.1  mrg       result_ctor->expr = resultvec[i];
   5948  1.1  mrg       result_ctor = gfc_constructor_next (result_ctor);
   5949  1.1  mrg     }
   5950  1.1  mrg 
   5951  1.1  mrg   free (arrayvec);
   5952  1.1  mrg   free (resultvec);
   5953  1.1  mrg   return result;
   5954  1.1  mrg }
   5955  1.1  mrg 
   5956  1.1  mrg /* Simplify findloc.  */
   5957  1.1  mrg 
   5958  1.1  mrg gfc_expr *
   5959  1.1  mrg gfc_simplify_findloc (gfc_expr *array, gfc_expr *value, gfc_expr *dim,
   5960  1.1  mrg 		      gfc_expr *mask, gfc_expr *kind, gfc_expr *back)
   5961  1.1  mrg {
   5962  1.1  mrg   gfc_expr *result;
   5963  1.1  mrg   int ikind;
   5964  1.1  mrg   bool back_val = false;
   5965  1.1  mrg 
   5966  1.1  mrg   if (!is_constant_array_expr (array)
   5967  1.1  mrg       || array->shape == NULL
   5968  1.1  mrg       || !gfc_is_constant_expr (dim))
   5969  1.1  mrg     return NULL;
   5970  1.1  mrg 
   5971  1.1  mrg   if (! gfc_is_constant_expr (value))
   5972  1.1  mrg     return 0;
   5973  1.1  mrg 
   5974  1.1  mrg   if (mask
   5975  1.1  mrg       && !is_constant_array_expr (mask)
   5976  1.1  mrg       && mask->expr_type != EXPR_CONSTANT)
   5977  1.1  mrg     return NULL;
   5978  1.1  mrg 
   5979  1.1  mrg   if (kind)
   5980  1.1  mrg     {
   5981  1.1  mrg       if (gfc_extract_int (kind, &ikind, -1))
   5982  1.1  mrg 	return NULL;
   5983  1.1  mrg     }
   5984  1.1  mrg   else
   5985  1.1  mrg     ikind = gfc_default_integer_kind;
   5986  1.1  mrg 
   5987  1.1  mrg   if (back)
   5988  1.1  mrg     {
   5989  1.1  mrg       if (back->expr_type != EXPR_CONSTANT)
   5990  1.1  mrg 	return NULL;
   5991  1.1  mrg 
   5992  1.1  mrg       back_val = back->value.logical;
   5993  1.1  mrg     }
   5994  1.1  mrg 
   5995  1.1  mrg   if (dim)
   5996  1.1  mrg     {
   5997  1.1  mrg       result = transformational_result (array, dim, BT_INTEGER,
   5998  1.1  mrg 					ikind, &array->where);
   5999  1.1  mrg       init_result_expr (result, 0, array);
   6000  1.1  mrg 
   6001  1.1  mrg       if (array->rank == 1)
   6002  1.1  mrg 	return simplify_findloc_to_scalar (result, array, value, mask,
   6003  1.1  mrg 					   back_val);
   6004  1.1  mrg       else
   6005  1.1  mrg 	return simplify_findloc_to_array (result, array, value, dim, mask,
   6006  1.1  mrg       					  back_val);
   6007  1.1  mrg     }
   6008  1.1  mrg   else
   6009  1.1  mrg     {
   6010  1.1  mrg       result = new_array (BT_INTEGER, ikind, array->rank, &array->where);
   6011  1.1  mrg       return simplify_findloc_nodim (result, value, array, mask, back_val);
   6012  1.1  mrg     }
   6013  1.1  mrg   return NULL;
   6014  1.1  mrg }
   6015  1.1  mrg 
   6016  1.1  mrg gfc_expr *
   6017  1.1  mrg gfc_simplify_maxexponent (gfc_expr *x)
   6018  1.1  mrg {
   6019  1.1  mrg   int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
   6020  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
   6021  1.1  mrg 			   gfc_real_kinds[i].max_exponent);
   6022  1.1  mrg }
   6023  1.1  mrg 
   6024  1.1  mrg 
   6025  1.1  mrg gfc_expr *
   6026  1.1  mrg gfc_simplify_minexponent (gfc_expr *x)
   6027  1.1  mrg {
   6028  1.1  mrg   int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
   6029  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
   6030  1.1  mrg 			   gfc_real_kinds[i].min_exponent);
   6031  1.1  mrg }
   6032  1.1  mrg 
   6033  1.1  mrg 
   6034  1.1  mrg gfc_expr *
   6035  1.1  mrg gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
   6036  1.1  mrg {
   6037  1.1  mrg   gfc_expr *result;
   6038  1.1  mrg   int kind;
   6039  1.1  mrg 
   6040  1.1  mrg   /* First check p.  */
   6041  1.1  mrg   if (p->expr_type != EXPR_CONSTANT)
   6042  1.1  mrg     return NULL;
   6043  1.1  mrg 
   6044  1.1  mrg   /* p shall not be 0.  */
   6045  1.1  mrg   switch (p->ts.type)
   6046  1.1  mrg     {
   6047  1.1  mrg       case BT_INTEGER:
   6048  1.1  mrg 	if (mpz_cmp_ui (p->value.integer, 0) == 0)
   6049  1.1  mrg 	  {
   6050  1.1  mrg 	    gfc_error ("Argument %qs of MOD at %L shall not be zero",
   6051  1.1  mrg 			"P", &p->where);
   6052  1.1  mrg 	    return &gfc_bad_expr;
   6053  1.1  mrg 	  }
   6054  1.1  mrg 	break;
   6055  1.1  mrg       case BT_REAL:
   6056  1.1  mrg 	if (mpfr_cmp_ui (p->value.real, 0) == 0)
   6057  1.1  mrg 	  {
   6058  1.1  mrg 	    gfc_error ("Argument %qs of MOD at %L shall not be zero",
   6059  1.1  mrg 			"P", &p->where);
   6060  1.1  mrg 	    return &gfc_bad_expr;
   6061  1.1  mrg 	  }
   6062  1.1  mrg 	break;
   6063  1.1  mrg       default:
   6064  1.1  mrg 	gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
   6065  1.1  mrg     }
   6066  1.1  mrg 
   6067  1.1  mrg   if (a->expr_type != EXPR_CONSTANT)
   6068  1.1  mrg     return NULL;
   6069  1.1  mrg 
   6070  1.1  mrg   kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
   6071  1.1  mrg   result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
   6072  1.1  mrg 
   6073  1.1  mrg   if (a->ts.type == BT_INTEGER)
   6074  1.1  mrg     mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
   6075  1.1  mrg   else
   6076  1.1  mrg     {
   6077  1.1  mrg       gfc_set_model_kind (kind);
   6078  1.1  mrg       mpfr_fmod (result->value.real, a->value.real, p->value.real,
   6079  1.1  mrg 		 GFC_RND_MODE);
   6080  1.1  mrg     }
   6081  1.1  mrg 
   6082  1.1  mrg   return range_check (result, "MOD");
   6083  1.1  mrg }
   6084  1.1  mrg 
   6085  1.1  mrg 
   6086  1.1  mrg gfc_expr *
   6087  1.1  mrg gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
   6088  1.1  mrg {
   6089  1.1  mrg   gfc_expr *result;
   6090  1.1  mrg   int kind;
   6091  1.1  mrg 
   6092  1.1  mrg   /* First check p.  */
   6093  1.1  mrg   if (p->expr_type != EXPR_CONSTANT)
   6094  1.1  mrg     return NULL;
   6095  1.1  mrg 
   6096  1.1  mrg   /* p shall not be 0.  */
   6097  1.1  mrg   switch (p->ts.type)
   6098  1.1  mrg     {
   6099  1.1  mrg       case BT_INTEGER:
   6100  1.1  mrg 	if (mpz_cmp_ui (p->value.integer, 0) == 0)
   6101  1.1  mrg 	  {
   6102  1.1  mrg 	    gfc_error ("Argument %qs of MODULO at %L shall not be zero",
   6103  1.1  mrg 			"P", &p->where);
   6104  1.1  mrg 	    return &gfc_bad_expr;
   6105  1.1  mrg 	  }
   6106  1.1  mrg 	break;
   6107  1.1  mrg       case BT_REAL:
   6108  1.1  mrg 	if (mpfr_cmp_ui (p->value.real, 0) == 0)
   6109  1.1  mrg 	  {
   6110  1.1  mrg 	    gfc_error ("Argument %qs of MODULO at %L shall not be zero",
   6111  1.1  mrg 			"P", &p->where);
   6112  1.1  mrg 	    return &gfc_bad_expr;
   6113  1.1  mrg 	  }
   6114  1.1  mrg 	break;
   6115  1.1  mrg       default:
   6116  1.1  mrg 	gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
   6117  1.1  mrg     }
   6118  1.1  mrg 
   6119  1.1  mrg   if (a->expr_type != EXPR_CONSTANT)
   6120  1.1  mrg     return NULL;
   6121  1.1  mrg 
   6122  1.1  mrg   kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
   6123  1.1  mrg   result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
   6124  1.1  mrg 
   6125  1.1  mrg   if (a->ts.type == BT_INTEGER)
   6126  1.1  mrg 	mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
   6127  1.1  mrg   else
   6128  1.1  mrg     {
   6129  1.1  mrg       gfc_set_model_kind (kind);
   6130  1.1  mrg       mpfr_fmod (result->value.real, a->value.real, p->value.real,
   6131  1.1  mrg                  GFC_RND_MODE);
   6132  1.1  mrg       if (mpfr_cmp_ui (result->value.real, 0) != 0)
   6133  1.1  mrg         {
   6134  1.1  mrg           if (mpfr_signbit (a->value.real) != mpfr_signbit (p->value.real))
   6135  1.1  mrg             mpfr_add (result->value.real, result->value.real, p->value.real,
   6136  1.1  mrg                       GFC_RND_MODE);
   6137  1.1  mrg 	    }
   6138  1.1  mrg 	  else
   6139  1.1  mrg         mpfr_copysign (result->value.real, result->value.real,
   6140  1.1  mrg                        p->value.real, GFC_RND_MODE);
   6141  1.1  mrg     }
   6142  1.1  mrg 
   6143  1.1  mrg   return range_check (result, "MODULO");
   6144  1.1  mrg }
   6145  1.1  mrg 
   6146  1.1  mrg 
   6147  1.1  mrg gfc_expr *
   6148  1.1  mrg gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
   6149  1.1  mrg {
   6150  1.1  mrg   gfc_expr *result;
   6151  1.1  mrg   mpfr_exp_t emin, emax;
   6152  1.1  mrg   int kind;
   6153  1.1  mrg 
   6154  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
   6155  1.1  mrg     return NULL;
   6156  1.1  mrg 
   6157  1.1  mrg   result = gfc_copy_expr (x);
   6158  1.1  mrg 
   6159  1.1  mrg   /* Save current values of emin and emax.  */
   6160  1.1  mrg   emin = mpfr_get_emin ();
   6161  1.1  mrg   emax = mpfr_get_emax ();
   6162  1.1  mrg 
   6163  1.1  mrg   /* Set emin and emax for the current model number.  */
   6164  1.1  mrg   kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
   6165  1.1  mrg   mpfr_set_emin ((mpfr_exp_t) gfc_real_kinds[kind].min_exponent -
   6166  1.1  mrg 		mpfr_get_prec(result->value.real) + 1);
   6167  1.1  mrg   mpfr_set_emax ((mpfr_exp_t) gfc_real_kinds[kind].max_exponent);
   6168  1.1  mrg   mpfr_check_range (result->value.real, 0, MPFR_RNDU);
   6169  1.1  mrg 
   6170  1.1  mrg   if (mpfr_sgn (s->value.real) > 0)
   6171  1.1  mrg     {
   6172  1.1  mrg       mpfr_nextabove (result->value.real);
   6173  1.1  mrg       mpfr_subnormalize (result->value.real, 0, MPFR_RNDU);
   6174  1.1  mrg     }
   6175  1.1  mrg   else
   6176  1.1  mrg     {
   6177  1.1  mrg       mpfr_nextbelow (result->value.real);
   6178  1.1  mrg       mpfr_subnormalize (result->value.real, 0, MPFR_RNDD);
   6179  1.1  mrg     }
   6180  1.1  mrg 
   6181  1.1  mrg   mpfr_set_emin (emin);
   6182  1.1  mrg   mpfr_set_emax (emax);
   6183  1.1  mrg 
   6184  1.1  mrg   /* Only NaN can occur. Do not use range check as it gives an
   6185  1.1  mrg      error for denormal numbers.  */
   6186  1.1  mrg   if (mpfr_nan_p (result->value.real) && flag_range_check)
   6187  1.1  mrg     {
   6188  1.1  mrg       gfc_error ("Result of NEAREST is NaN at %L", &result->where);
   6189  1.1  mrg       gfc_free_expr (result);
   6190  1.1  mrg       return &gfc_bad_expr;
   6191  1.1  mrg     }
   6192  1.1  mrg 
   6193  1.1  mrg   return result;
   6194  1.1  mrg }
   6195  1.1  mrg 
   6196  1.1  mrg 
   6197  1.1  mrg static gfc_expr *
   6198  1.1  mrg simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
   6199  1.1  mrg {
   6200  1.1  mrg   gfc_expr *itrunc, *result;
   6201  1.1  mrg   int kind;
   6202  1.1  mrg 
   6203  1.1  mrg   kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
   6204  1.1  mrg   if (kind == -1)
   6205  1.1  mrg     return &gfc_bad_expr;
   6206  1.1  mrg 
   6207  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   6208  1.1  mrg     return NULL;
   6209  1.1  mrg 
   6210  1.1  mrg   itrunc = gfc_copy_expr (e);
   6211  1.1  mrg   mpfr_round (itrunc->value.real, e->value.real);
   6212  1.1  mrg 
   6213  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
   6214  1.1  mrg   gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
   6215  1.1  mrg 
   6216  1.1  mrg   gfc_free_expr (itrunc);
   6217  1.1  mrg 
   6218  1.1  mrg   return range_check (result, name);
   6219  1.1  mrg }
   6220  1.1  mrg 
   6221  1.1  mrg 
   6222  1.1  mrg gfc_expr *
   6223  1.1  mrg gfc_simplify_new_line (gfc_expr *e)
   6224  1.1  mrg {
   6225  1.1  mrg   gfc_expr *result;
   6226  1.1  mrg 
   6227  1.1  mrg   result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
   6228  1.1  mrg   result->value.character.string[0] = '\n';
   6229  1.1  mrg 
   6230  1.1  mrg   return result;
   6231  1.1  mrg }
   6232  1.1  mrg 
   6233  1.1  mrg 
   6234  1.1  mrg gfc_expr *
   6235  1.1  mrg gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
   6236  1.1  mrg {
   6237  1.1  mrg   return simplify_nint ("NINT", e, k);
   6238  1.1  mrg }
   6239  1.1  mrg 
   6240  1.1  mrg 
   6241  1.1  mrg gfc_expr *
   6242  1.1  mrg gfc_simplify_idnint (gfc_expr *e)
   6243  1.1  mrg {
   6244  1.1  mrg   return simplify_nint ("IDNINT", e, NULL);
   6245  1.1  mrg }
   6246  1.1  mrg 
   6247  1.1  mrg static int norm2_scale;
   6248  1.1  mrg 
   6249  1.1  mrg static gfc_expr *
   6250  1.1  mrg norm2_add_squared (gfc_expr *result, gfc_expr *e)
   6251  1.1  mrg {
   6252  1.1  mrg   mpfr_t tmp;
   6253  1.1  mrg 
   6254  1.1  mrg   gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
   6255  1.1  mrg   gcc_assert (result->ts.type == BT_REAL
   6256  1.1  mrg 	      && result->expr_type == EXPR_CONSTANT);
   6257  1.1  mrg 
   6258  1.1  mrg   gfc_set_model_kind (result->ts.kind);
   6259  1.1  mrg   int index = gfc_validate_kind (BT_REAL, result->ts.kind, false);
   6260  1.1  mrg   mpfr_exp_t exp;
   6261  1.1  mrg   if (mpfr_regular_p (result->value.real))
   6262  1.1  mrg     {
   6263  1.1  mrg       exp = mpfr_get_exp (result->value.real);
   6264  1.1  mrg       /* If result is getting close to overflowing, scale down.  */
   6265  1.1  mrg       if (exp >= gfc_real_kinds[index].max_exponent - 4
   6266  1.1  mrg 	  && norm2_scale <= gfc_real_kinds[index].max_exponent - 2)
   6267  1.1  mrg 	{
   6268  1.1  mrg 	  norm2_scale += 2;
   6269  1.1  mrg 	  mpfr_div_ui (result->value.real, result->value.real, 16,
   6270  1.1  mrg 		       GFC_RND_MODE);
   6271  1.1  mrg 	}
   6272  1.1  mrg     }
   6273  1.1  mrg 
   6274  1.1  mrg   mpfr_init (tmp);
   6275  1.1  mrg   if (mpfr_regular_p (e->value.real))
   6276  1.1  mrg     {
   6277  1.1  mrg       exp = mpfr_get_exp (e->value.real);
   6278  1.1  mrg       /* If e**2 would overflow or close to overflowing, scale down.  */
   6279  1.1  mrg       if (exp - norm2_scale >= gfc_real_kinds[index].max_exponent / 2 - 2)
   6280  1.1  mrg 	{
   6281  1.1  mrg 	  int new_scale = gfc_real_kinds[index].max_exponent / 2 + 4;
   6282  1.1  mrg 	  mpfr_set_ui (tmp, 1, GFC_RND_MODE);
   6283  1.1  mrg 	  mpfr_set_exp (tmp, new_scale - norm2_scale);
   6284  1.1  mrg 	  mpfr_div (result->value.real, result->value.real, tmp, GFC_RND_MODE);
   6285  1.1  mrg 	  mpfr_div (result->value.real, result->value.real, tmp, GFC_RND_MODE);
   6286  1.1  mrg 	  norm2_scale = new_scale;
   6287  1.1  mrg 	}
   6288  1.1  mrg     }
   6289  1.1  mrg   if (norm2_scale)
   6290  1.1  mrg     {
   6291  1.1  mrg       mpfr_set_ui (tmp, 1, GFC_RND_MODE);
   6292  1.1  mrg       mpfr_set_exp (tmp, norm2_scale);
   6293  1.1  mrg       mpfr_div (tmp, e->value.real, tmp, GFC_RND_MODE);
   6294  1.1  mrg     }
   6295  1.1  mrg   else
   6296  1.1  mrg     mpfr_set (tmp, e->value.real, GFC_RND_MODE);
   6297  1.1  mrg   mpfr_pow_ui (tmp, tmp, 2, GFC_RND_MODE);
   6298  1.1  mrg   mpfr_add (result->value.real, result->value.real, tmp,
   6299  1.1  mrg 	    GFC_RND_MODE);
   6300  1.1  mrg   mpfr_clear (tmp);
   6301  1.1  mrg 
   6302  1.1  mrg   return result;
   6303  1.1  mrg }
   6304  1.1  mrg 
   6305  1.1  mrg 
   6306  1.1  mrg static gfc_expr *
   6307  1.1  mrg norm2_do_sqrt (gfc_expr *result, gfc_expr *e)
   6308  1.1  mrg {
   6309  1.1  mrg   gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
   6310  1.1  mrg   gcc_assert (result->ts.type == BT_REAL
   6311  1.1  mrg 	      && result->expr_type == EXPR_CONSTANT);
   6312  1.1  mrg 
   6313  1.1  mrg   if (result != e)
   6314  1.1  mrg     mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
   6315  1.1  mrg   mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
   6316  1.1  mrg   if (norm2_scale && mpfr_regular_p (result->value.real))
   6317  1.1  mrg     {
   6318  1.1  mrg       mpfr_t tmp;
   6319  1.1  mrg       mpfr_init (tmp);
   6320  1.1  mrg       mpfr_set_ui (tmp, 1, GFC_RND_MODE);
   6321  1.1  mrg       mpfr_set_exp (tmp, norm2_scale);
   6322  1.1  mrg       mpfr_mul (result->value.real, result->value.real, tmp, GFC_RND_MODE);
   6323  1.1  mrg       mpfr_clear (tmp);
   6324  1.1  mrg     }
   6325  1.1  mrg   norm2_scale = 0;
   6326  1.1  mrg 
   6327  1.1  mrg   return result;
   6328  1.1  mrg }
   6329  1.1  mrg 
   6330  1.1  mrg 
   6331  1.1  mrg gfc_expr *
   6332  1.1  mrg gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
   6333  1.1  mrg {
   6334  1.1  mrg   gfc_expr *result;
   6335  1.1  mrg   bool size_zero;
   6336  1.1  mrg 
   6337  1.1  mrg   size_zero = gfc_is_size_zero_array (e);
   6338  1.1  mrg 
   6339  1.1  mrg   if (!(is_constant_array_expr (e) || size_zero)
   6340  1.1  mrg       || (dim != NULL && !gfc_is_constant_expr (dim)))
   6341  1.1  mrg     return NULL;
   6342  1.1  mrg 
   6343  1.1  mrg   result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
   6344  1.1  mrg   init_result_expr (result, 0, NULL);
   6345  1.1  mrg 
   6346  1.1  mrg   if (size_zero)
   6347  1.1  mrg     return result;
   6348  1.1  mrg 
   6349  1.1  mrg   norm2_scale = 0;
   6350  1.1  mrg   if (!dim || e->rank == 1)
   6351  1.1  mrg     {
   6352  1.1  mrg       result = simplify_transformation_to_scalar (result, e, NULL,
   6353  1.1  mrg 						  norm2_add_squared);
   6354  1.1  mrg       mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
   6355  1.1  mrg       if (norm2_scale && mpfr_regular_p (result->value.real))
   6356  1.1  mrg 	{
   6357  1.1  mrg 	  mpfr_t tmp;
   6358  1.1  mrg 	  mpfr_init (tmp);
   6359  1.1  mrg 	  mpfr_set_ui (tmp, 1, GFC_RND_MODE);
   6360  1.1  mrg 	  mpfr_set_exp (tmp, norm2_scale);
   6361  1.1  mrg 	  mpfr_mul (result->value.real, result->value.real, tmp, GFC_RND_MODE);
   6362  1.1  mrg 	  mpfr_clear (tmp);
   6363  1.1  mrg 	}
   6364  1.1  mrg       norm2_scale = 0;
   6365  1.1  mrg     }
   6366  1.1  mrg   else
   6367  1.1  mrg     result = simplify_transformation_to_array (result, e, dim, NULL,
   6368  1.1  mrg 					       norm2_add_squared,
   6369  1.1  mrg 					       norm2_do_sqrt);
   6370  1.1  mrg 
   6371  1.1  mrg   return result;
   6372  1.1  mrg }
   6373  1.1  mrg 
   6374  1.1  mrg 
   6375  1.1  mrg gfc_expr *
   6376  1.1  mrg gfc_simplify_not (gfc_expr *e)
   6377  1.1  mrg {
   6378  1.1  mrg   gfc_expr *result;
   6379  1.1  mrg 
   6380  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   6381  1.1  mrg     return NULL;
   6382  1.1  mrg 
   6383  1.1  mrg   result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
   6384  1.1  mrg   mpz_com (result->value.integer, e->value.integer);
   6385  1.1  mrg 
   6386  1.1  mrg   return range_check (result, "NOT");
   6387  1.1  mrg }
   6388  1.1  mrg 
   6389  1.1  mrg 
   6390  1.1  mrg gfc_expr *
   6391  1.1  mrg gfc_simplify_null (gfc_expr *mold)
   6392  1.1  mrg {
   6393  1.1  mrg   gfc_expr *result;
   6394  1.1  mrg 
   6395  1.1  mrg   if (mold)
   6396  1.1  mrg     {
   6397  1.1  mrg       result = gfc_copy_expr (mold);
   6398  1.1  mrg       result->expr_type = EXPR_NULL;
   6399  1.1  mrg     }
   6400  1.1  mrg   else
   6401  1.1  mrg     result = gfc_get_null_expr (NULL);
   6402  1.1  mrg 
   6403  1.1  mrg   return result;
   6404  1.1  mrg }
   6405  1.1  mrg 
   6406  1.1  mrg 
   6407  1.1  mrg gfc_expr *
   6408  1.1  mrg gfc_simplify_num_images (gfc_expr *distance ATTRIBUTE_UNUSED, gfc_expr *failed)
   6409  1.1  mrg {
   6410  1.1  mrg   gfc_expr *result;
   6411  1.1  mrg 
   6412  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_NONE)
   6413  1.1  mrg     {
   6414  1.1  mrg       gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
   6415  1.1  mrg       return &gfc_bad_expr;
   6416  1.1  mrg     }
   6417  1.1  mrg 
   6418  1.1  mrg   if (flag_coarray != GFC_FCOARRAY_SINGLE)
   6419  1.1  mrg     return NULL;
   6420  1.1  mrg 
   6421  1.1  mrg   if (failed && failed->expr_type != EXPR_CONSTANT)
   6422  1.1  mrg     return NULL;
   6423  1.1  mrg 
   6424  1.1  mrg   /* FIXME: gfc_current_locus is wrong.  */
   6425  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
   6426  1.1  mrg 				  &gfc_current_locus);
   6427  1.1  mrg 
   6428  1.1  mrg   if (failed && failed->value.logical != 0)
   6429  1.1  mrg     mpz_set_si (result->value.integer, 0);
   6430  1.1  mrg   else
   6431  1.1  mrg     mpz_set_si (result->value.integer, 1);
   6432  1.1  mrg 
   6433  1.1  mrg   return result;
   6434  1.1  mrg }
   6435  1.1  mrg 
   6436  1.1  mrg 
   6437  1.1  mrg gfc_expr *
   6438  1.1  mrg gfc_simplify_or (gfc_expr *x, gfc_expr *y)
   6439  1.1  mrg {
   6440  1.1  mrg   gfc_expr *result;
   6441  1.1  mrg   int kind;
   6442  1.1  mrg 
   6443  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   6444  1.1  mrg     return NULL;
   6445  1.1  mrg 
   6446  1.1  mrg   kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
   6447  1.1  mrg 
   6448  1.1  mrg   switch (x->ts.type)
   6449  1.1  mrg     {
   6450  1.1  mrg       case BT_INTEGER:
   6451  1.1  mrg 	result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
   6452  1.1  mrg 	mpz_ior (result->value.integer, x->value.integer, y->value.integer);
   6453  1.1  mrg 	return range_check (result, "OR");
   6454  1.1  mrg 
   6455  1.1  mrg       case BT_LOGICAL:
   6456  1.1  mrg 	return gfc_get_logical_expr (kind, &x->where,
   6457  1.1  mrg 				     x->value.logical || y->value.logical);
   6458  1.1  mrg       default:
   6459  1.1  mrg 	gcc_unreachable();
   6460  1.1  mrg     }
   6461  1.1  mrg }
   6462  1.1  mrg 
   6463  1.1  mrg 
   6464  1.1  mrg gfc_expr *
   6465  1.1  mrg gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
   6466  1.1  mrg {
   6467  1.1  mrg   gfc_expr *result;
   6468  1.1  mrg   gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
   6469  1.1  mrg 
   6470  1.1  mrg   if (!is_constant_array_expr (array)
   6471  1.1  mrg       || !is_constant_array_expr (vector)
   6472  1.1  mrg       || (!gfc_is_constant_expr (mask)
   6473  1.1  mrg           && !is_constant_array_expr (mask)))
   6474  1.1  mrg     return NULL;
   6475  1.1  mrg 
   6476  1.1  mrg   result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
   6477  1.1  mrg   if (array->ts.type == BT_DERIVED)
   6478  1.1  mrg     result->ts.u.derived = array->ts.u.derived;
   6479  1.1  mrg 
   6480  1.1  mrg   array_ctor = gfc_constructor_first (array->value.constructor);
   6481  1.1  mrg   vector_ctor = vector
   6482  1.1  mrg 		  ? gfc_constructor_first (vector->value.constructor)
   6483  1.1  mrg 		  : NULL;
   6484  1.1  mrg 
   6485  1.1  mrg   if (mask->expr_type == EXPR_CONSTANT
   6486  1.1  mrg       && mask->value.logical)
   6487  1.1  mrg     {
   6488  1.1  mrg       /* Copy all elements of ARRAY to RESULT.  */
   6489  1.1  mrg       while (array_ctor)
   6490  1.1  mrg 	{
   6491  1.1  mrg 	  gfc_constructor_append_expr (&result->value.constructor,
   6492  1.1  mrg 				       gfc_copy_expr (array_ctor->expr),
   6493  1.1  mrg 				       NULL);
   6494  1.1  mrg 
   6495  1.1  mrg 	  array_ctor = gfc_constructor_next (array_ctor);
   6496  1.1  mrg 	  vector_ctor = gfc_constructor_next (vector_ctor);
   6497  1.1  mrg 	}
   6498  1.1  mrg     }
   6499  1.1  mrg   else if (mask->expr_type == EXPR_ARRAY)
   6500  1.1  mrg     {
   6501  1.1  mrg       /* Copy only those elements of ARRAY to RESULT whose
   6502  1.1  mrg 	 MASK equals .TRUE..  */
   6503  1.1  mrg       mask_ctor = gfc_constructor_first (mask->value.constructor);
   6504  1.1  mrg       while (mask_ctor && array_ctor)
   6505  1.1  mrg 	{
   6506  1.1  mrg 	  if (mask_ctor->expr->value.logical)
   6507  1.1  mrg 	    {
   6508  1.1  mrg 	      gfc_constructor_append_expr (&result->value.constructor,
   6509  1.1  mrg 					   gfc_copy_expr (array_ctor->expr),
   6510  1.1  mrg 					   NULL);
   6511  1.1  mrg 	      vector_ctor = gfc_constructor_next (vector_ctor);
   6512  1.1  mrg 	    }
   6513  1.1  mrg 
   6514  1.1  mrg 	  array_ctor = gfc_constructor_next (array_ctor);
   6515  1.1  mrg 	  mask_ctor = gfc_constructor_next (mask_ctor);
   6516  1.1  mrg 	}
   6517  1.1  mrg     }
   6518  1.1  mrg 
   6519  1.1  mrg   /* Append any left-over elements from VECTOR to RESULT.  */
   6520  1.1  mrg   while (vector_ctor)
   6521  1.1  mrg     {
   6522  1.1  mrg       gfc_constructor_append_expr (&result->value.constructor,
   6523  1.1  mrg 				   gfc_copy_expr (vector_ctor->expr),
   6524  1.1  mrg 				   NULL);
   6525  1.1  mrg       vector_ctor = gfc_constructor_next (vector_ctor);
   6526  1.1  mrg     }
   6527  1.1  mrg 
   6528  1.1  mrg   result->shape = gfc_get_shape (1);
   6529  1.1  mrg   gfc_array_size (result, &result->shape[0]);
   6530  1.1  mrg 
   6531  1.1  mrg   if (array->ts.type == BT_CHARACTER)
   6532  1.1  mrg     result->ts.u.cl = array->ts.u.cl;
   6533  1.1  mrg 
   6534  1.1  mrg   return result;
   6535  1.1  mrg }
   6536  1.1  mrg 
   6537  1.1  mrg 
   6538  1.1  mrg static gfc_expr *
   6539  1.1  mrg do_xor (gfc_expr *result, gfc_expr *e)
   6540  1.1  mrg {
   6541  1.1  mrg   gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
   6542  1.1  mrg   gcc_assert (result->ts.type == BT_LOGICAL
   6543  1.1  mrg 	      && result->expr_type == EXPR_CONSTANT);
   6544  1.1  mrg 
   6545  1.1  mrg   result->value.logical = result->value.logical != e->value.logical;
   6546  1.1  mrg   return result;
   6547  1.1  mrg }
   6548  1.1  mrg 
   6549  1.1  mrg 
   6550  1.1  mrg gfc_expr *
   6551  1.1  mrg gfc_simplify_is_contiguous (gfc_expr *array)
   6552  1.1  mrg {
   6553  1.1  mrg   if (gfc_is_simply_contiguous (array, false, true))
   6554  1.1  mrg     return gfc_get_logical_expr (gfc_default_logical_kind, &array->where, 1);
   6555  1.1  mrg 
   6556  1.1  mrg   if (gfc_is_not_contiguous (array))
   6557  1.1  mrg     return gfc_get_logical_expr (gfc_default_logical_kind, &array->where, 0);
   6558  1.1  mrg 
   6559  1.1  mrg   return NULL;
   6560  1.1  mrg }
   6561  1.1  mrg 
   6562  1.1  mrg 
   6563  1.1  mrg gfc_expr *
   6564  1.1  mrg gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
   6565  1.1  mrg {
   6566  1.1  mrg   return simplify_transformation (e, dim, NULL, 0, do_xor);
   6567  1.1  mrg }
   6568  1.1  mrg 
   6569  1.1  mrg 
   6570  1.1  mrg gfc_expr *
   6571  1.1  mrg gfc_simplify_popcnt (gfc_expr *e)
   6572  1.1  mrg {
   6573  1.1  mrg   int res, k;
   6574  1.1  mrg   mpz_t x;
   6575  1.1  mrg 
   6576  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   6577  1.1  mrg     return NULL;
   6578  1.1  mrg 
   6579  1.1  mrg   k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
   6580  1.1  mrg 
   6581  1.1  mrg   /* Convert argument to unsigned, then count the '1' bits.  */
   6582  1.1  mrg   mpz_init_set (x, e->value.integer);
   6583  1.1  mrg   convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
   6584  1.1  mrg   res = mpz_popcount (x);
   6585  1.1  mrg   mpz_clear (x);
   6586  1.1  mrg 
   6587  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res);
   6588  1.1  mrg }
   6589  1.1  mrg 
   6590  1.1  mrg 
   6591  1.1  mrg gfc_expr *
   6592  1.1  mrg gfc_simplify_poppar (gfc_expr *e)
   6593  1.1  mrg {
   6594  1.1  mrg   gfc_expr *popcnt;
   6595  1.1  mrg   int i;
   6596  1.1  mrg 
   6597  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   6598  1.1  mrg     return NULL;
   6599  1.1  mrg 
   6600  1.1  mrg   popcnt = gfc_simplify_popcnt (e);
   6601  1.1  mrg   gcc_assert (popcnt);
   6602  1.1  mrg 
   6603  1.1  mrg   bool fail = gfc_extract_int (popcnt, &i);
   6604  1.1  mrg   gcc_assert (!fail);
   6605  1.1  mrg 
   6606  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2);
   6607  1.1  mrg }
   6608  1.1  mrg 
   6609  1.1  mrg 
   6610  1.1  mrg gfc_expr *
   6611  1.1  mrg gfc_simplify_precision (gfc_expr *e)
   6612  1.1  mrg {
   6613  1.1  mrg   int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
   6614  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
   6615  1.1  mrg 			   gfc_real_kinds[i].precision);
   6616  1.1  mrg }
   6617  1.1  mrg 
   6618  1.1  mrg 
   6619  1.1  mrg gfc_expr *
   6620  1.1  mrg gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
   6621  1.1  mrg {
   6622  1.1  mrg   return simplify_transformation (array, dim, mask, 1, gfc_multiply);
   6623  1.1  mrg }
   6624  1.1  mrg 
   6625  1.1  mrg 
   6626  1.1  mrg gfc_expr *
   6627  1.1  mrg gfc_simplify_radix (gfc_expr *e)
   6628  1.1  mrg {
   6629  1.1  mrg   int i;
   6630  1.1  mrg   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
   6631  1.1  mrg 
   6632  1.1  mrg   switch (e->ts.type)
   6633  1.1  mrg     {
   6634  1.1  mrg       case BT_INTEGER:
   6635  1.1  mrg 	i = gfc_integer_kinds[i].radix;
   6636  1.1  mrg 	break;
   6637  1.1  mrg 
   6638  1.1  mrg       case BT_REAL:
   6639  1.1  mrg 	i = gfc_real_kinds[i].radix;
   6640  1.1  mrg 	break;
   6641  1.1  mrg 
   6642  1.1  mrg       default:
   6643  1.1  mrg 	gcc_unreachable ();
   6644  1.1  mrg     }
   6645  1.1  mrg 
   6646  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
   6647  1.1  mrg }
   6648  1.1  mrg 
   6649  1.1  mrg 
   6650  1.1  mrg gfc_expr *
   6651  1.1  mrg gfc_simplify_range (gfc_expr *e)
   6652  1.1  mrg {
   6653  1.1  mrg   int i;
   6654  1.1  mrg   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
   6655  1.1  mrg 
   6656  1.1  mrg   switch (e->ts.type)
   6657  1.1  mrg     {
   6658  1.1  mrg       case BT_INTEGER:
   6659  1.1  mrg 	i = gfc_integer_kinds[i].range;
   6660  1.1  mrg 	break;
   6661  1.1  mrg 
   6662  1.1  mrg       case BT_REAL:
   6663  1.1  mrg       case BT_COMPLEX:
   6664  1.1  mrg 	i = gfc_real_kinds[i].range;
   6665  1.1  mrg 	break;
   6666  1.1  mrg 
   6667  1.1  mrg       default:
   6668  1.1  mrg 	gcc_unreachable ();
   6669  1.1  mrg     }
   6670  1.1  mrg 
   6671  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
   6672  1.1  mrg }
   6673  1.1  mrg 
   6674  1.1  mrg 
   6675  1.1  mrg gfc_expr *
   6676  1.1  mrg gfc_simplify_rank (gfc_expr *e)
   6677  1.1  mrg {
   6678  1.1  mrg   /* Assumed rank.  */
   6679  1.1  mrg   if (e->rank == -1)
   6680  1.1  mrg     return NULL;
   6681  1.1  mrg 
   6682  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &e->where, e->rank);
   6683  1.1  mrg }
   6684  1.1  mrg 
   6685  1.1  mrg 
   6686  1.1  mrg gfc_expr *
   6687  1.1  mrg gfc_simplify_real (gfc_expr *e, gfc_expr *k)
   6688  1.1  mrg {
   6689  1.1  mrg   gfc_expr *result = NULL;
   6690  1.1  mrg   int kind, tmp1, tmp2;
   6691  1.1  mrg 
   6692  1.1  mrg   /* Convert BOZ to real, and return without range checking.  */
   6693  1.1  mrg   if (e->ts.type == BT_BOZ)
   6694  1.1  mrg     {
   6695  1.1  mrg       /* Determine kind for conversion of the BOZ.  */
   6696  1.1  mrg       if (k)
   6697  1.1  mrg 	gfc_extract_int (k, &kind);
   6698  1.1  mrg       else
   6699  1.1  mrg 	kind = gfc_default_real_kind;
   6700  1.1  mrg 
   6701  1.1  mrg       if (!gfc_boz2real (e, kind))
   6702  1.1  mrg 	return NULL;
   6703  1.1  mrg       result = gfc_copy_expr (e);
   6704  1.1  mrg       return result;
   6705  1.1  mrg     }
   6706  1.1  mrg 
   6707  1.1  mrg   if (e->ts.type == BT_COMPLEX)
   6708  1.1  mrg     kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
   6709  1.1  mrg   else
   6710  1.1  mrg     kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
   6711  1.1  mrg 
   6712  1.1  mrg   if (kind == -1)
   6713  1.1  mrg     return &gfc_bad_expr;
   6714  1.1  mrg 
   6715  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   6716  1.1  mrg     return NULL;
   6717  1.1  mrg 
   6718  1.1  mrg   /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
   6719  1.1  mrg      warnings.  */
   6720  1.1  mrg   tmp1 = warn_conversion;
   6721  1.1  mrg   tmp2 = warn_conversion_extra;
   6722  1.1  mrg   warn_conversion = warn_conversion_extra = 0;
   6723  1.1  mrg 
   6724  1.1  mrg   result = gfc_convert_constant (e, BT_REAL, kind);
   6725  1.1  mrg 
   6726  1.1  mrg   warn_conversion = tmp1;
   6727  1.1  mrg   warn_conversion_extra = tmp2;
   6728  1.1  mrg 
   6729  1.1  mrg   if (result == &gfc_bad_expr)
   6730  1.1  mrg     return &gfc_bad_expr;
   6731  1.1  mrg 
   6732  1.1  mrg   return range_check (result, "REAL");
   6733  1.1  mrg }
   6734  1.1  mrg 
   6735  1.1  mrg 
   6736  1.1  mrg gfc_expr *
   6737  1.1  mrg gfc_simplify_realpart (gfc_expr *e)
   6738  1.1  mrg {
   6739  1.1  mrg   gfc_expr *result;
   6740  1.1  mrg 
   6741  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   6742  1.1  mrg     return NULL;
   6743  1.1  mrg 
   6744  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
   6745  1.1  mrg   mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
   6746  1.1  mrg 
   6747  1.1  mrg   return range_check (result, "REALPART");
   6748  1.1  mrg }
   6749  1.1  mrg 
   6750  1.1  mrg gfc_expr *
   6751  1.1  mrg gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
   6752  1.1  mrg {
   6753  1.1  mrg   gfc_expr *result;
   6754  1.1  mrg   gfc_charlen_t len;
   6755  1.1  mrg   mpz_t ncopies;
   6756  1.1  mrg   bool have_length = false;
   6757  1.1  mrg 
   6758  1.1  mrg   /* If NCOPIES isn't a constant, there's nothing we can do.  */
   6759  1.1  mrg   if (n->expr_type != EXPR_CONSTANT)
   6760  1.1  mrg     return NULL;
   6761  1.1  mrg 
   6762  1.1  mrg   /* If NCOPIES is negative, it's an error.  */
   6763  1.1  mrg   if (mpz_sgn (n->value.integer) < 0)
   6764  1.1  mrg     {
   6765  1.1  mrg       gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
   6766  1.1  mrg 		 &n->where);
   6767  1.1  mrg       return &gfc_bad_expr;
   6768  1.1  mrg     }
   6769  1.1  mrg 
   6770  1.1  mrg   /* If we don't know the character length, we can do no more.  */
   6771  1.1  mrg   if (e->ts.u.cl && e->ts.u.cl->length
   6772  1.1  mrg 	&& e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
   6773  1.1  mrg     {
   6774  1.1  mrg       len = gfc_mpz_get_hwi (e->ts.u.cl->length->value.integer);
   6775  1.1  mrg       have_length = true;
   6776  1.1  mrg     }
   6777  1.1  mrg   else if (e->expr_type == EXPR_CONSTANT
   6778  1.1  mrg 	     && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
   6779  1.1  mrg     {
   6780  1.1  mrg       len = e->value.character.length;
   6781  1.1  mrg     }
   6782  1.1  mrg   else
   6783  1.1  mrg     return NULL;
   6784  1.1  mrg 
   6785  1.1  mrg   /* If the source length is 0, any value of NCOPIES is valid
   6786  1.1  mrg      and everything behaves as if NCOPIES == 0.  */
   6787  1.1  mrg   mpz_init (ncopies);
   6788  1.1  mrg   if (len == 0)
   6789  1.1  mrg     mpz_set_ui (ncopies, 0);
   6790  1.1  mrg   else
   6791  1.1  mrg     mpz_set (ncopies, n->value.integer);
   6792  1.1  mrg 
   6793  1.1  mrg   /* Check that NCOPIES isn't too large.  */
   6794  1.1  mrg   if (len)
   6795  1.1  mrg     {
   6796  1.1  mrg       mpz_t max, mlen;
   6797  1.1  mrg       int i;
   6798  1.1  mrg 
   6799  1.1  mrg       /* Compute the maximum value allowed for NCOPIES: huge(cl) / len.  */
   6800  1.1  mrg       mpz_init (max);
   6801  1.1  mrg       i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
   6802  1.1  mrg 
   6803  1.1  mrg       if (have_length)
   6804  1.1  mrg 	{
   6805  1.1  mrg 	  mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
   6806  1.1  mrg 		      e->ts.u.cl->length->value.integer);
   6807  1.1  mrg 	}
   6808  1.1  mrg       else
   6809  1.1  mrg 	{
   6810  1.1  mrg 	  mpz_init (mlen);
   6811  1.1  mrg 	  gfc_mpz_set_hwi (mlen, len);
   6812  1.1  mrg 	  mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
   6813  1.1  mrg 	  mpz_clear (mlen);
   6814  1.1  mrg 	}
   6815  1.1  mrg 
   6816  1.1  mrg       /* The check itself.  */
   6817  1.1  mrg       if (mpz_cmp (ncopies, max) > 0)
   6818  1.1  mrg 	{
   6819  1.1  mrg 	  mpz_clear (max);
   6820  1.1  mrg 	  mpz_clear (ncopies);
   6821  1.1  mrg 	  gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
   6822  1.1  mrg 		     &n->where);
   6823  1.1  mrg 	  return &gfc_bad_expr;
   6824  1.1  mrg 	}
   6825  1.1  mrg 
   6826  1.1  mrg       mpz_clear (max);
   6827  1.1  mrg     }
   6828  1.1  mrg   mpz_clear (ncopies);
   6829  1.1  mrg 
   6830  1.1  mrg   /* For further simplification, we need the character string to be
   6831  1.1  mrg      constant.  */
   6832  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   6833  1.1  mrg     return NULL;
   6834  1.1  mrg 
   6835  1.1  mrg   HOST_WIDE_INT ncop;
   6836  1.1  mrg   if (len ||
   6837  1.1  mrg       (e->ts.u.cl->length &&
   6838  1.1  mrg        mpz_sgn (e->ts.u.cl->length->value.integer) != 0))
   6839  1.1  mrg     {
   6840  1.1  mrg       bool fail = gfc_extract_hwi (n, &ncop);
   6841  1.1  mrg       gcc_assert (!fail);
   6842  1.1  mrg     }
   6843  1.1  mrg   else
   6844  1.1  mrg     ncop = 0;
   6845  1.1  mrg 
   6846  1.1  mrg   if (ncop == 0)
   6847  1.1  mrg     return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
   6848  1.1  mrg 
   6849  1.1  mrg   len = e->value.character.length;
   6850  1.1  mrg   gfc_charlen_t nlen = ncop * len;
   6851  1.1  mrg 
   6852  1.1  mrg   /* Here's a semi-arbitrary limit. If the string is longer than 1 GB
   6853  1.1  mrg      (2**28 elements * 4 bytes (wide chars) per element) defer to
   6854  1.1  mrg      runtime instead of consuming (unbounded) memory and CPU at
   6855  1.1  mrg      compile time.  */
   6856  1.1  mrg   if (nlen > 268435456)
   6857  1.1  mrg     {
   6858  1.1  mrg       gfc_warning_now (0, "Evaluation of string longer than 2**28 at %L"
   6859  1.1  mrg 		       " deferred to runtime, expect bugs", &e->where);
   6860  1.1  mrg       return NULL;
   6861  1.1  mrg     }
   6862  1.1  mrg 
   6863  1.1  mrg   result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
   6864  1.1  mrg   for (size_t i = 0; i < (size_t) ncop; i++)
   6865  1.1  mrg     for (size_t j = 0; j < (size_t) len; j++)
   6866  1.1  mrg       result->value.character.string[j+i*len]= e->value.character.string[j];
   6867  1.1  mrg 
   6868  1.1  mrg   result->value.character.string[nlen] = '\0';	/* For debugger */
   6869  1.1  mrg   return result;
   6870  1.1  mrg }
   6871  1.1  mrg 
   6872  1.1  mrg 
   6873  1.1  mrg /* This one is a bear, but mainly has to do with shuffling elements.  */
   6874  1.1  mrg 
   6875  1.1  mrg gfc_expr *
   6876  1.1  mrg gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
   6877  1.1  mrg 		      gfc_expr *pad, gfc_expr *order_exp)
   6878  1.1  mrg {
   6879  1.1  mrg   int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
   6880  1.1  mrg   int i, rank, npad, x[GFC_MAX_DIMENSIONS];
   6881  1.1  mrg   mpz_t index, size;
   6882  1.1  mrg   unsigned long j;
   6883  1.1  mrg   size_t nsource;
   6884  1.1  mrg   gfc_expr *e, *result;
   6885  1.1  mrg   bool zerosize = false;
   6886  1.1  mrg 
   6887  1.1  mrg   /* Check that argument expression types are OK.  */
   6888  1.1  mrg   if (!is_constant_array_expr (source)
   6889  1.1  mrg       || !is_constant_array_expr (shape_exp)
   6890  1.1  mrg       || !is_constant_array_expr (pad)
   6891  1.1  mrg       || !is_constant_array_expr (order_exp))
   6892  1.1  mrg     return NULL;
   6893  1.1  mrg 
   6894  1.1  mrg   if (source->shape == NULL)
   6895  1.1  mrg     return NULL;
   6896  1.1  mrg 
   6897  1.1  mrg   /* Proceed with simplification, unpacking the array.  */
   6898  1.1  mrg 
   6899  1.1  mrg   mpz_init (index);
   6900  1.1  mrg   rank = 0;
   6901  1.1  mrg 
   6902  1.1  mrg   for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
   6903  1.1  mrg     x[i] = 0;
   6904  1.1  mrg 
   6905  1.1  mrg   for (;;)
   6906  1.1  mrg     {
   6907  1.1  mrg       e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
   6908  1.1  mrg       if (e == NULL)
   6909  1.1  mrg 	break;
   6910  1.1  mrg 
   6911  1.1  mrg       gfc_extract_int (e, &shape[rank]);
   6912  1.1  mrg 
   6913  1.1  mrg       gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
   6914  1.1  mrg       if (shape[rank] < 0)
   6915  1.1  mrg 	{
   6916  1.1  mrg 	  gfc_error ("The SHAPE array for the RESHAPE intrinsic at %L has a "
   6917  1.1  mrg 		     "negative value %d for dimension %d",
   6918  1.1  mrg 		     &shape_exp->where, shape[rank], rank+1);
   6919  1.1  mrg 	  return &gfc_bad_expr;
   6920  1.1  mrg 	}
   6921  1.1  mrg 
   6922  1.1  mrg       rank++;
   6923  1.1  mrg     }
   6924  1.1  mrg 
   6925  1.1  mrg   gcc_assert (rank > 0);
   6926  1.1  mrg 
   6927  1.1  mrg   /* Now unpack the order array if present.  */
   6928  1.1  mrg   if (order_exp == NULL)
   6929  1.1  mrg     {
   6930  1.1  mrg       for (i = 0; i < rank; i++)
   6931  1.1  mrg 	order[i] = i;
   6932  1.1  mrg     }
   6933  1.1  mrg   else
   6934  1.1  mrg     {
   6935  1.1  mrg       mpz_t size;
   6936  1.1  mrg       int order_size, shape_size;
   6937  1.1  mrg 
   6938  1.1  mrg       if (order_exp->rank != shape_exp->rank)
   6939  1.1  mrg 	{
   6940  1.1  mrg 	  gfc_error ("Shapes of ORDER at %L and SHAPE at %L are different",
   6941  1.1  mrg 		     &order_exp->where, &shape_exp->where);
   6942  1.1  mrg 	  return &gfc_bad_expr;
   6943  1.1  mrg 	}
   6944  1.1  mrg 
   6945  1.1  mrg       gfc_array_size (shape_exp, &size);
   6946  1.1  mrg       shape_size = mpz_get_ui (size);
   6947  1.1  mrg       mpz_clear (size);
   6948  1.1  mrg       gfc_array_size (order_exp, &size);
   6949  1.1  mrg       order_size = mpz_get_ui (size);
   6950  1.1  mrg       mpz_clear (size);
   6951  1.1  mrg       if (order_size != shape_size)
   6952  1.1  mrg 	{
   6953  1.1  mrg 	  gfc_error ("Sizes of ORDER at %L and SHAPE at %L are different",
   6954  1.1  mrg 		     &order_exp->where, &shape_exp->where);
   6955  1.1  mrg 	  return &gfc_bad_expr;
   6956  1.1  mrg 	}
   6957  1.1  mrg 
   6958  1.1  mrg       for (i = 0; i < rank; i++)
   6959  1.1  mrg 	{
   6960  1.1  mrg 	  e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
   6961  1.1  mrg 	  gcc_assert (e);
   6962  1.1  mrg 
   6963  1.1  mrg 	  gfc_extract_int (e, &order[i]);
   6964  1.1  mrg 
   6965  1.1  mrg 	  if (order[i] < 1 || order[i] > rank)
   6966  1.1  mrg 	    {
   6967  1.1  mrg 	      gfc_error ("Element with a value of %d in ORDER at %L must be "
   6968  1.1  mrg 			 "in the range [1, ..., %d] for the RESHAPE intrinsic "
   6969  1.1  mrg 			 "near %L", order[i], &order_exp->where, rank,
   6970  1.1  mrg 			 &shape_exp->where);
   6971  1.1  mrg 	      return &gfc_bad_expr;
   6972  1.1  mrg 	    }
   6973  1.1  mrg 
   6974  1.1  mrg 	  order[i]--;
   6975  1.1  mrg 	  if (x[order[i]] != 0)
   6976  1.1  mrg 	    {
   6977  1.1  mrg 	      gfc_error ("ORDER at %L is not a permutation of the size of "
   6978  1.1  mrg 			 "SHAPE at %L", &order_exp->where, &shape_exp->where);
   6979  1.1  mrg 	      return &gfc_bad_expr;
   6980  1.1  mrg 	    }
   6981  1.1  mrg 	  x[order[i]] = 1;
   6982  1.1  mrg 	}
   6983  1.1  mrg     }
   6984  1.1  mrg 
   6985  1.1  mrg   /* Count the elements in the source and padding arrays.  */
   6986  1.1  mrg 
   6987  1.1  mrg   npad = 0;
   6988  1.1  mrg   if (pad != NULL)
   6989  1.1  mrg     {
   6990  1.1  mrg       gfc_array_size (pad, &size);
   6991  1.1  mrg       npad = mpz_get_ui (size);
   6992  1.1  mrg       mpz_clear (size);
   6993  1.1  mrg     }
   6994  1.1  mrg 
   6995  1.1  mrg   gfc_array_size (source, &size);
   6996  1.1  mrg   nsource = mpz_get_ui (size);
   6997  1.1  mrg   mpz_clear (size);
   6998  1.1  mrg 
   6999  1.1  mrg   /* If it weren't for that pesky permutation we could just loop
   7000  1.1  mrg      through the source and round out any shortage with pad elements.
   7001  1.1  mrg      But no, someone just had to have the compiler do something the
   7002  1.1  mrg      user should be doing.  */
   7003  1.1  mrg 
   7004  1.1  mrg   for (i = 0; i < rank; i++)
   7005  1.1  mrg     x[i] = 0;
   7006  1.1  mrg 
   7007  1.1  mrg   result = gfc_get_array_expr (source->ts.type, source->ts.kind,
   7008  1.1  mrg 			       &source->where);
   7009  1.1  mrg   if (source->ts.type == BT_DERIVED)
   7010  1.1  mrg     result->ts.u.derived = source->ts.u.derived;
   7011  1.1  mrg   if (source->ts.type == BT_CHARACTER && result->ts.u.cl == NULL)
   7012  1.1  mrg     result->ts = source->ts;
   7013  1.1  mrg   result->rank = rank;
   7014  1.1  mrg   result->shape = gfc_get_shape (rank);
   7015  1.1  mrg   for (i = 0; i < rank; i++)
   7016  1.1  mrg     {
   7017  1.1  mrg       mpz_init_set_ui (result->shape[i], shape[i]);
   7018  1.1  mrg       if (shape[i] == 0)
   7019  1.1  mrg 	zerosize = true;
   7020  1.1  mrg     }
   7021  1.1  mrg 
   7022  1.1  mrg   if (zerosize)
   7023  1.1  mrg     goto sizezero;
   7024  1.1  mrg 
   7025  1.1  mrg   while (nsource > 0 || npad > 0)
   7026  1.1  mrg     {
   7027  1.1  mrg       /* Figure out which element to extract.  */
   7028  1.1  mrg       mpz_set_ui (index, 0);
   7029  1.1  mrg 
   7030  1.1  mrg       for (i = rank - 1; i >= 0; i--)
   7031  1.1  mrg 	{
   7032  1.1  mrg 	  mpz_add_ui (index, index, x[order[i]]);
   7033  1.1  mrg 	  if (i != 0)
   7034  1.1  mrg 	    mpz_mul_ui (index, index, shape[order[i - 1]]);
   7035  1.1  mrg 	}
   7036  1.1  mrg 
   7037  1.1  mrg       if (mpz_cmp_ui (index, INT_MAX) > 0)
   7038  1.1  mrg 	gfc_internal_error ("Reshaped array too large at %C");
   7039  1.1  mrg 
   7040  1.1  mrg       j = mpz_get_ui (index);
   7041  1.1  mrg 
   7042  1.1  mrg       if (j < nsource)
   7043  1.1  mrg 	e = gfc_constructor_lookup_expr (source->value.constructor, j);
   7044  1.1  mrg       else
   7045  1.1  mrg 	{
   7046  1.1  mrg 	  if (npad <= 0)
   7047  1.1  mrg 	    {
   7048  1.1  mrg 	      mpz_clear (index);
   7049  1.1  mrg 	      return NULL;
   7050  1.1  mrg 	    }
   7051  1.1  mrg 	  j = j - nsource;
   7052  1.1  mrg 	  j = j % npad;
   7053  1.1  mrg 	  e = gfc_constructor_lookup_expr (pad->value.constructor, j);
   7054  1.1  mrg 	}
   7055  1.1  mrg       gcc_assert (e);
   7056  1.1  mrg 
   7057  1.1  mrg       gfc_constructor_append_expr (&result->value.constructor,
   7058  1.1  mrg 				   gfc_copy_expr (e), &e->where);
   7059  1.1  mrg 
   7060  1.1  mrg       /* Calculate the next element.  */
   7061  1.1  mrg       i = 0;
   7062  1.1  mrg 
   7063  1.1  mrg inc:
   7064  1.1  mrg       if (++x[i] < shape[i])
   7065  1.1  mrg 	continue;
   7066  1.1  mrg       x[i++] = 0;
   7067  1.1  mrg       if (i < rank)
   7068  1.1  mrg 	goto inc;
   7069  1.1  mrg 
   7070  1.1  mrg       break;
   7071  1.1  mrg     }
   7072  1.1  mrg 
   7073  1.1  mrg sizezero:
   7074  1.1  mrg 
   7075  1.1  mrg   mpz_clear (index);
   7076  1.1  mrg 
   7077  1.1  mrg   return result;
   7078  1.1  mrg }
   7079  1.1  mrg 
   7080  1.1  mrg 
   7081  1.1  mrg gfc_expr *
   7082  1.1  mrg gfc_simplify_rrspacing (gfc_expr *x)
   7083  1.1  mrg {
   7084  1.1  mrg   gfc_expr *result;
   7085  1.1  mrg   int i;
   7086  1.1  mrg   long int e, p;
   7087  1.1  mrg 
   7088  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   7089  1.1  mrg     return NULL;
   7090  1.1  mrg 
   7091  1.1  mrg   i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
   7092  1.1  mrg 
   7093  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
   7094  1.1  mrg 
   7095  1.1  mrg   /* RRSPACING(+/- 0.0) = 0.0  */
   7096  1.1  mrg   if (mpfr_zero_p (x->value.real))
   7097  1.1  mrg     {
   7098  1.1  mrg       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
   7099  1.1  mrg       return result;
   7100  1.1  mrg     }
   7101  1.1  mrg 
   7102  1.1  mrg   /* RRSPACING(inf) = NaN  */
   7103  1.1  mrg   if (mpfr_inf_p (x->value.real))
   7104  1.1  mrg     {
   7105  1.1  mrg       mpfr_set_nan (result->value.real);
   7106  1.1  mrg       return result;
   7107  1.1  mrg     }
   7108  1.1  mrg 
   7109  1.1  mrg   /* RRSPACING(NaN) = same NaN  */
   7110  1.1  mrg   if (mpfr_nan_p (x->value.real))
   7111  1.1  mrg     {
   7112  1.1  mrg       mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
   7113  1.1  mrg       return result;
   7114  1.1  mrg     }
   7115  1.1  mrg 
   7116  1.1  mrg   /* | x * 2**(-e) | * 2**p.  */
   7117  1.1  mrg   mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
   7118  1.1  mrg   e = - (long int) mpfr_get_exp (x->value.real);
   7119  1.1  mrg   mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
   7120  1.1  mrg 
   7121  1.1  mrg   p = (long int) gfc_real_kinds[i].digits;
   7122  1.1  mrg   mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
   7123  1.1  mrg 
   7124  1.1  mrg   return range_check (result, "RRSPACING");
   7125  1.1  mrg }
   7126  1.1  mrg 
   7127  1.1  mrg 
   7128  1.1  mrg gfc_expr *
   7129  1.1  mrg gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
   7130  1.1  mrg {
   7131  1.1  mrg   int k, neg_flag, power, exp_range;
   7132  1.1  mrg   mpfr_t scale, radix;
   7133  1.1  mrg   gfc_expr *result;
   7134  1.1  mrg 
   7135  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
   7136  1.1  mrg     return NULL;
   7137  1.1  mrg 
   7138  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
   7139  1.1  mrg 
   7140  1.1  mrg   if (mpfr_zero_p (x->value.real))
   7141  1.1  mrg     {
   7142  1.1  mrg       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
   7143  1.1  mrg       return result;
   7144  1.1  mrg     }
   7145  1.1  mrg 
   7146  1.1  mrg   k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
   7147  1.1  mrg 
   7148  1.1  mrg   exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
   7149  1.1  mrg 
   7150  1.1  mrg   /* This check filters out values of i that would overflow an int.  */
   7151  1.1  mrg   if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
   7152  1.1  mrg       || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
   7153  1.1  mrg     {
   7154  1.1  mrg       gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
   7155  1.1  mrg       gfc_free_expr (result);
   7156  1.1  mrg       return &gfc_bad_expr;
   7157  1.1  mrg     }
   7158  1.1  mrg 
   7159  1.1  mrg   /* Compute scale = radix ** power.  */
   7160  1.1  mrg   power = mpz_get_si (i->value.integer);
   7161  1.1  mrg 
   7162  1.1  mrg   if (power >= 0)
   7163  1.1  mrg     neg_flag = 0;
   7164  1.1  mrg   else
   7165  1.1  mrg     {
   7166  1.1  mrg       neg_flag = 1;
   7167  1.1  mrg       power = -power;
   7168  1.1  mrg     }
   7169  1.1  mrg 
   7170  1.1  mrg   gfc_set_model_kind (x->ts.kind);
   7171  1.1  mrg   mpfr_init (scale);
   7172  1.1  mrg   mpfr_init (radix);
   7173  1.1  mrg   mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
   7174  1.1  mrg   mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
   7175  1.1  mrg 
   7176  1.1  mrg   if (neg_flag)
   7177  1.1  mrg     mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
   7178  1.1  mrg   else
   7179  1.1  mrg     mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
   7180  1.1  mrg 
   7181  1.1  mrg   mpfr_clears (scale, radix, NULL);
   7182  1.1  mrg 
   7183  1.1  mrg   return range_check (result, "SCALE");
   7184  1.1  mrg }
   7185  1.1  mrg 
   7186  1.1  mrg 
   7187  1.1  mrg /* Variants of strspn and strcspn that operate on wide characters.  */
   7188  1.1  mrg 
   7189  1.1  mrg static size_t
   7190  1.1  mrg wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
   7191  1.1  mrg {
   7192  1.1  mrg   size_t i = 0;
   7193  1.1  mrg   const gfc_char_t *c;
   7194  1.1  mrg 
   7195  1.1  mrg   while (s1[i])
   7196  1.1  mrg     {
   7197  1.1  mrg       for (c = s2; *c; c++)
   7198  1.1  mrg 	{
   7199  1.1  mrg 	  if (s1[i] == *c)
   7200  1.1  mrg 	    break;
   7201  1.1  mrg 	}
   7202  1.1  mrg       if (*c == '\0')
   7203  1.1  mrg 	break;
   7204  1.1  mrg       i++;
   7205  1.1  mrg     }
   7206  1.1  mrg 
   7207  1.1  mrg   return i;
   7208  1.1  mrg }
   7209  1.1  mrg 
   7210  1.1  mrg static size_t
   7211  1.1  mrg wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
   7212  1.1  mrg {
   7213  1.1  mrg   size_t i = 0;
   7214  1.1  mrg   const gfc_char_t *c;
   7215  1.1  mrg 
   7216  1.1  mrg   while (s1[i])
   7217  1.1  mrg     {
   7218  1.1  mrg       for (c = s2; *c; c++)
   7219  1.1  mrg 	{
   7220  1.1  mrg 	  if (s1[i] == *c)
   7221  1.1  mrg 	    break;
   7222  1.1  mrg 	}
   7223  1.1  mrg       if (*c)
   7224  1.1  mrg 	break;
   7225  1.1  mrg       i++;
   7226  1.1  mrg     }
   7227  1.1  mrg 
   7228  1.1  mrg   return i;
   7229  1.1  mrg }
   7230  1.1  mrg 
   7231  1.1  mrg 
   7232  1.1  mrg gfc_expr *
   7233  1.1  mrg gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
   7234  1.1  mrg {
   7235  1.1  mrg   gfc_expr *result;
   7236  1.1  mrg   int back;
   7237  1.1  mrg   size_t i;
   7238  1.1  mrg   size_t indx, len, lenc;
   7239  1.1  mrg   int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
   7240  1.1  mrg 
   7241  1.1  mrg   if (k == -1)
   7242  1.1  mrg     return &gfc_bad_expr;
   7243  1.1  mrg 
   7244  1.1  mrg   if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT
   7245  1.1  mrg       || ( b != NULL && b->expr_type !=  EXPR_CONSTANT))
   7246  1.1  mrg     return NULL;
   7247  1.1  mrg 
   7248  1.1  mrg   if (b != NULL && b->value.logical != 0)
   7249  1.1  mrg     back = 1;
   7250  1.1  mrg   else
   7251  1.1  mrg     back = 0;
   7252  1.1  mrg 
   7253  1.1  mrg   len = e->value.character.length;
   7254  1.1  mrg   lenc = c->value.character.length;
   7255  1.1  mrg 
   7256  1.1  mrg   if (len == 0 || lenc == 0)
   7257  1.1  mrg     {
   7258  1.1  mrg       indx = 0;
   7259  1.1  mrg     }
   7260  1.1  mrg   else
   7261  1.1  mrg     {
   7262  1.1  mrg       if (back == 0)
   7263  1.1  mrg 	{
   7264  1.1  mrg 	  indx = wide_strcspn (e->value.character.string,
   7265  1.1  mrg 			       c->value.character.string) + 1;
   7266  1.1  mrg 	  if (indx > len)
   7267  1.1  mrg 	    indx = 0;
   7268  1.1  mrg 	}
   7269  1.1  mrg       else
   7270  1.1  mrg 	for (indx = len; indx > 0; indx--)
   7271  1.1  mrg 	  {
   7272  1.1  mrg 	    for (i = 0; i < lenc; i++)
   7273  1.1  mrg 	      {
   7274  1.1  mrg 		if (c->value.character.string[i]
   7275  1.1  mrg 		    == e->value.character.string[indx - 1])
   7276  1.1  mrg 		  break;
   7277  1.1  mrg 	      }
   7278  1.1  mrg 	    if (i < lenc)
   7279  1.1  mrg 	      break;
   7280  1.1  mrg 	  }
   7281  1.1  mrg     }
   7282  1.1  mrg 
   7283  1.1  mrg   result = gfc_get_int_expr (k, &e->where, indx);
   7284  1.1  mrg   return range_check (result, "SCAN");
   7285  1.1  mrg }
   7286  1.1  mrg 
   7287  1.1  mrg 
   7288  1.1  mrg gfc_expr *
   7289  1.1  mrg gfc_simplify_selected_char_kind (gfc_expr *e)
   7290  1.1  mrg {
   7291  1.1  mrg   int kind;
   7292  1.1  mrg 
   7293  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   7294  1.1  mrg     return NULL;
   7295  1.1  mrg 
   7296  1.1  mrg   if (gfc_compare_with_Cstring (e, "ascii", false) == 0
   7297  1.1  mrg       || gfc_compare_with_Cstring (e, "default", false) == 0)
   7298  1.1  mrg     kind = 1;
   7299  1.1  mrg   else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
   7300  1.1  mrg     kind = 4;
   7301  1.1  mrg   else
   7302  1.1  mrg     kind = -1;
   7303  1.1  mrg 
   7304  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
   7305  1.1  mrg }
   7306  1.1  mrg 
   7307  1.1  mrg 
   7308  1.1  mrg gfc_expr *
   7309  1.1  mrg gfc_simplify_selected_int_kind (gfc_expr *e)
   7310  1.1  mrg {
   7311  1.1  mrg   int i, kind, range;
   7312  1.1  mrg 
   7313  1.1  mrg   if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range))
   7314  1.1  mrg     return NULL;
   7315  1.1  mrg 
   7316  1.1  mrg   kind = INT_MAX;
   7317  1.1  mrg 
   7318  1.1  mrg   for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
   7319  1.1  mrg     if (gfc_integer_kinds[i].range >= range
   7320  1.1  mrg 	&& gfc_integer_kinds[i].kind < kind)
   7321  1.1  mrg       kind = gfc_integer_kinds[i].kind;
   7322  1.1  mrg 
   7323  1.1  mrg   if (kind == INT_MAX)
   7324  1.1  mrg     kind = -1;
   7325  1.1  mrg 
   7326  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
   7327  1.1  mrg }
   7328  1.1  mrg 
   7329  1.1  mrg 
   7330  1.1  mrg gfc_expr *
   7331  1.1  mrg gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
   7332  1.1  mrg {
   7333  1.1  mrg   int range, precision, radix, i, kind, found_precision, found_range,
   7334  1.1  mrg       found_radix;
   7335  1.1  mrg   locus *loc = &gfc_current_locus;
   7336  1.1  mrg 
   7337  1.1  mrg   if (p == NULL)
   7338  1.1  mrg     precision = 0;
   7339  1.1  mrg   else
   7340  1.1  mrg     {
   7341  1.1  mrg       if (p->expr_type != EXPR_CONSTANT
   7342  1.1  mrg 	  || gfc_extract_int (p, &precision))
   7343  1.1  mrg 	return NULL;
   7344  1.1  mrg       loc = &p->where;
   7345  1.1  mrg     }
   7346  1.1  mrg 
   7347  1.1  mrg   if (q == NULL)
   7348  1.1  mrg     range = 0;
   7349  1.1  mrg   else
   7350  1.1  mrg     {
   7351  1.1  mrg       if (q->expr_type != EXPR_CONSTANT
   7352  1.1  mrg 	  || gfc_extract_int (q, &range))
   7353  1.1  mrg 	return NULL;
   7354  1.1  mrg 
   7355  1.1  mrg       if (!loc)
   7356  1.1  mrg 	loc = &q->where;
   7357  1.1  mrg     }
   7358  1.1  mrg 
   7359  1.1  mrg   if (rdx == NULL)
   7360  1.1  mrg     radix = 0;
   7361  1.1  mrg   else
   7362  1.1  mrg     {
   7363  1.1  mrg       if (rdx->expr_type != EXPR_CONSTANT
   7364  1.1  mrg 	  || gfc_extract_int (rdx, &radix))
   7365  1.1  mrg 	return NULL;
   7366  1.1  mrg 
   7367  1.1  mrg       if (!loc)
   7368  1.1  mrg 	loc = &rdx->where;
   7369  1.1  mrg     }
   7370  1.1  mrg 
   7371  1.1  mrg   kind = INT_MAX;
   7372  1.1  mrg   found_precision = 0;
   7373  1.1  mrg   found_range = 0;
   7374  1.1  mrg   found_radix = 0;
   7375  1.1  mrg 
   7376  1.1  mrg   for (i = 0; gfc_real_kinds[i].kind != 0; i++)
   7377  1.1  mrg     {
   7378  1.1  mrg       if (gfc_real_kinds[i].precision >= precision)
   7379  1.1  mrg 	found_precision = 1;
   7380  1.1  mrg 
   7381  1.1  mrg       if (gfc_real_kinds[i].range >= range)
   7382  1.1  mrg 	found_range = 1;
   7383  1.1  mrg 
   7384  1.1  mrg       if (radix == 0 || gfc_real_kinds[i].radix == radix)
   7385  1.1  mrg 	found_radix = 1;
   7386  1.1  mrg 
   7387  1.1  mrg       if (gfc_real_kinds[i].precision >= precision
   7388  1.1  mrg 	  && gfc_real_kinds[i].range >= range
   7389  1.1  mrg 	  && (radix == 0 || gfc_real_kinds[i].radix == radix)
   7390  1.1  mrg 	  && gfc_real_kinds[i].kind < kind)
   7391  1.1  mrg 	kind = gfc_real_kinds[i].kind;
   7392  1.1  mrg     }
   7393  1.1  mrg 
   7394  1.1  mrg   if (kind == INT_MAX)
   7395  1.1  mrg     {
   7396  1.1  mrg       if (found_radix && found_range && !found_precision)
   7397  1.1  mrg 	kind = -1;
   7398  1.1  mrg       else if (found_radix && found_precision && !found_range)
   7399  1.1  mrg 	kind = -2;
   7400  1.1  mrg       else if (found_radix && !found_precision && !found_range)
   7401  1.1  mrg 	kind = -3;
   7402  1.1  mrg       else if (found_radix)
   7403  1.1  mrg 	kind = -4;
   7404  1.1  mrg       else
   7405  1.1  mrg 	kind = -5;
   7406  1.1  mrg     }
   7407  1.1  mrg 
   7408  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
   7409  1.1  mrg }
   7410  1.1  mrg 
   7411  1.1  mrg 
   7412  1.1  mrg gfc_expr *
   7413  1.1  mrg gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
   7414  1.1  mrg {
   7415  1.1  mrg   gfc_expr *result;
   7416  1.1  mrg   mpfr_t exp, absv, log2, pow2, frac;
   7417  1.1  mrg   long exp2;
   7418  1.1  mrg 
   7419  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
   7420  1.1  mrg     return NULL;
   7421  1.1  mrg 
   7422  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
   7423  1.1  mrg 
   7424  1.1  mrg   /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
   7425  1.1  mrg      SET_EXPONENT (NaN) = same NaN  */
   7426  1.1  mrg   if (mpfr_zero_p (x->value.real) || mpfr_nan_p (x->value.real))
   7427  1.1  mrg     {
   7428  1.1  mrg       mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
   7429  1.1  mrg       return result;
   7430  1.1  mrg     }
   7431  1.1  mrg 
   7432  1.1  mrg   /* SET_EXPONENT (inf) = NaN  */
   7433  1.1  mrg   if (mpfr_inf_p (x->value.real))
   7434  1.1  mrg     {
   7435  1.1  mrg       mpfr_set_nan (result->value.real);
   7436  1.1  mrg       return result;
   7437  1.1  mrg     }
   7438  1.1  mrg 
   7439  1.1  mrg   gfc_set_model_kind (x->ts.kind);
   7440  1.1  mrg   mpfr_init (absv);
   7441  1.1  mrg   mpfr_init (log2);
   7442  1.1  mrg   mpfr_init (exp);
   7443  1.1  mrg   mpfr_init (pow2);
   7444  1.1  mrg   mpfr_init (frac);
   7445  1.1  mrg 
   7446  1.1  mrg   mpfr_abs (absv, x->value.real, GFC_RND_MODE);
   7447  1.1  mrg   mpfr_log2 (log2, absv, GFC_RND_MODE);
   7448  1.1  mrg 
   7449  1.1  mrg   mpfr_floor (log2, log2);
   7450  1.1  mrg   mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
   7451  1.1  mrg 
   7452  1.1  mrg   /* Old exponent value, and fraction.  */
   7453  1.1  mrg   mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
   7454  1.1  mrg 
   7455  1.1  mrg   mpfr_div (frac, x->value.real, pow2, GFC_RND_MODE);
   7456  1.1  mrg 
   7457  1.1  mrg   /* New exponent.  */
   7458  1.1  mrg   exp2 = mpz_get_si (i->value.integer);
   7459  1.1  mrg   mpfr_mul_2si (result->value.real, frac, exp2, GFC_RND_MODE);
   7460  1.1  mrg 
   7461  1.1  mrg   mpfr_clears (absv, log2, exp, pow2, frac, NULL);
   7462  1.1  mrg 
   7463  1.1  mrg   return range_check (result, "SET_EXPONENT");
   7464  1.1  mrg }
   7465  1.1  mrg 
   7466  1.1  mrg 
   7467  1.1  mrg gfc_expr *
   7468  1.1  mrg gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
   7469  1.1  mrg {
   7470  1.1  mrg   mpz_t shape[GFC_MAX_DIMENSIONS];
   7471  1.1  mrg   gfc_expr *result, *e, *f;
   7472  1.1  mrg   gfc_array_ref *ar;
   7473  1.1  mrg   int n;
   7474  1.1  mrg   bool t;
   7475  1.1  mrg   int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind);
   7476  1.1  mrg 
   7477  1.1  mrg   if (source->rank == -1)
   7478  1.1  mrg     return NULL;
   7479  1.1  mrg 
   7480  1.1  mrg   result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
   7481  1.1  mrg   result->shape = gfc_get_shape (1);
   7482  1.1  mrg   mpz_init (result->shape[0]);
   7483  1.1  mrg 
   7484  1.1  mrg   if (source->rank == 0)
   7485  1.1  mrg     return result;
   7486  1.1  mrg 
   7487  1.1  mrg   if (source->expr_type == EXPR_VARIABLE)
   7488  1.1  mrg     {
   7489  1.1  mrg       ar = gfc_find_array_ref (source);
   7490  1.1  mrg       t = gfc_array_ref_shape (ar, shape);
   7491  1.1  mrg     }
   7492  1.1  mrg   else if (source->shape)
   7493  1.1  mrg     {
   7494  1.1  mrg       t = true;
   7495  1.1  mrg       for (n = 0; n < source->rank; n++)
   7496  1.1  mrg 	{
   7497  1.1  mrg 	  mpz_init (shape[n]);
   7498  1.1  mrg 	  mpz_set (shape[n], source->shape[n]);
   7499  1.1  mrg 	}
   7500  1.1  mrg     }
   7501  1.1  mrg   else
   7502  1.1  mrg     t = false;
   7503  1.1  mrg 
   7504  1.1  mrg   for (n = 0; n < source->rank; n++)
   7505  1.1  mrg     {
   7506  1.1  mrg       e = gfc_get_constant_expr (BT_INTEGER, k, &source->where);
   7507  1.1  mrg 
   7508  1.1  mrg       if (t)
   7509  1.1  mrg 	mpz_set (e->value.integer, shape[n]);
   7510  1.1  mrg       else
   7511  1.1  mrg 	{
   7512  1.1  mrg 	  mpz_set_ui (e->value.integer, n + 1);
   7513  1.1  mrg 
   7514  1.1  mrg 	  f = simplify_size (source, e, k);
   7515  1.1  mrg 	  gfc_free_expr (e);
   7516  1.1  mrg 	  if (f == NULL)
   7517  1.1  mrg 	    {
   7518  1.1  mrg 	      gfc_free_expr (result);
   7519  1.1  mrg 	      return NULL;
   7520  1.1  mrg 	    }
   7521  1.1  mrg 	  else
   7522  1.1  mrg 	    e = f;
   7523  1.1  mrg 	}
   7524  1.1  mrg 
   7525  1.1  mrg       if (e == &gfc_bad_expr || range_check (e, "SHAPE") == &gfc_bad_expr)
   7526  1.1  mrg 	{
   7527  1.1  mrg 	  gfc_free_expr (result);
   7528  1.1  mrg 	  if (t)
   7529  1.1  mrg 	    gfc_clear_shape (shape, source->rank);
   7530  1.1  mrg 	  return &gfc_bad_expr;
   7531  1.1  mrg 	}
   7532  1.1  mrg 
   7533  1.1  mrg       gfc_constructor_append_expr (&result->value.constructor, e, NULL);
   7534  1.1  mrg     }
   7535  1.1  mrg 
   7536  1.1  mrg   if (t)
   7537  1.1  mrg     gfc_clear_shape (shape, source->rank);
   7538  1.1  mrg 
   7539  1.1  mrg   mpz_set_si (result->shape[0], source->rank);
   7540  1.1  mrg 
   7541  1.1  mrg   return result;
   7542  1.1  mrg }
   7543  1.1  mrg 
   7544  1.1  mrg 
   7545  1.1  mrg static gfc_expr *
   7546  1.1  mrg simplify_size (gfc_expr *array, gfc_expr *dim, int k)
   7547  1.1  mrg {
   7548  1.1  mrg   mpz_t size;
   7549  1.1  mrg   gfc_expr *return_value;
   7550  1.1  mrg   int d;
   7551  1.1  mrg   gfc_ref *ref;
   7552  1.1  mrg 
   7553  1.1  mrg   /* For unary operations, the size of the result is given by the size
   7554  1.1  mrg      of the operand.  For binary ones, it's the size of the first operand
   7555  1.1  mrg      unless it is scalar, then it is the size of the second.  */
   7556  1.1  mrg   if (array->expr_type == EXPR_OP && !array->value.op.uop)
   7557  1.1  mrg     {
   7558  1.1  mrg       gfc_expr* replacement;
   7559  1.1  mrg       gfc_expr* simplified;
   7560  1.1  mrg 
   7561  1.1  mrg       switch (array->value.op.op)
   7562  1.1  mrg 	{
   7563  1.1  mrg 	  /* Unary operations.  */
   7564  1.1  mrg 	  case INTRINSIC_NOT:
   7565  1.1  mrg 	  case INTRINSIC_UPLUS:
   7566  1.1  mrg 	  case INTRINSIC_UMINUS:
   7567  1.1  mrg 	  case INTRINSIC_PARENTHESES:
   7568  1.1  mrg 	    replacement = array->value.op.op1;
   7569  1.1  mrg 	    break;
   7570  1.1  mrg 
   7571  1.1  mrg 	  /* Binary operations.  If any one of the operands is scalar, take
   7572  1.1  mrg 	     the other one's size.  If both of them are arrays, it does not
   7573  1.1  mrg 	     matter -- try to find one with known shape, if possible.  */
   7574  1.1  mrg 	  default:
   7575  1.1  mrg 	    if (array->value.op.op1->rank == 0)
   7576  1.1  mrg 	      replacement = array->value.op.op2;
   7577  1.1  mrg 	    else if (array->value.op.op2->rank == 0)
   7578  1.1  mrg 	      replacement = array->value.op.op1;
   7579  1.1  mrg 	    else
   7580  1.1  mrg 	      {
   7581  1.1  mrg 		simplified = simplify_size (array->value.op.op1, dim, k);
   7582  1.1  mrg 		if (simplified)
   7583  1.1  mrg 		  return simplified;
   7584  1.1  mrg 
   7585  1.1  mrg 		replacement = array->value.op.op2;
   7586  1.1  mrg 	      }
   7587  1.1  mrg 	    break;
   7588  1.1  mrg 	}
   7589  1.1  mrg 
   7590  1.1  mrg       /* Try to reduce it directly if possible.  */
   7591  1.1  mrg       simplified = simplify_size (replacement, dim, k);
   7592  1.1  mrg 
   7593  1.1  mrg       /* Otherwise, we build a new SIZE call.  This is hopefully at least
   7594  1.1  mrg 	 simpler than the original one.  */
   7595  1.1  mrg       if (!simplified)
   7596  1.1  mrg 	{
   7597  1.1  mrg 	  gfc_expr *kind = gfc_get_int_expr (gfc_default_integer_kind, NULL, k);
   7598  1.1  mrg 	  simplified = gfc_build_intrinsic_call (gfc_current_ns,
   7599  1.1  mrg 						 GFC_ISYM_SIZE, "size",
   7600  1.1  mrg 						 array->where, 3,
   7601  1.1  mrg 						 gfc_copy_expr (replacement),
   7602  1.1  mrg 						 gfc_copy_expr (dim),
   7603  1.1  mrg 						 kind);
   7604  1.1  mrg 	}
   7605  1.1  mrg       return simplified;
   7606  1.1  mrg     }
   7607  1.1  mrg 
   7608  1.1  mrg   for (ref = array->ref; ref; ref = ref->next)
   7609  1.1  mrg     if (ref->type == REF_ARRAY && ref->u.ar.as
   7610  1.1  mrg 	&& !gfc_resolve_array_spec (ref->u.ar.as, 0))
   7611  1.1  mrg       return NULL;
   7612  1.1  mrg 
   7613  1.1  mrg   if (dim == NULL)
   7614  1.1  mrg     {
   7615  1.1  mrg       if (!gfc_array_size (array, &size))
   7616  1.1  mrg 	return NULL;
   7617  1.1  mrg     }
   7618  1.1  mrg   else
   7619  1.1  mrg     {
   7620  1.1  mrg       if (dim->expr_type != EXPR_CONSTANT)
   7621  1.1  mrg 	return NULL;
   7622  1.1  mrg 
   7623  1.1  mrg       d = mpz_get_ui (dim->value.integer) - 1;
   7624  1.1  mrg       if (!gfc_array_dimen_size (array, d, &size))
   7625  1.1  mrg 	return NULL;
   7626  1.1  mrg     }
   7627  1.1  mrg 
   7628  1.1  mrg   return_value = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
   7629  1.1  mrg   mpz_set (return_value->value.integer, size);
   7630  1.1  mrg   mpz_clear (size);
   7631  1.1  mrg 
   7632  1.1  mrg   return return_value;
   7633  1.1  mrg }
   7634  1.1  mrg 
   7635  1.1  mrg 
   7636  1.1  mrg gfc_expr *
   7637  1.1  mrg gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
   7638  1.1  mrg {
   7639  1.1  mrg   gfc_expr *result;
   7640  1.1  mrg   int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
   7641  1.1  mrg 
   7642  1.1  mrg   if (k == -1)
   7643  1.1  mrg     return &gfc_bad_expr;
   7644  1.1  mrg 
   7645  1.1  mrg   result = simplify_size (array, dim, k);
   7646  1.1  mrg   if (result == NULL || result == &gfc_bad_expr)
   7647  1.1  mrg     return result;
   7648  1.1  mrg 
   7649  1.1  mrg   return range_check (result, "SIZE");
   7650  1.1  mrg }
   7651  1.1  mrg 
   7652  1.1  mrg 
   7653  1.1  mrg /* SIZEOF and C_SIZEOF return the size in bytes of an array element
   7654  1.1  mrg    multiplied by the array size.  */
   7655  1.1  mrg 
   7656  1.1  mrg gfc_expr *
   7657  1.1  mrg gfc_simplify_sizeof (gfc_expr *x)
   7658  1.1  mrg {
   7659  1.1  mrg   gfc_expr *result = NULL;
   7660  1.1  mrg   mpz_t array_size;
   7661  1.1  mrg   size_t res_size;
   7662  1.1  mrg 
   7663  1.1  mrg   if (x->ts.type == BT_CLASS || x->ts.deferred)
   7664  1.1  mrg     return NULL;
   7665  1.1  mrg 
   7666  1.1  mrg   if (x->ts.type == BT_CHARACTER
   7667  1.1  mrg       && (!x->ts.u.cl || !x->ts.u.cl->length
   7668  1.1  mrg 	  || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
   7669  1.1  mrg     return NULL;
   7670  1.1  mrg 
   7671  1.1  mrg   if (x->rank && x->expr_type != EXPR_ARRAY
   7672  1.1  mrg       && !gfc_array_size (x, &array_size))
   7673  1.1  mrg     return NULL;
   7674  1.1  mrg 
   7675  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
   7676  1.1  mrg 				  &x->where);
   7677  1.1  mrg   gfc_target_expr_size (x, &res_size);
   7678  1.1  mrg   mpz_set_si (result->value.integer, res_size);
   7679  1.1  mrg 
   7680  1.1  mrg   return result;
   7681  1.1  mrg }
   7682  1.1  mrg 
   7683  1.1  mrg 
   7684  1.1  mrg /* STORAGE_SIZE returns the size in bits of a single array element.  */
   7685  1.1  mrg 
   7686  1.1  mrg gfc_expr *
   7687  1.1  mrg gfc_simplify_storage_size (gfc_expr *x,
   7688  1.1  mrg 			   gfc_expr *kind)
   7689  1.1  mrg {
   7690  1.1  mrg   gfc_expr *result = NULL;
   7691  1.1  mrg   int k;
   7692  1.1  mrg   size_t siz;
   7693  1.1  mrg 
   7694  1.1  mrg   if (x->ts.type == BT_CLASS || x->ts.deferred)
   7695  1.1  mrg     return NULL;
   7696  1.1  mrg 
   7697  1.1  mrg   if (x->ts.type == BT_CHARACTER && x->expr_type != EXPR_CONSTANT
   7698  1.1  mrg       && (!x->ts.u.cl || !x->ts.u.cl->length
   7699  1.1  mrg 	  || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
   7700  1.1  mrg     return NULL;
   7701  1.1  mrg 
   7702  1.1  mrg   k = get_kind (BT_INTEGER, kind, "STORAGE_SIZE", gfc_default_integer_kind);
   7703  1.1  mrg   if (k == -1)
   7704  1.1  mrg     return &gfc_bad_expr;
   7705  1.1  mrg 
   7706  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
   7707  1.1  mrg 
   7708  1.1  mrg   gfc_element_size (x, &siz);
   7709  1.1  mrg   mpz_set_si (result->value.integer, siz);
   7710  1.1  mrg   mpz_mul_ui (result->value.integer, result->value.integer, BITS_PER_UNIT);
   7711  1.1  mrg 
   7712  1.1  mrg   return range_check (result, "STORAGE_SIZE");
   7713  1.1  mrg }
   7714  1.1  mrg 
   7715  1.1  mrg 
   7716  1.1  mrg gfc_expr *
   7717  1.1  mrg gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
   7718  1.1  mrg {
   7719  1.1  mrg   gfc_expr *result;
   7720  1.1  mrg 
   7721  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   7722  1.1  mrg     return NULL;
   7723  1.1  mrg 
   7724  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   7725  1.1  mrg 
   7726  1.1  mrg   switch (x->ts.type)
   7727  1.1  mrg     {
   7728  1.1  mrg       case BT_INTEGER:
   7729  1.1  mrg 	mpz_abs (result->value.integer, x->value.integer);
   7730  1.1  mrg 	if (mpz_sgn (y->value.integer) < 0)
   7731  1.1  mrg 	  mpz_neg (result->value.integer, result->value.integer);
   7732  1.1  mrg 	break;
   7733  1.1  mrg 
   7734  1.1  mrg       case BT_REAL:
   7735  1.1  mrg 	if (flag_sign_zero)
   7736  1.1  mrg 	  mpfr_copysign (result->value.real, x->value.real, y->value.real,
   7737  1.1  mrg 			GFC_RND_MODE);
   7738  1.1  mrg 	else
   7739  1.1  mrg 	  mpfr_setsign (result->value.real, x->value.real,
   7740  1.1  mrg 			mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
   7741  1.1  mrg 	break;
   7742  1.1  mrg 
   7743  1.1  mrg       default:
   7744  1.1  mrg 	gfc_internal_error ("Bad type in gfc_simplify_sign");
   7745  1.1  mrg     }
   7746  1.1  mrg 
   7747  1.1  mrg   return result;
   7748  1.1  mrg }
   7749  1.1  mrg 
   7750  1.1  mrg 
   7751  1.1  mrg gfc_expr *
   7752  1.1  mrg gfc_simplify_sin (gfc_expr *x)
   7753  1.1  mrg {
   7754  1.1  mrg   gfc_expr *result;
   7755  1.1  mrg 
   7756  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   7757  1.1  mrg     return NULL;
   7758  1.1  mrg 
   7759  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   7760  1.1  mrg 
   7761  1.1  mrg   switch (x->ts.type)
   7762  1.1  mrg     {
   7763  1.1  mrg       case BT_REAL:
   7764  1.1  mrg 	mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
   7765  1.1  mrg 	break;
   7766  1.1  mrg 
   7767  1.1  mrg       case BT_COMPLEX:
   7768  1.1  mrg 	gfc_set_model (x->value.real);
   7769  1.1  mrg 	mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   7770  1.1  mrg 	break;
   7771  1.1  mrg 
   7772  1.1  mrg       default:
   7773  1.1  mrg 	gfc_internal_error ("in gfc_simplify_sin(): Bad type");
   7774  1.1  mrg     }
   7775  1.1  mrg 
   7776  1.1  mrg   return range_check (result, "SIN");
   7777  1.1  mrg }
   7778  1.1  mrg 
   7779  1.1  mrg 
   7780  1.1  mrg gfc_expr *
   7781  1.1  mrg gfc_simplify_sinh (gfc_expr *x)
   7782  1.1  mrg {
   7783  1.1  mrg   gfc_expr *result;
   7784  1.1  mrg 
   7785  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   7786  1.1  mrg     return NULL;
   7787  1.1  mrg 
   7788  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   7789  1.1  mrg 
   7790  1.1  mrg   switch (x->ts.type)
   7791  1.1  mrg     {
   7792  1.1  mrg       case BT_REAL:
   7793  1.1  mrg 	mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
   7794  1.1  mrg 	break;
   7795  1.1  mrg 
   7796  1.1  mrg       case BT_COMPLEX:
   7797  1.1  mrg 	mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   7798  1.1  mrg 	break;
   7799  1.1  mrg 
   7800  1.1  mrg       default:
   7801  1.1  mrg 	gcc_unreachable ();
   7802  1.1  mrg     }
   7803  1.1  mrg 
   7804  1.1  mrg   return range_check (result, "SINH");
   7805  1.1  mrg }
   7806  1.1  mrg 
   7807  1.1  mrg 
   7808  1.1  mrg /* The argument is always a double precision real that is converted to
   7809  1.1  mrg    single precision.  TODO: Rounding!  */
   7810  1.1  mrg 
   7811  1.1  mrg gfc_expr *
   7812  1.1  mrg gfc_simplify_sngl (gfc_expr *a)
   7813  1.1  mrg {
   7814  1.1  mrg   gfc_expr *result;
   7815  1.1  mrg   int tmp1, tmp2;
   7816  1.1  mrg 
   7817  1.1  mrg   if (a->expr_type != EXPR_CONSTANT)
   7818  1.1  mrg     return NULL;
   7819  1.1  mrg 
   7820  1.1  mrg   /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
   7821  1.1  mrg      warnings.  */
   7822  1.1  mrg   tmp1 = warn_conversion;
   7823  1.1  mrg   tmp2 = warn_conversion_extra;
   7824  1.1  mrg   warn_conversion = warn_conversion_extra = 0;
   7825  1.1  mrg 
   7826  1.1  mrg   result = gfc_real2real (a, gfc_default_real_kind);
   7827  1.1  mrg 
   7828  1.1  mrg   warn_conversion = tmp1;
   7829  1.1  mrg   warn_conversion_extra = tmp2;
   7830  1.1  mrg 
   7831  1.1  mrg   return range_check (result, "SNGL");
   7832  1.1  mrg }
   7833  1.1  mrg 
   7834  1.1  mrg 
   7835  1.1  mrg gfc_expr *
   7836  1.1  mrg gfc_simplify_spacing (gfc_expr *x)
   7837  1.1  mrg {
   7838  1.1  mrg   gfc_expr *result;
   7839  1.1  mrg   int i;
   7840  1.1  mrg   long int en, ep;
   7841  1.1  mrg 
   7842  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   7843  1.1  mrg     return NULL;
   7844  1.1  mrg 
   7845  1.1  mrg   i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
   7846  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
   7847  1.1  mrg 
   7848  1.1  mrg   /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0)  */
   7849  1.1  mrg   if (mpfr_zero_p (x->value.real))
   7850  1.1  mrg     {
   7851  1.1  mrg       mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
   7852  1.1  mrg       return result;
   7853  1.1  mrg     }
   7854  1.1  mrg 
   7855  1.1  mrg   /* SPACING(inf) = NaN  */
   7856  1.1  mrg   if (mpfr_inf_p (x->value.real))
   7857  1.1  mrg     {
   7858  1.1  mrg       mpfr_set_nan (result->value.real);
   7859  1.1  mrg       return result;
   7860  1.1  mrg     }
   7861  1.1  mrg 
   7862  1.1  mrg   /* SPACING(NaN) = same NaN  */
   7863  1.1  mrg   if (mpfr_nan_p (x->value.real))
   7864  1.1  mrg     {
   7865  1.1  mrg       mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
   7866  1.1  mrg       return result;
   7867  1.1  mrg     }
   7868  1.1  mrg 
   7869  1.1  mrg   /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
   7870  1.1  mrg      are the radix, exponent of x, and precision.  This excludes the
   7871  1.1  mrg      possibility of subnormal numbers.  Fortran 2003 states the result is
   7872  1.1  mrg      b**max(e - p, emin - 1).  */
   7873  1.1  mrg 
   7874  1.1  mrg   ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
   7875  1.1  mrg   en = (long int) gfc_real_kinds[i].min_exponent - 1;
   7876  1.1  mrg   en = en > ep ? en : ep;
   7877  1.1  mrg 
   7878  1.1  mrg   mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
   7879  1.1  mrg   mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
   7880  1.1  mrg 
   7881  1.1  mrg   return range_check (result, "SPACING");
   7882  1.1  mrg }
   7883  1.1  mrg 
   7884  1.1  mrg 
   7885  1.1  mrg gfc_expr *
   7886  1.1  mrg gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
   7887  1.1  mrg {
   7888  1.1  mrg   gfc_expr *result = NULL;
   7889  1.1  mrg   int nelem, i, j, dim, ncopies;
   7890  1.1  mrg   mpz_t size;
   7891  1.1  mrg 
   7892  1.1  mrg   if ((!gfc_is_constant_expr (source)
   7893  1.1  mrg        && !is_constant_array_expr (source))
   7894  1.1  mrg       || !gfc_is_constant_expr (dim_expr)
   7895  1.1  mrg       || !gfc_is_constant_expr (ncopies_expr))
   7896  1.1  mrg     return NULL;
   7897  1.1  mrg 
   7898  1.1  mrg   gcc_assert (dim_expr->ts.type == BT_INTEGER);
   7899  1.1  mrg   gfc_extract_int (dim_expr, &dim);
   7900  1.1  mrg   dim -= 1;   /* zero-base DIM */
   7901  1.1  mrg 
   7902  1.1  mrg   gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
   7903  1.1  mrg   gfc_extract_int (ncopies_expr, &ncopies);
   7904  1.1  mrg   ncopies = MAX (ncopies, 0);
   7905  1.1  mrg 
   7906  1.1  mrg   /* Do not allow the array size to exceed the limit for an array
   7907  1.1  mrg      constructor.  */
   7908  1.1  mrg   if (source->expr_type == EXPR_ARRAY)
   7909  1.1  mrg     {
   7910  1.1  mrg       if (!gfc_array_size (source, &size))
   7911  1.1  mrg 	gfc_internal_error ("Failure getting length of a constant array.");
   7912  1.1  mrg     }
   7913  1.1  mrg   else
   7914  1.1  mrg     mpz_init_set_ui (size, 1);
   7915  1.1  mrg 
   7916  1.1  mrg   nelem = mpz_get_si (size) * ncopies;
   7917  1.1  mrg   if (nelem > flag_max_array_constructor)
   7918  1.1  mrg     {
   7919  1.1  mrg       if (gfc_init_expr_flag)
   7920  1.1  mrg 	{
   7921  1.1  mrg 	  gfc_error ("The number of elements (%d) in the array constructor "
   7922  1.1  mrg 		     "at %L requires an increase of the allowed %d upper "
   7923  1.1  mrg 		     "limit.  See %<-fmax-array-constructor%> option.",
   7924  1.1  mrg 		     nelem, &source->where, flag_max_array_constructor);
   7925  1.1  mrg 	  return &gfc_bad_expr;
   7926  1.1  mrg 	}
   7927  1.1  mrg       else
   7928  1.1  mrg 	return NULL;
   7929  1.1  mrg     }
   7930  1.1  mrg 
   7931  1.1  mrg   if (source->expr_type == EXPR_CONSTANT
   7932  1.1  mrg       || source->expr_type == EXPR_STRUCTURE)
   7933  1.1  mrg     {
   7934  1.1  mrg       gcc_assert (dim == 0);
   7935  1.1  mrg 
   7936  1.1  mrg       result = gfc_get_array_expr (source->ts.type, source->ts.kind,
   7937  1.1  mrg 				   &source->where);
   7938  1.1  mrg       if (source->ts.type == BT_DERIVED)
   7939  1.1  mrg 	result->ts.u.derived = source->ts.u.derived;
   7940  1.1  mrg       result->rank = 1;
   7941  1.1  mrg       result->shape = gfc_get_shape (result->rank);
   7942  1.1  mrg       mpz_init_set_si (result->shape[0], ncopies);
   7943  1.1  mrg 
   7944  1.1  mrg       for (i = 0; i < ncopies; ++i)
   7945  1.1  mrg         gfc_constructor_append_expr (&result->value.constructor,
   7946  1.1  mrg 				     gfc_copy_expr (source), NULL);
   7947  1.1  mrg     }
   7948  1.1  mrg   else if (source->expr_type == EXPR_ARRAY)
   7949  1.1  mrg     {
   7950  1.1  mrg       int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
   7951  1.1  mrg       gfc_constructor *source_ctor;
   7952  1.1  mrg 
   7953  1.1  mrg       gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
   7954  1.1  mrg       gcc_assert (dim >= 0 && dim <= source->rank);
   7955  1.1  mrg 
   7956  1.1  mrg       result = gfc_get_array_expr (source->ts.type, source->ts.kind,
   7957  1.1  mrg 				   &source->where);
   7958  1.1  mrg       if (source->ts.type == BT_DERIVED)
   7959  1.1  mrg 	result->ts.u.derived = source->ts.u.derived;
   7960  1.1  mrg       result->rank = source->rank + 1;
   7961  1.1  mrg       result->shape = gfc_get_shape (result->rank);
   7962  1.1  mrg 
   7963  1.1  mrg       for (i = 0, j = 0; i < result->rank; ++i)
   7964  1.1  mrg 	{
   7965  1.1  mrg 	  if (i != dim)
   7966  1.1  mrg 	    mpz_init_set (result->shape[i], source->shape[j++]);
   7967  1.1  mrg 	  else
   7968  1.1  mrg 	    mpz_init_set_si (result->shape[i], ncopies);
   7969  1.1  mrg 
   7970  1.1  mrg 	  extent[i] = mpz_get_si (result->shape[i]);
   7971  1.1  mrg 	  rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
   7972  1.1  mrg 	}
   7973  1.1  mrg 
   7974  1.1  mrg       offset = 0;
   7975  1.1  mrg       for (source_ctor = gfc_constructor_first (source->value.constructor);
   7976  1.1  mrg            source_ctor; source_ctor = gfc_constructor_next (source_ctor))
   7977  1.1  mrg 	{
   7978  1.1  mrg 	  for (i = 0; i < ncopies; ++i)
   7979  1.1  mrg 	    gfc_constructor_insert_expr (&result->value.constructor,
   7980  1.1  mrg 					 gfc_copy_expr (source_ctor->expr),
   7981  1.1  mrg 					 NULL, offset + i * rstride[dim]);
   7982  1.1  mrg 
   7983  1.1  mrg 	  offset += (dim == 0 ? ncopies : 1);
   7984  1.1  mrg 	}
   7985  1.1  mrg     }
   7986  1.1  mrg   else
   7987  1.1  mrg     {
   7988  1.1  mrg       gfc_error ("Simplification of SPREAD at %C not yet implemented");
   7989  1.1  mrg       return &gfc_bad_expr;
   7990  1.1  mrg     }
   7991  1.1  mrg 
   7992  1.1  mrg   if (source->ts.type == BT_CHARACTER)
   7993  1.1  mrg     result->ts.u.cl = source->ts.u.cl;
   7994  1.1  mrg 
   7995  1.1  mrg   return result;
   7996  1.1  mrg }
   7997  1.1  mrg 
   7998  1.1  mrg 
   7999  1.1  mrg gfc_expr *
   8000  1.1  mrg gfc_simplify_sqrt (gfc_expr *e)
   8001  1.1  mrg {
   8002  1.1  mrg   gfc_expr *result = NULL;
   8003  1.1  mrg 
   8004  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   8005  1.1  mrg     return NULL;
   8006  1.1  mrg 
   8007  1.1  mrg   switch (e->ts.type)
   8008  1.1  mrg     {
   8009  1.1  mrg       case BT_REAL:
   8010  1.1  mrg 	if (mpfr_cmp_si (e->value.real, 0) < 0)
   8011  1.1  mrg 	  {
   8012  1.1  mrg 	    gfc_error ("Argument of SQRT at %L has a negative value",
   8013  1.1  mrg 		       &e->where);
   8014  1.1  mrg 	    return &gfc_bad_expr;
   8015  1.1  mrg 	  }
   8016  1.1  mrg 	result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
   8017  1.1  mrg 	mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
   8018  1.1  mrg 	break;
   8019  1.1  mrg 
   8020  1.1  mrg       case BT_COMPLEX:
   8021  1.1  mrg 	gfc_set_model (e->value.real);
   8022  1.1  mrg 
   8023  1.1  mrg 	result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
   8024  1.1  mrg 	mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
   8025  1.1  mrg 	break;
   8026  1.1  mrg 
   8027  1.1  mrg       default:
   8028  1.1  mrg 	gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
   8029  1.1  mrg     }
   8030  1.1  mrg 
   8031  1.1  mrg   return range_check (result, "SQRT");
   8032  1.1  mrg }
   8033  1.1  mrg 
   8034  1.1  mrg 
   8035  1.1  mrg gfc_expr *
   8036  1.1  mrg gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
   8037  1.1  mrg {
   8038  1.1  mrg   return simplify_transformation (array, dim, mask, 0, gfc_add);
   8039  1.1  mrg }
   8040  1.1  mrg 
   8041  1.1  mrg 
   8042  1.1  mrg /* Simplify COTAN(X) where X has the unit of radian.  */
   8043  1.1  mrg 
   8044  1.1  mrg gfc_expr *
   8045  1.1  mrg gfc_simplify_cotan (gfc_expr *x)
   8046  1.1  mrg {
   8047  1.1  mrg   gfc_expr *result;
   8048  1.1  mrg   mpc_t swp, *val;
   8049  1.1  mrg 
   8050  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   8051  1.1  mrg     return NULL;
   8052  1.1  mrg 
   8053  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   8054  1.1  mrg 
   8055  1.1  mrg   switch (x->ts.type)
   8056  1.1  mrg     {
   8057  1.1  mrg     case BT_REAL:
   8058  1.1  mrg       mpfr_cot (result->value.real, x->value.real, GFC_RND_MODE);
   8059  1.1  mrg       break;
   8060  1.1  mrg 
   8061  1.1  mrg     case BT_COMPLEX:
   8062  1.1  mrg       /* There is no builtin mpc_cot, so compute cot = cos / sin.  */
   8063  1.1  mrg       val = &result->value.complex;
   8064  1.1  mrg       mpc_init2 (swp, mpfr_get_default_prec ());
   8065  1.1  mrg       mpc_sin_cos (*val, swp, x->value.complex, GFC_MPC_RND_MODE,
   8066  1.1  mrg 		   GFC_MPC_RND_MODE);
   8067  1.1  mrg       mpc_div (*val, swp, *val, GFC_MPC_RND_MODE);
   8068  1.1  mrg       mpc_clear (swp);
   8069  1.1  mrg       break;
   8070  1.1  mrg 
   8071  1.1  mrg     default:
   8072  1.1  mrg       gcc_unreachable ();
   8073  1.1  mrg     }
   8074  1.1  mrg 
   8075  1.1  mrg   return range_check (result, "COTAN");
   8076  1.1  mrg }
   8077  1.1  mrg 
   8078  1.1  mrg 
   8079  1.1  mrg gfc_expr *
   8080  1.1  mrg gfc_simplify_tan (gfc_expr *x)
   8081  1.1  mrg {
   8082  1.1  mrg   gfc_expr *result;
   8083  1.1  mrg 
   8084  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   8085  1.1  mrg     return NULL;
   8086  1.1  mrg 
   8087  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   8088  1.1  mrg 
   8089  1.1  mrg   switch (x->ts.type)
   8090  1.1  mrg     {
   8091  1.1  mrg       case BT_REAL:
   8092  1.1  mrg 	mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
   8093  1.1  mrg 	break;
   8094  1.1  mrg 
   8095  1.1  mrg       case BT_COMPLEX:
   8096  1.1  mrg 	mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   8097  1.1  mrg 	break;
   8098  1.1  mrg 
   8099  1.1  mrg       default:
   8100  1.1  mrg 	gcc_unreachable ();
   8101  1.1  mrg     }
   8102  1.1  mrg 
   8103  1.1  mrg   return range_check (result, "TAN");
   8104  1.1  mrg }
   8105  1.1  mrg 
   8106  1.1  mrg 
   8107  1.1  mrg gfc_expr *
   8108  1.1  mrg gfc_simplify_tanh (gfc_expr *x)
   8109  1.1  mrg {
   8110  1.1  mrg   gfc_expr *result;
   8111  1.1  mrg 
   8112  1.1  mrg   if (x->expr_type != EXPR_CONSTANT)
   8113  1.1  mrg     return NULL;
   8114  1.1  mrg 
   8115  1.1  mrg   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
   8116  1.1  mrg 
   8117  1.1  mrg   switch (x->ts.type)
   8118  1.1  mrg     {
   8119  1.1  mrg       case BT_REAL:
   8120  1.1  mrg 	mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
   8121  1.1  mrg 	break;
   8122  1.1  mrg 
   8123  1.1  mrg       case BT_COMPLEX:
   8124  1.1  mrg 	mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
   8125  1.1  mrg 	break;
   8126  1.1  mrg 
   8127  1.1  mrg       default:
   8128  1.1  mrg 	gcc_unreachable ();
   8129  1.1  mrg     }
   8130  1.1  mrg 
   8131  1.1  mrg   return range_check (result, "TANH");
   8132  1.1  mrg }
   8133  1.1  mrg 
   8134  1.1  mrg 
   8135  1.1  mrg gfc_expr *
   8136  1.1  mrg gfc_simplify_tiny (gfc_expr *e)
   8137  1.1  mrg {
   8138  1.1  mrg   gfc_expr *result;
   8139  1.1  mrg   int i;
   8140  1.1  mrg 
   8141  1.1  mrg   i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
   8142  1.1  mrg 
   8143  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
   8144  1.1  mrg   mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
   8145  1.1  mrg 
   8146  1.1  mrg   return result;
   8147  1.1  mrg }
   8148  1.1  mrg 
   8149  1.1  mrg 
   8150  1.1  mrg gfc_expr *
   8151  1.1  mrg gfc_simplify_trailz (gfc_expr *e)
   8152  1.1  mrg {
   8153  1.1  mrg   unsigned long tz, bs;
   8154  1.1  mrg   int i;
   8155  1.1  mrg 
   8156  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   8157  1.1  mrg     return NULL;
   8158  1.1  mrg 
   8159  1.1  mrg   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
   8160  1.1  mrg   bs = gfc_integer_kinds[i].bit_size;
   8161  1.1  mrg   tz = mpz_scan1 (e->value.integer, 0);
   8162  1.1  mrg 
   8163  1.1  mrg   return gfc_get_int_expr (gfc_default_integer_kind,
   8164  1.1  mrg 			   &e->where, MIN (tz, bs));
   8165  1.1  mrg }
   8166  1.1  mrg 
   8167  1.1  mrg 
   8168  1.1  mrg gfc_expr *
   8169  1.1  mrg gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
   8170  1.1  mrg {
   8171  1.1  mrg   gfc_expr *result;
   8172  1.1  mrg   gfc_expr *mold_element;
   8173  1.1  mrg   size_t source_size;
   8174  1.1  mrg   size_t result_size;
   8175  1.1  mrg   size_t buffer_size;
   8176  1.1  mrg   mpz_t tmp;
   8177  1.1  mrg   unsigned char *buffer;
   8178  1.1  mrg   size_t result_length;
   8179  1.1  mrg 
   8180  1.1  mrg   if (!gfc_is_constant_expr (source) || !gfc_is_constant_expr (size))
   8181  1.1  mrg     return NULL;
   8182  1.1  mrg 
   8183  1.1  mrg   if (!gfc_resolve_expr (mold))
   8184  1.1  mrg     return NULL;
   8185  1.1  mrg   if (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
   8186  1.1  mrg     return NULL;
   8187  1.1  mrg 
   8188  1.1  mrg   if (!gfc_calculate_transfer_sizes (source, mold, size, &source_size,
   8189  1.1  mrg 				     &result_size, &result_length))
   8190  1.1  mrg     return NULL;
   8191  1.1  mrg 
   8192  1.1  mrg   /* Calculate the size of the source.  */
   8193  1.1  mrg   if (source->expr_type == EXPR_ARRAY && !gfc_array_size (source, &tmp))
   8194  1.1  mrg     gfc_internal_error ("Failure getting length of a constant array.");
   8195  1.1  mrg 
   8196  1.1  mrg   /* Create an empty new expression with the appropriate characteristics.  */
   8197  1.1  mrg   result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
   8198  1.1  mrg 				  &source->where);
   8199  1.1  mrg   result->ts = mold->ts;
   8200  1.1  mrg 
   8201  1.1  mrg   mold_element = (mold->expr_type == EXPR_ARRAY && mold->value.constructor)
   8202  1.1  mrg 		 ? gfc_constructor_first (mold->value.constructor)->expr
   8203  1.1  mrg 		 : mold;
   8204  1.1  mrg 
   8205  1.1  mrg   /* Set result character length, if needed.  Note that this needs to be
   8206  1.1  mrg      set even for array expressions, in order to pass this information into
   8207  1.1  mrg      gfc_target_interpret_expr.  */
   8208  1.1  mrg   if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
   8209  1.1  mrg     {
   8210  1.1  mrg       result->value.character.length = mold_element->value.character.length;
   8211  1.1  mrg 
   8212  1.1  mrg       /* Let the typespec of the result inherit the string length.
   8213  1.1  mrg 	 This is crucial if a resulting array has size zero.  */
   8214  1.1  mrg       if (mold_element->ts.u.cl->length)
   8215  1.1  mrg 	result->ts.u.cl->length = gfc_copy_expr (mold_element->ts.u.cl->length);
   8216  1.1  mrg       else
   8217  1.1  mrg 	result->ts.u.cl->length =
   8218  1.1  mrg 	  gfc_get_int_expr (gfc_charlen_int_kind, NULL,
   8219  1.1  mrg 			    mold_element->value.character.length);
   8220  1.1  mrg     }
   8221  1.1  mrg 
   8222  1.1  mrg   /* Set the number of elements in the result, and determine its size.  */
   8223  1.1  mrg 
   8224  1.1  mrg   if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
   8225  1.1  mrg     {
   8226  1.1  mrg       result->expr_type = EXPR_ARRAY;
   8227  1.1  mrg       result->rank = 1;
   8228  1.1  mrg       result->shape = gfc_get_shape (1);
   8229  1.1  mrg       mpz_init_set_ui (result->shape[0], result_length);
   8230  1.1  mrg     }
   8231  1.1  mrg   else
   8232  1.1  mrg     result->rank = 0;
   8233  1.1  mrg 
   8234  1.1  mrg   /* Allocate the buffer to store the binary version of the source.  */
   8235  1.1  mrg   buffer_size = MAX (source_size, result_size);
   8236  1.1  mrg   buffer = (unsigned char*)alloca (buffer_size);
   8237  1.1  mrg   memset (buffer, 0, buffer_size);
   8238  1.1  mrg 
   8239  1.1  mrg   /* Now write source to the buffer.  */
   8240  1.1  mrg   gfc_target_encode_expr (source, buffer, buffer_size);
   8241  1.1  mrg 
   8242  1.1  mrg   /* And read the buffer back into the new expression.  */
   8243  1.1  mrg   gfc_target_interpret_expr (buffer, buffer_size, result, false);
   8244  1.1  mrg 
   8245  1.1  mrg   return result;
   8246  1.1  mrg }
   8247  1.1  mrg 
   8248  1.1  mrg 
   8249  1.1  mrg gfc_expr *
   8250  1.1  mrg gfc_simplify_transpose (gfc_expr *matrix)
   8251  1.1  mrg {
   8252  1.1  mrg   int row, matrix_rows, col, matrix_cols;
   8253  1.1  mrg   gfc_expr *result;
   8254  1.1  mrg 
   8255  1.1  mrg   if (!is_constant_array_expr (matrix))
   8256  1.1  mrg     return NULL;
   8257  1.1  mrg 
   8258  1.1  mrg   gcc_assert (matrix->rank == 2);
   8259  1.1  mrg 
   8260  1.1  mrg   if (matrix->shape == NULL)
   8261  1.1  mrg     return NULL;
   8262  1.1  mrg 
   8263  1.1  mrg   result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
   8264  1.1  mrg 			       &matrix->where);
   8265  1.1  mrg   result->rank = 2;
   8266  1.1  mrg   result->shape = gfc_get_shape (result->rank);
   8267  1.1  mrg   mpz_init_set (result->shape[0], matrix->shape[1]);
   8268  1.1  mrg   mpz_init_set (result->shape[1], matrix->shape[0]);
   8269  1.1  mrg 
   8270  1.1  mrg   if (matrix->ts.type == BT_CHARACTER)
   8271  1.1  mrg     result->ts.u.cl = matrix->ts.u.cl;
   8272  1.1  mrg   else if (matrix->ts.type == BT_DERIVED)
   8273  1.1  mrg     result->ts.u.derived = matrix->ts.u.derived;
   8274  1.1  mrg 
   8275  1.1  mrg   matrix_rows = mpz_get_si (matrix->shape[0]);
   8276  1.1  mrg   matrix_cols = mpz_get_si (matrix->shape[1]);
   8277  1.1  mrg   for (row = 0; row < matrix_rows; ++row)
   8278  1.1  mrg     for (col = 0; col < matrix_cols; ++col)
   8279  1.1  mrg       {
   8280  1.1  mrg 	gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
   8281  1.1  mrg 						   col * matrix_rows + row);
   8282  1.1  mrg 	gfc_constructor_insert_expr (&result->value.constructor,
   8283  1.1  mrg 				     gfc_copy_expr (e), &matrix->where,
   8284  1.1  mrg 				     row * matrix_cols + col);
   8285  1.1  mrg       }
   8286  1.1  mrg 
   8287  1.1  mrg   return result;
   8288  1.1  mrg }
   8289  1.1  mrg 
   8290  1.1  mrg 
   8291  1.1  mrg gfc_expr *
   8292  1.1  mrg gfc_simplify_trim (gfc_expr *e)
   8293  1.1  mrg {
   8294  1.1  mrg   gfc_expr *result;
   8295  1.1  mrg   int count, i, len, lentrim;
   8296  1.1  mrg 
   8297  1.1  mrg   if (e->expr_type != EXPR_CONSTANT)
   8298  1.1  mrg     return NULL;
   8299  1.1  mrg 
   8300  1.1  mrg   len = e->value.character.length;
   8301  1.1  mrg   for (count = 0, i = 1; i <= len; ++i)
   8302  1.1  mrg     {
   8303  1.1  mrg       if (e->value.character.string[len - i] == ' ')
   8304  1.1  mrg 	count++;
   8305  1.1  mrg       else
   8306  1.1  mrg 	break;
   8307  1.1  mrg     }
   8308  1.1  mrg 
   8309  1.1  mrg   lentrim = len - count;
   8310  1.1  mrg 
   8311  1.1  mrg   result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
   8312  1.1  mrg   for (i = 0; i < lentrim; i++)
   8313  1.1  mrg     result->value.character.string[i] = e->value.character.string[i];
   8314  1.1  mrg 
   8315  1.1  mrg   return result;
   8316  1.1  mrg }
   8317  1.1  mrg 
   8318  1.1  mrg 
   8319  1.1  mrg gfc_expr *
   8320  1.1  mrg gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
   8321  1.1  mrg {
   8322  1.1  mrg   gfc_expr *result;
   8323  1.1  mrg   gfc_ref *ref;
   8324  1.1  mrg   gfc_array_spec *as;
   8325  1.1  mrg   gfc_constructor *sub_cons;
   8326  1.1  mrg   bool first_image;
   8327  1.1  mrg   int d;
   8328  1.1  mrg 
   8329  1.1  mrg   if (!is_constant_array_expr (sub))
   8330  1.1  mrg     return NULL;
   8331  1.1  mrg 
   8332  1.1  mrg   /* Follow any component references.  */
   8333  1.1  mrg   as = coarray->symtree->n.sym->as;
   8334  1.1  mrg   for (ref = coarray->ref; ref; ref = ref->next)
   8335  1.1  mrg     if (ref->type == REF_COMPONENT)
   8336  1.1  mrg       as = ref->u.ar.as;
   8337  1.1  mrg 
   8338  1.1  mrg   if (as->type == AS_DEFERRED)
   8339  1.1  mrg     return NULL;
   8340  1.1  mrg 
   8341  1.1  mrg   /* "valid sequence of cosubscripts" are required; thus, return 0 unless
   8342  1.1  mrg      the cosubscript addresses the first image.  */
   8343  1.1  mrg 
   8344  1.1  mrg   sub_cons = gfc_constructor_first (sub->value.constructor);
   8345  1.1  mrg   first_image = true;
   8346  1.1  mrg 
   8347  1.1  mrg   for (d = 1; d <= as->corank; d++)
   8348  1.1  mrg     {
   8349  1.1  mrg       gfc_expr *ca_bound;
   8350  1.1  mrg       int cmp;
   8351  1.1  mrg 
   8352  1.1  mrg       gcc_assert (sub_cons != NULL);
   8353  1.1  mrg 
   8354  1.1  mrg       ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
   8355  1.1  mrg 				     NULL, true);
   8356  1.1  mrg       if (ca_bound == NULL)
   8357  1.1  mrg 	return NULL;
   8358  1.1  mrg 
   8359  1.1  mrg       if (ca_bound == &gfc_bad_expr)
   8360  1.1  mrg 	return ca_bound;
   8361  1.1  mrg 
   8362  1.1  mrg       cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
   8363  1.1  mrg 
   8364  1.1  mrg       if (cmp == 0)
   8365  1.1  mrg 	{
   8366  1.1  mrg           gfc_free_expr (ca_bound);
   8367  1.1  mrg 	  sub_cons = gfc_constructor_next (sub_cons);
   8368  1.1  mrg 	  continue;
   8369  1.1  mrg 	}
   8370  1.1  mrg 
   8371  1.1  mrg       first_image = false;
   8372  1.1  mrg 
   8373  1.1  mrg       if (cmp > 0)
   8374  1.1  mrg 	{
   8375  1.1  mrg 	  gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
   8376  1.1  mrg 		     "SUB has %ld and COARRAY lower bound is %ld)",
   8377  1.1  mrg 		     &coarray->where, d,
   8378  1.1  mrg 		     mpz_get_si (sub_cons->expr->value.integer),
   8379  1.1  mrg 		     mpz_get_si (ca_bound->value.integer));
   8380  1.1  mrg 	  gfc_free_expr (ca_bound);
   8381  1.1  mrg 	  return &gfc_bad_expr;
   8382  1.1  mrg 	}
   8383  1.1  mrg 
   8384  1.1  mrg       gfc_free_expr (ca_bound);
   8385  1.1  mrg 
   8386  1.1  mrg       /* Check whether upperbound is valid for the multi-images case.  */
   8387  1.1  mrg       if (d < as->corank)
   8388  1.1  mrg 	{
   8389  1.1  mrg 	  ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
   8390  1.1  mrg 					 NULL, true);
   8391  1.1  mrg 	  if (ca_bound == &gfc_bad_expr)
   8392  1.1  mrg 	    return ca_bound;
   8393  1.1  mrg 
   8394  1.1  mrg 	  if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
   8395  1.1  mrg 	      && mpz_cmp (ca_bound->value.integer,
   8396  1.1  mrg 			  sub_cons->expr->value.integer) < 0)
   8397  1.1  mrg 	  {
   8398  1.1  mrg 	    gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
   8399  1.1  mrg 		       "SUB has %ld and COARRAY upper bound is %ld)",
   8400  1.1  mrg 		       &coarray->where, d,
   8401  1.1  mrg 		       mpz_get_si (sub_cons->expr->value.integer),
   8402  1.1  mrg 		       mpz_get_si (ca_bound->value.integer));
   8403  1.1  mrg 	    gfc_free_expr (ca_bound);
   8404  1.1  mrg 	    return &gfc_bad_expr;
   8405  1.1  mrg 	  }
   8406  1.1  mrg 
   8407  1.1  mrg 	  if (ca_bound)
   8408  1.1  mrg 	    gfc_free_expr (ca_bound);
   8409  1.1  mrg 	}
   8410  1.1  mrg 
   8411  1.1  mrg       sub_cons = gfc_constructor_next (sub_cons);
   8412  1.1  mrg     }
   8413  1.1  mrg 
   8414  1.1  mrg   gcc_assert (sub_cons == NULL);
   8415  1.1  mrg 
   8416  1.1  mrg   if (flag_coarray != GFC_FCOARRAY_SINGLE && !first_image)
   8417  1.1  mrg     return NULL;
   8418  1.1  mrg 
   8419  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
   8420  1.1  mrg 				  &gfc_current_locus);
   8421  1.1  mrg   if (first_image)
   8422  1.1  mrg     mpz_set_si (result->value.integer, 1);
   8423  1.1  mrg   else
   8424  1.1  mrg     mpz_set_si (result->value.integer, 0);
   8425  1.1  mrg 
   8426  1.1  mrg   return result;
   8427  1.1  mrg }
   8428  1.1  mrg 
   8429  1.1  mrg gfc_expr *
   8430  1.1  mrg gfc_simplify_image_status (gfc_expr *image, gfc_expr *team ATTRIBUTE_UNUSED)
   8431  1.1  mrg {
   8432  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_NONE)
   8433  1.1  mrg     {
   8434  1.1  mrg       gfc_current_locus = *gfc_current_intrinsic_where;
   8435  1.1  mrg       gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
   8436  1.1  mrg       return &gfc_bad_expr;
   8437  1.1  mrg     }
   8438  1.1  mrg 
   8439  1.1  mrg   /* Simplification is possible for fcoarray = single only.  For all other modes
   8440  1.1  mrg      the result depends on runtime conditions.  */
   8441  1.1  mrg   if (flag_coarray != GFC_FCOARRAY_SINGLE)
   8442  1.1  mrg     return NULL;
   8443  1.1  mrg 
   8444  1.1  mrg   if (gfc_is_constant_expr (image))
   8445  1.1  mrg     {
   8446  1.1  mrg       gfc_expr *result;
   8447  1.1  mrg       result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
   8448  1.1  mrg 				      &image->where);
   8449  1.1  mrg       if (mpz_get_si (image->value.integer) == 1)
   8450  1.1  mrg 	mpz_set_si (result->value.integer, 0);
   8451  1.1  mrg       else
   8452  1.1  mrg 	mpz_set_si (result->value.integer, GFC_STAT_STOPPED_IMAGE);
   8453  1.1  mrg       return result;
   8454  1.1  mrg     }
   8455  1.1  mrg   else
   8456  1.1  mrg     return NULL;
   8457  1.1  mrg }
   8458  1.1  mrg 
   8459  1.1  mrg 
   8460  1.1  mrg gfc_expr *
   8461  1.1  mrg gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim,
   8462  1.1  mrg 			 gfc_expr *distance ATTRIBUTE_UNUSED)
   8463  1.1  mrg {
   8464  1.1  mrg   if (flag_coarray != GFC_FCOARRAY_SINGLE)
   8465  1.1  mrg     return NULL;
   8466  1.1  mrg 
   8467  1.1  mrg   /* If no coarray argument has been passed or when the first argument
   8468  1.1  mrg      is actually a distance argument.  */
   8469  1.1  mrg   if (coarray == NULL || !gfc_is_coarray (coarray))
   8470  1.1  mrg     {
   8471  1.1  mrg       gfc_expr *result;
   8472  1.1  mrg       /* FIXME: gfc_current_locus is wrong.  */
   8473  1.1  mrg       result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
   8474  1.1  mrg 				      &gfc_current_locus);
   8475  1.1  mrg       mpz_set_si (result->value.integer, 1);
   8476  1.1  mrg       return result;
   8477  1.1  mrg     }
   8478  1.1  mrg 
   8479  1.1  mrg   /* For -fcoarray=single, this_image(A) is the same as lcobound(A).  */
   8480  1.1  mrg   return simplify_cobound (coarray, dim, NULL, 0);
   8481  1.1  mrg }
   8482  1.1  mrg 
   8483  1.1  mrg 
   8484  1.1  mrg gfc_expr *
   8485  1.1  mrg gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
   8486  1.1  mrg {
   8487  1.1  mrg   return simplify_bound (array, dim, kind, 1);
   8488  1.1  mrg }
   8489  1.1  mrg 
   8490  1.1  mrg gfc_expr *
   8491  1.1  mrg gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
   8492  1.1  mrg {
   8493  1.1  mrg   return simplify_cobound (array, dim, kind, 1);
   8494  1.1  mrg }
   8495  1.1  mrg 
   8496  1.1  mrg 
   8497  1.1  mrg gfc_expr *
   8498  1.1  mrg gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
   8499  1.1  mrg {
   8500  1.1  mrg   gfc_expr *result, *e;
   8501  1.1  mrg   gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
   8502  1.1  mrg 
   8503  1.1  mrg   if (!is_constant_array_expr (vector)
   8504  1.1  mrg       || !is_constant_array_expr (mask)
   8505  1.1  mrg       || (!gfc_is_constant_expr (field)
   8506  1.1  mrg 	  && !is_constant_array_expr (field)))
   8507  1.1  mrg     return NULL;
   8508  1.1  mrg 
   8509  1.1  mrg   result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
   8510  1.1  mrg 			       &vector->where);
   8511  1.1  mrg   if (vector->ts.type == BT_DERIVED)
   8512  1.1  mrg     result->ts.u.derived = vector->ts.u.derived;
   8513  1.1  mrg   result->rank = mask->rank;
   8514  1.1  mrg   result->shape = gfc_copy_shape (mask->shape, mask->rank);
   8515  1.1  mrg 
   8516  1.1  mrg   if (vector->ts.type == BT_CHARACTER)
   8517  1.1  mrg     result->ts.u.cl = vector->ts.u.cl;
   8518  1.1  mrg 
   8519  1.1  mrg   vector_ctor = gfc_constructor_first (vector->value.constructor);
   8520  1.1  mrg   mask_ctor = gfc_constructor_first (mask->value.constructor);
   8521  1.1  mrg   field_ctor
   8522  1.1  mrg     = field->expr_type == EXPR_ARRAY
   8523  1.1  mrg 			    ? gfc_constructor_first (field->value.constructor)
   8524  1.1  mrg 			    : NULL;
   8525  1.1  mrg 
   8526  1.1  mrg   while (mask_ctor)
   8527  1.1  mrg     {
   8528  1.1  mrg       if (mask_ctor->expr->value.logical)
   8529  1.1  mrg 	{
   8530  1.1  mrg 	  if (vector_ctor)
   8531  1.1  mrg 	    {
   8532  1.1  mrg 	      e = gfc_copy_expr (vector_ctor->expr);
   8533  1.1  mrg 	      vector_ctor = gfc_constructor_next (vector_ctor);
   8534  1.1  mrg 	    }
   8535  1.1  mrg 	  else
   8536  1.1  mrg 	    {
   8537  1.1  mrg 	      gfc_free_expr (result);
   8538  1.1  mrg 	      return NULL;
   8539  1.1  mrg 	    }
   8540  1.1  mrg 	}
   8541  1.1  mrg       else if (field->expr_type == EXPR_ARRAY)
   8542  1.1  mrg 	e = gfc_copy_expr (field_ctor->expr);
   8543  1.1  mrg       else
   8544  1.1  mrg 	e = gfc_copy_expr (field);
   8545  1.1  mrg 
   8546  1.1  mrg       gfc_constructor_append_expr (&result->value.constructor, e, NULL);
   8547  1.1  mrg 
   8548  1.1  mrg       mask_ctor = gfc_constructor_next (mask_ctor);
   8549  1.1  mrg       field_ctor = gfc_constructor_next (field_ctor);
   8550  1.1  mrg     }
   8551  1.1  mrg 
   8552  1.1  mrg   return result;
   8553  1.1  mrg }
   8554  1.1  mrg 
   8555  1.1  mrg 
   8556  1.1  mrg gfc_expr *
   8557  1.1  mrg gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
   8558  1.1  mrg {
   8559  1.1  mrg   gfc_expr *result;
   8560  1.1  mrg   int back;
   8561  1.1  mrg   size_t index, len, lenset;
   8562  1.1  mrg   size_t i;
   8563  1.1  mrg   int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
   8564  1.1  mrg 
   8565  1.1  mrg   if (k == -1)
   8566  1.1  mrg     return &gfc_bad_expr;
   8567  1.1  mrg 
   8568  1.1  mrg   if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT
   8569  1.1  mrg       || ( b != NULL && b->expr_type !=  EXPR_CONSTANT))
   8570  1.1  mrg     return NULL;
   8571  1.1  mrg 
   8572  1.1  mrg   if (b != NULL && b->value.logical != 0)
   8573  1.1  mrg     back = 1;
   8574  1.1  mrg   else
   8575  1.1  mrg     back = 0;
   8576  1.1  mrg 
   8577  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
   8578  1.1  mrg 
   8579  1.1  mrg   len = s->value.character.length;
   8580  1.1  mrg   lenset = set->value.character.length;
   8581  1.1  mrg 
   8582  1.1  mrg   if (len == 0)
   8583  1.1  mrg     {
   8584  1.1  mrg       mpz_set_ui (result->value.integer, 0);
   8585  1.1  mrg       return result;
   8586  1.1  mrg     }
   8587  1.1  mrg 
   8588  1.1  mrg   if (back == 0)
   8589  1.1  mrg     {
   8590  1.1  mrg       if (lenset == 0)
   8591  1.1  mrg 	{
   8592  1.1  mrg 	  mpz_set_ui (result->value.integer, 1);
   8593  1.1  mrg 	  return result;
   8594  1.1  mrg 	}
   8595  1.1  mrg 
   8596  1.1  mrg       index = wide_strspn (s->value.character.string,
   8597  1.1  mrg 			   set->value.character.string) + 1;
   8598  1.1  mrg       if (index > len)
   8599  1.1  mrg 	index = 0;
   8600  1.1  mrg 
   8601  1.1  mrg     }
   8602  1.1  mrg   else
   8603  1.1  mrg     {
   8604  1.1  mrg       if (lenset == 0)
   8605  1.1  mrg 	{
   8606  1.1  mrg 	  mpz_set_ui (result->value.integer, len);
   8607  1.1  mrg 	  return result;
   8608  1.1  mrg 	}
   8609  1.1  mrg       for (index = len; index > 0; index --)
   8610  1.1  mrg 	{
   8611  1.1  mrg 	  for (i = 0; i < lenset; i++)
   8612  1.1  mrg 	    {
   8613  1.1  mrg 	      if (s->value.character.string[index - 1]
   8614  1.1  mrg 		  == set->value.character.string[i])
   8615  1.1  mrg 		break;
   8616  1.1  mrg 	    }
   8617  1.1  mrg 	  if (i == lenset)
   8618  1.1  mrg 	    break;
   8619  1.1  mrg 	}
   8620  1.1  mrg     }
   8621  1.1  mrg 
   8622  1.1  mrg   mpz_set_ui (result->value.integer, index);
   8623  1.1  mrg   return result;
   8624  1.1  mrg }
   8625  1.1  mrg 
   8626  1.1  mrg 
   8627  1.1  mrg gfc_expr *
   8628  1.1  mrg gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
   8629  1.1  mrg {
   8630  1.1  mrg   gfc_expr *result;
   8631  1.1  mrg   int kind;
   8632  1.1  mrg 
   8633  1.1  mrg   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
   8634  1.1  mrg     return NULL;
   8635  1.1  mrg 
   8636  1.1  mrg   kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
   8637  1.1  mrg 
   8638  1.1  mrg   switch (x->ts.type)
   8639  1.1  mrg     {
   8640  1.1  mrg       case BT_INTEGER:
   8641  1.1  mrg 	result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
   8642  1.1  mrg 	mpz_xor (result->value.integer, x->value.integer, y->value.integer);
   8643  1.1  mrg 	return range_check (result, "XOR");
   8644  1.1  mrg 
   8645  1.1  mrg       case BT_LOGICAL:
   8646  1.1  mrg 	return gfc_get_logical_expr (kind, &x->where,
   8647  1.1  mrg 				     (x->value.logical && !y->value.logical)
   8648  1.1  mrg 				     || (!x->value.logical && y->value.logical));
   8649  1.1  mrg 
   8650  1.1  mrg       default:
   8651  1.1  mrg 	gcc_unreachable ();
   8652  1.1  mrg     }
   8653  1.1  mrg }
   8654  1.1  mrg 
   8655  1.1  mrg 
   8656  1.1  mrg /****************** Constant simplification *****************/
   8657  1.1  mrg 
   8658  1.1  mrg /* Master function to convert one constant to another.  While this is
   8659  1.1  mrg    used as a simplification function, it requires the destination type
   8660  1.1  mrg    and kind information which is supplied by a special case in
   8661  1.1  mrg    do_simplify().  */
   8662  1.1  mrg 
   8663  1.1  mrg gfc_expr *
   8664  1.1  mrg gfc_convert_constant (gfc_expr *e, bt type, int kind)
   8665  1.1  mrg {
   8666  1.1  mrg   gfc_expr *result, *(*f) (gfc_expr *, int);
   8667  1.1  mrg   gfc_constructor *c, *t;
   8668  1.1  mrg 
   8669  1.1  mrg   switch (e->ts.type)
   8670  1.1  mrg     {
   8671  1.1  mrg     case BT_INTEGER:
   8672  1.1  mrg       switch (type)
   8673  1.1  mrg 	{
   8674  1.1  mrg 	case BT_INTEGER:
   8675  1.1  mrg 	  f = gfc_int2int;
   8676  1.1  mrg 	  break;
   8677  1.1  mrg 	case BT_REAL:
   8678  1.1  mrg 	  f = gfc_int2real;
   8679  1.1  mrg 	  break;
   8680  1.1  mrg 	case BT_COMPLEX:
   8681  1.1  mrg 	  f = gfc_int2complex;
   8682  1.1  mrg 	  break;
   8683  1.1  mrg 	case BT_LOGICAL:
   8684  1.1  mrg 	  f = gfc_int2log;
   8685  1.1  mrg 	  break;
   8686  1.1  mrg 	default:
   8687  1.1  mrg 	  goto oops;
   8688  1.1  mrg 	}
   8689  1.1  mrg       break;
   8690  1.1  mrg 
   8691  1.1  mrg     case BT_REAL:
   8692  1.1  mrg       switch (type)
   8693  1.1  mrg 	{
   8694  1.1  mrg 	case BT_INTEGER:
   8695  1.1  mrg 	  f = gfc_real2int;
   8696  1.1  mrg 	  break;
   8697  1.1  mrg 	case BT_REAL:
   8698  1.1  mrg 	  f = gfc_real2real;
   8699  1.1  mrg 	  break;
   8700  1.1  mrg 	case BT_COMPLEX:
   8701  1.1  mrg 	  f = gfc_real2complex;
   8702  1.1  mrg 	  break;
   8703  1.1  mrg 	default:
   8704  1.1  mrg 	  goto oops;
   8705  1.1  mrg 	}
   8706  1.1  mrg       break;
   8707  1.1  mrg 
   8708  1.1  mrg     case BT_COMPLEX:
   8709  1.1  mrg       switch (type)
   8710  1.1  mrg 	{
   8711  1.1  mrg 	case BT_INTEGER:
   8712  1.1  mrg 	  f = gfc_complex2int;
   8713  1.1  mrg 	  break;
   8714  1.1  mrg 	case BT_REAL:
   8715  1.1  mrg 	  f = gfc_complex2real;
   8716  1.1  mrg 	  break;
   8717  1.1  mrg 	case BT_COMPLEX:
   8718  1.1  mrg 	  f = gfc_complex2complex;
   8719  1.1  mrg 	  break;
   8720  1.1  mrg 
   8721  1.1  mrg 	default:
   8722  1.1  mrg 	  goto oops;
   8723  1.1  mrg 	}
   8724  1.1  mrg       break;
   8725  1.1  mrg 
   8726  1.1  mrg     case BT_LOGICAL:
   8727  1.1  mrg       switch (type)
   8728  1.1  mrg 	{
   8729  1.1  mrg 	case BT_INTEGER:
   8730  1.1  mrg 	  f = gfc_log2int;
   8731  1.1  mrg 	  break;
   8732  1.1  mrg 	case BT_LOGICAL:
   8733  1.1  mrg 	  f = gfc_log2log;
   8734  1.1  mrg 	  break;
   8735  1.1  mrg 	default:
   8736  1.1  mrg 	  goto oops;
   8737  1.1  mrg 	}
   8738  1.1  mrg       break;
   8739  1.1  mrg 
   8740  1.1  mrg     case BT_HOLLERITH:
   8741  1.1  mrg       switch (type)
   8742  1.1  mrg 	{
   8743  1.1  mrg 	case BT_INTEGER:
   8744  1.1  mrg 	  f = gfc_hollerith2int;
   8745  1.1  mrg 	  break;
   8746  1.1  mrg 
   8747  1.1  mrg 	case BT_REAL:
   8748  1.1  mrg 	  f = gfc_hollerith2real;
   8749  1.1  mrg 	  break;
   8750  1.1  mrg 
   8751  1.1  mrg 	case BT_COMPLEX:
   8752  1.1  mrg 	  f = gfc_hollerith2complex;
   8753  1.1  mrg 	  break;
   8754  1.1  mrg 
   8755  1.1  mrg 	case BT_CHARACTER:
   8756  1.1  mrg 	  f = gfc_hollerith2character;
   8757  1.1  mrg 	  break;
   8758  1.1  mrg 
   8759  1.1  mrg 	case BT_LOGICAL:
   8760  1.1  mrg 	  f = gfc_hollerith2logical;
   8761  1.1  mrg 	  break;
   8762  1.1  mrg 
   8763  1.1  mrg 	default:
   8764  1.1  mrg 	  goto oops;
   8765  1.1  mrg 	}
   8766  1.1  mrg       break;
   8767  1.1  mrg 
   8768  1.1  mrg     case BT_CHARACTER:
   8769  1.1  mrg       switch (type)
   8770  1.1  mrg 	{
   8771  1.1  mrg 	case BT_INTEGER:
   8772  1.1  mrg 	  f = gfc_character2int;
   8773  1.1  mrg 	  break;
   8774  1.1  mrg 
   8775  1.1  mrg 	case BT_REAL:
   8776  1.1  mrg 	  f = gfc_character2real;
   8777  1.1  mrg 	  break;
   8778  1.1  mrg 
   8779  1.1  mrg 	case BT_COMPLEX:
   8780  1.1  mrg 	  f = gfc_character2complex;
   8781  1.1  mrg 	  break;
   8782  1.1  mrg 
   8783  1.1  mrg 	case BT_CHARACTER:
   8784  1.1  mrg 	  f = gfc_character2character;
   8785  1.1  mrg 	  break;
   8786  1.1  mrg 
   8787  1.1  mrg 	case BT_LOGICAL:
   8788  1.1  mrg 	  f = gfc_character2logical;
   8789  1.1  mrg 	  break;
   8790  1.1  mrg 
   8791  1.1  mrg 	default:
   8792  1.1  mrg 	  goto oops;
   8793  1.1  mrg 	}
   8794  1.1  mrg       break;
   8795  1.1  mrg 
   8796  1.1  mrg     default:
   8797  1.1  mrg     oops:
   8798  1.1  mrg       return &gfc_bad_expr;
   8799  1.1  mrg     }
   8800  1.1  mrg 
   8801  1.1  mrg   result = NULL;
   8802  1.1  mrg 
   8803  1.1  mrg   switch (e->expr_type)
   8804  1.1  mrg     {
   8805  1.1  mrg     case EXPR_CONSTANT:
   8806  1.1  mrg       result = f (e, kind);
   8807  1.1  mrg       if (result == NULL)
   8808  1.1  mrg 	return &gfc_bad_expr;
   8809  1.1  mrg       break;
   8810  1.1  mrg 
   8811  1.1  mrg     case EXPR_ARRAY:
   8812  1.1  mrg       if (!gfc_is_constant_expr (e))
   8813  1.1  mrg 	break;
   8814  1.1  mrg 
   8815  1.1  mrg       result = gfc_get_array_expr (type, kind, &e->where);
   8816  1.1  mrg       result->shape = gfc_copy_shape (e->shape, e->rank);
   8817  1.1  mrg       result->rank = e->rank;
   8818  1.1  mrg 
   8819  1.1  mrg       for (c = gfc_constructor_first (e->value.constructor);
   8820  1.1  mrg 	   c; c = gfc_constructor_next (c))
   8821  1.1  mrg 	{
   8822  1.1  mrg 	  gfc_expr *tmp;
   8823  1.1  mrg 	  if (c->iterator == NULL)
   8824  1.1  mrg 	    {
   8825  1.1  mrg 	      if (c->expr->expr_type == EXPR_ARRAY)
   8826  1.1  mrg 		tmp = gfc_convert_constant (c->expr, type, kind);
   8827  1.1  mrg 	      else if (c->expr->expr_type == EXPR_OP)
   8828  1.1  mrg 		{
   8829  1.1  mrg 		  if (!gfc_simplify_expr (c->expr, 1))
   8830  1.1  mrg 		    return &gfc_bad_expr;
   8831  1.1  mrg 		  tmp = f (c->expr, kind);
   8832  1.1  mrg 		}
   8833  1.1  mrg 	      else
   8834  1.1  mrg 		tmp = f (c->expr, kind);
   8835  1.1  mrg 	    }
   8836  1.1  mrg 	  else
   8837  1.1  mrg 	    tmp = gfc_convert_constant (c->expr, type, kind);
   8838  1.1  mrg 
   8839  1.1  mrg 	  if (tmp == NULL || tmp == &gfc_bad_expr)
   8840  1.1  mrg 	    {
   8841  1.1  mrg 	      gfc_free_expr (result);
   8842  1.1  mrg 	      return NULL;
   8843  1.1  mrg 	    }
   8844  1.1  mrg 
   8845  1.1  mrg 	  t = gfc_constructor_append_expr (&result->value.constructor,
   8846  1.1  mrg 					   tmp, &c->where);
   8847  1.1  mrg 	  if (c->iterator)
   8848  1.1  mrg 	    t->iterator = gfc_copy_iterator (c->iterator);
   8849  1.1  mrg 	}
   8850  1.1  mrg 
   8851  1.1  mrg       break;
   8852  1.1  mrg 
   8853  1.1  mrg     default:
   8854  1.1  mrg       break;
   8855  1.1  mrg     }
   8856  1.1  mrg 
   8857  1.1  mrg   return result;
   8858  1.1  mrg }
   8859  1.1  mrg 
   8860  1.1  mrg 
   8861  1.1  mrg /* Function for converting character constants.  */
   8862  1.1  mrg gfc_expr *
   8863  1.1  mrg gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
   8864  1.1  mrg {
   8865  1.1  mrg   gfc_expr *result;
   8866  1.1  mrg   int i;
   8867  1.1  mrg 
   8868  1.1  mrg   if (!gfc_is_constant_expr (e))
   8869  1.1  mrg     return NULL;
   8870  1.1  mrg 
   8871  1.1  mrg   if (e->expr_type == EXPR_CONSTANT)
   8872  1.1  mrg     {
   8873  1.1  mrg       /* Simple case of a scalar.  */
   8874  1.1  mrg       result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
   8875  1.1  mrg       if (result == NULL)
   8876  1.1  mrg 	return &gfc_bad_expr;
   8877  1.1  mrg 
   8878  1.1  mrg       result->value.character.length = e->value.character.length;
   8879  1.1  mrg       result->value.character.string
   8880  1.1  mrg 	= gfc_get_wide_string (e->value.character.length + 1);
   8881  1.1  mrg       memcpy (result->value.character.string, e->value.character.string,
   8882  1.1  mrg 	      (e->value.character.length + 1) * sizeof (gfc_char_t));
   8883  1.1  mrg 
   8884  1.1  mrg       /* Check we only have values representable in the destination kind.  */
   8885  1.1  mrg       for (i = 0; i < result->value.character.length; i++)
   8886  1.1  mrg 	if (!gfc_check_character_range (result->value.character.string[i],
   8887  1.1  mrg 					kind))
   8888  1.1  mrg 	  {
   8889  1.1  mrg 	    gfc_error ("Character %qs in string at %L cannot be converted "
   8890  1.1  mrg 		       "into character kind %d",
   8891  1.1  mrg 		       gfc_print_wide_char (result->value.character.string[i]),
   8892  1.1  mrg 		       &e->where, kind);
   8893  1.1  mrg 	    gfc_free_expr (result);
   8894  1.1  mrg 	    return &gfc_bad_expr;
   8895  1.1  mrg 	  }
   8896  1.1  mrg 
   8897  1.1  mrg       return result;
   8898  1.1  mrg     }
   8899  1.1  mrg   else if (e->expr_type == EXPR_ARRAY)
   8900  1.1  mrg     {
   8901  1.1  mrg       /* For an array constructor, we convert each constructor element.  */
   8902  1.1  mrg       gfc_constructor *c;
   8903  1.1  mrg 
   8904  1.1  mrg       result = gfc_get_array_expr (type, kind, &e->where);
   8905  1.1  mrg       result->shape = gfc_copy_shape (e->shape, e->rank);
   8906  1.1  mrg       result->rank = e->rank;
   8907  1.1  mrg       result->ts.u.cl = e->ts.u.cl;
   8908  1.1  mrg 
   8909  1.1  mrg       for (c = gfc_constructor_first (e->value.constructor);
   8910  1.1  mrg 	   c; c = gfc_constructor_next (c))
   8911  1.1  mrg 	{
   8912  1.1  mrg 	  gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
   8913  1.1  mrg 	  if (tmp == &gfc_bad_expr)
   8914  1.1  mrg 	    {
   8915  1.1  mrg 	      gfc_free_expr (result);
   8916  1.1  mrg 	      return &gfc_bad_expr;
   8917  1.1  mrg 	    }
   8918  1.1  mrg 
   8919  1.1  mrg 	  if (tmp == NULL)
   8920  1.1  mrg 	    {
   8921  1.1  mrg 	      gfc_free_expr (result);
   8922  1.1  mrg 	      return NULL;
   8923  1.1  mrg 	    }
   8924  1.1  mrg 
   8925  1.1  mrg 	  gfc_constructor_append_expr (&result->value.constructor,
   8926  1.1  mrg 				       tmp, &c->where);
   8927  1.1  mrg 	}
   8928  1.1  mrg 
   8929  1.1  mrg       return result;
   8930  1.1  mrg     }
   8931  1.1  mrg   else
   8932  1.1  mrg     return NULL;
   8933  1.1  mrg }
   8934  1.1  mrg 
   8935  1.1  mrg 
   8936  1.1  mrg gfc_expr *
   8937  1.1  mrg gfc_simplify_compiler_options (void)
   8938  1.1  mrg {
   8939  1.1  mrg   char *str;
   8940  1.1  mrg   gfc_expr *result;
   8941  1.1  mrg 
   8942  1.1  mrg   str = gfc_get_option_string ();
   8943  1.1  mrg   result = gfc_get_character_expr (gfc_default_character_kind,
   8944  1.1  mrg 				   &gfc_current_locus, str, strlen (str));
   8945  1.1  mrg   free (str);
   8946  1.1  mrg   return result;
   8947  1.1  mrg }
   8948  1.1  mrg 
   8949  1.1  mrg 
   8950  1.1  mrg gfc_expr *
   8951  1.1  mrg gfc_simplify_compiler_version (void)
   8952  1.1  mrg {
   8953  1.1  mrg   char *buffer;
   8954  1.1  mrg   size_t len;
   8955  1.1  mrg 
   8956  1.1  mrg   len = strlen ("GCC version ") + strlen (version_string);
   8957  1.1  mrg   buffer = XALLOCAVEC (char, len + 1);
   8958  1.1  mrg   snprintf (buffer, len + 1, "GCC version %s", version_string);
   8959  1.1  mrg   return gfc_get_character_expr (gfc_default_character_kind,
   8960  1.1  mrg                                 &gfc_current_locus, buffer, len);
   8961  1.1  mrg }
   8962  1.1  mrg 
   8963  1.1  mrg /* Simplification routines for intrinsics of IEEE modules.  */
   8964  1.1  mrg 
   8965  1.1  mrg gfc_expr *
   8966  1.1  mrg simplify_ieee_selected_real_kind (gfc_expr *expr)
   8967  1.1  mrg {
   8968  1.1  mrg   gfc_actual_arglist *arg;
   8969  1.1  mrg   gfc_expr *p = NULL, *q = NULL, *rdx = NULL;
   8970  1.1  mrg 
   8971  1.1  mrg   arg = expr->value.function.actual;
   8972  1.1  mrg   p = arg->expr;
   8973  1.1  mrg   if (arg->next)
   8974  1.1  mrg     {
   8975  1.1  mrg       q = arg->next->expr;
   8976  1.1  mrg       if (arg->next->next)
   8977  1.1  mrg 	rdx = arg->next->next->expr;
   8978  1.1  mrg     }
   8979  1.1  mrg 
   8980  1.1  mrg   /* Currently, if IEEE is supported and this module is built, it means
   8981  1.1  mrg      all our floating-point types conform to IEEE. Hence, we simply handle
   8982  1.1  mrg      IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND.  */
   8983  1.1  mrg   return gfc_simplify_selected_real_kind (p, q, rdx);
   8984  1.1  mrg }
   8985  1.1  mrg 
   8986  1.1  mrg gfc_expr *
   8987  1.1  mrg simplify_ieee_support (gfc_expr *expr)
   8988  1.1  mrg {
   8989  1.1  mrg   /* We consider that if the IEEE modules are loaded, we have full support
   8990  1.1  mrg      for flags, halting and rounding, which are the three functions
   8991  1.1  mrg      (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
   8992  1.1  mrg      expressions. One day, we will need libgfortran to detect support and
   8993  1.1  mrg      communicate it back to us, allowing for partial support.  */
   8994  1.1  mrg 
   8995  1.1  mrg   return gfc_get_logical_expr (gfc_default_logical_kind, &expr->where,
   8996  1.1  mrg 			       true);
   8997  1.1  mrg }
   8998  1.1  mrg 
   8999  1.1  mrg bool
   9000  1.1  mrg matches_ieee_function_name (gfc_symbol *sym, const char *name)
   9001  1.1  mrg {
   9002  1.1  mrg   int n = strlen(name);
   9003  1.1  mrg 
   9004  1.1  mrg   if (!strncmp(sym->name, name, n))
   9005  1.1  mrg     return true;
   9006  1.1  mrg 
   9007  1.1  mrg   /* If a generic was used and renamed, we need more work to find out.
   9008  1.1  mrg      Compare the specific name.  */
   9009  1.1  mrg   if (sym->generic && !strncmp(sym->generic->sym->name, name, n))
   9010  1.1  mrg     return true;
   9011  1.1  mrg 
   9012  1.1  mrg   return false;
   9013  1.1  mrg }
   9014  1.1  mrg 
   9015  1.1  mrg gfc_expr *
   9016  1.1  mrg gfc_simplify_ieee_functions (gfc_expr *expr)
   9017  1.1  mrg {
   9018  1.1  mrg   gfc_symbol* sym = expr->symtree->n.sym;
   9019  1.1  mrg 
   9020  1.1  mrg   if (matches_ieee_function_name(sym, "ieee_selected_real_kind"))
   9021  1.1  mrg     return simplify_ieee_selected_real_kind (expr);
   9022  1.1  mrg   else if (matches_ieee_function_name(sym, "ieee_support_flag")
   9023  1.1  mrg 	   || matches_ieee_function_name(sym, "ieee_support_halting")
   9024  1.1  mrg 	   || matches_ieee_function_name(sym, "ieee_support_rounding"))
   9025  1.1  mrg     return simplify_ieee_support (expr);
   9026  1.1  mrg   else
   9027  1.1  mrg     return NULL;
   9028  1.1  mrg }
   9029