| 1 | /* Compiler arithmetic header. |
| 2 | Copyright (C) 2000-2026 Free Software Foundation, Inc. |
| 3 | Contributed by Steven Bosscher |
| 4 | |
| 5 | This file is part of GCC. |
| 6 | |
| 7 | GCC is free software; you can redistribute it and/or modify it under |
| 8 | the terms of the GNU General Public License as published by the Free |
| 9 | Software Foundation; either version 3, or (at your option) any later |
| 10 | version. |
| 11 | |
| 12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
| 13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 15 | for more details. |
| 16 | |
| 17 | You should have received a copy of the GNU General Public License |
| 18 | along with GCC; see the file COPYING3. If not see |
| 19 | <http://www.gnu.org/licenses/>. */ |
| 20 | |
| 21 | #ifndef GFC_ARITH_H |
| 22 | #define GFC_ARITH_H |
| 23 | |
| 24 | /* MPFR also does not have the conversion of a mpfr_t to a mpz_t, so declare |
| 25 | a function for this as well. */ |
| 26 | |
| 27 | void gfc_mpfr_to_mpz (mpz_t, mpfr_t, locus *); |
| 28 | void gfc_set_model_kind (int); |
| 29 | void gfc_set_model (mpfr_t); |
| 30 | |
| 31 | /* Make sure a gfc_expr expression is within its allowed range. Checks |
| 32 | for overflow and underflow. */ |
| 33 | arith gfc_range_check (gfc_expr *); |
| 34 | |
| 35 | int gfc_compare_expr (gfc_expr *, gfc_expr *, gfc_intrinsic_op); |
| 36 | int gfc_compare_string (gfc_expr *, gfc_expr *); |
| 37 | int gfc_compare_with_Cstring (gfc_expr *, const char *, bool); |
| 38 | |
| 39 | |
| 40 | /* Constant folding for gfc_expr trees. */ |
| 41 | gfc_expr *gfc_parentheses (gfc_expr * op); |
| 42 | gfc_expr *gfc_uplus (gfc_expr * op); |
| 43 | gfc_expr *gfc_uminus (gfc_expr * op); |
| 44 | gfc_expr *gfc_add (gfc_expr *, gfc_expr *); |
| 45 | gfc_expr *gfc_subtract (gfc_expr *, gfc_expr *); |
| 46 | gfc_expr *gfc_multiply (gfc_expr *, gfc_expr *); |
| 47 | gfc_expr *gfc_divide (gfc_expr *, gfc_expr *); |
| 48 | gfc_expr *gfc_power (gfc_expr *, gfc_expr *); |
| 49 | gfc_expr *gfc_concat (gfc_expr *, gfc_expr *); |
| 50 | gfc_expr *gfc_and (gfc_expr *, gfc_expr *); |
| 51 | gfc_expr *gfc_or (gfc_expr *, gfc_expr *); |
| 52 | gfc_expr *gfc_not (gfc_expr *); |
| 53 | gfc_expr *gfc_eqv (gfc_expr *, gfc_expr *); |
| 54 | gfc_expr *gfc_neqv (gfc_expr *, gfc_expr *); |
| 55 | gfc_expr *gfc_eq (gfc_expr *, gfc_expr *, gfc_intrinsic_op); |
| 56 | gfc_expr *gfc_ne (gfc_expr *, gfc_expr *, gfc_intrinsic_op); |
| 57 | gfc_expr *gfc_gt (gfc_expr *, gfc_expr *, gfc_intrinsic_op); |
| 58 | gfc_expr *gfc_ge (gfc_expr *, gfc_expr *, gfc_intrinsic_op); |
| 59 | gfc_expr *gfc_lt (gfc_expr *, gfc_expr *, gfc_intrinsic_op); |
| 60 | gfc_expr *gfc_le (gfc_expr *, gfc_expr *, gfc_intrinsic_op); |
| 61 | |
| 62 | /* Convert a constant of one kind to another kind. */ |
| 63 | gfc_expr *gfc_int2int (gfc_expr *, int); |
| 64 | gfc_expr *gfc_int2real (gfc_expr *, int); |
| 65 | gfc_expr *gfc_int2complex (gfc_expr *, int); |
| 66 | gfc_expr *gfc_int2uint (gfc_expr *, int); |
| 67 | gfc_expr *gfc_uint2uint (gfc_expr *, int); |
| 68 | gfc_expr *gfc_uint2int (gfc_expr *, int); |
| 69 | gfc_expr *gfc_uint2real (gfc_expr *, int); |
| 70 | gfc_expr *gfc_uint2complex (gfc_expr *, int); |
| 71 | gfc_expr *gfc_real2int (gfc_expr *, int); |
| 72 | gfc_expr *gfc_real2uint (gfc_expr *, int); |
| 73 | gfc_expr *gfc_real2real (gfc_expr *, int); |
| 74 | gfc_expr *gfc_real2complex (gfc_expr *, int); |
| 75 | gfc_expr *gfc_complex2int (gfc_expr *, int); |
| 76 | gfc_expr *gfc_complex2uint (gfc_expr *, int); |
| 77 | gfc_expr *gfc_complex2real (gfc_expr *, int); |
| 78 | gfc_expr *gfc_complex2complex (gfc_expr *, int); |
| 79 | gfc_expr *gfc_log2log (gfc_expr *, int); |
| 80 | gfc_expr *gfc_log2int (gfc_expr *, int); |
| 81 | gfc_expr *gfc_log2uint (gfc_expr *, int); |
| 82 | gfc_expr *gfc_int2log (gfc_expr *, int); |
| 83 | gfc_expr *gfc_uint2log (gfc_expr *, int); |
| 84 | gfc_expr *gfc_hollerith2int (gfc_expr *, int); |
| 85 | gfc_expr *gfc_hollerith2real (gfc_expr *, int); |
| 86 | gfc_expr *gfc_hollerith2complex (gfc_expr *, int); |
| 87 | gfc_expr *gfc_hollerith2character (gfc_expr *, int); |
| 88 | gfc_expr *gfc_hollerith2logical (gfc_expr *, int); |
| 89 | gfc_expr *gfc_character2int (gfc_expr *, int); |
| 90 | gfc_expr *gfc_character2real (gfc_expr *, int); |
| 91 | gfc_expr *gfc_character2complex (gfc_expr *, int); |
| 92 | gfc_expr *gfc_character2character (gfc_expr *, int); |
| 93 | gfc_expr *gfc_character2logical (gfc_expr *, int); |
| 94 | |
| 95 | #endif /* GFC_ARITH_H */ |
| 96 | |
| 97 | |