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