This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[gfortran] Updates to ISHFT translation
- From: Tobias Schlüter <tobias dot schlueter at physik dot uni-muenchen dot de>
- To: GCC Fortran mailing list <fortran at gcc dot gnu dot org>,patch <gcc-patches at gcc dot gnu dot org>
- Date: Sun, 09 Jan 2005 17:38:33 +0100
- Subject: [gfortran] Updates to ISHFT translation
When investigating PR 19334, I noticed that there's a path where an unsigned
variable would silently be converted into a signed one (i.e. "build (EXPR,
signed_type, a, ...)" instead of "build (EXPR, signed_type, convert
(signed_type, a), ...))"). This patch fixes this, and reformats a few lines
in the function.
Bubblestrapped and tested, ok?
- Tobi
2005-01-09 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
* trans-intrinsic.c (gfc_conv_intrinsic_ishft): Fix signed / unsigned
confusion, formatting changes.
Index: trans-intrinsic.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/fortran/trans-intrinsic.c,v
retrieving revision 1.38
diff -u -p -r1.38 trans-intrinsic.c
--- trans-intrinsic.c 8 Jan 2005 21:47:36 -0000 1.38
+++ trans-intrinsic.c 9 Jan 2005 16:33:59 -0000
@@ -1785,18 +1785,19 @@ gfc_conv_intrinsic_ishft (gfc_se * se, g
type = TREE_TYPE (arg);
utype = gfc_unsigned_type (type);
- /* We convert to an unsigned type because we want a logical shift.
- The standard doesn't define the case of shifting negative
- numbers, and we try to be compatible with other compilers, most
- notably g77, here. */
- arg = convert (utype, arg);
width = fold (build1 (ABS_EXPR, TREE_TYPE (arg2), arg2));
/* Left shift if positive. */
lshift = fold (build2 (LSHIFT_EXPR, type, arg, width));
- /* Right shift if negative. */
- rshift = convert (type, fold (build2 (RSHIFT_EXPR, utype, arg, width)));
+ /* Right shift if negative.
+ We convert to an unsigned type because we want a logical shift.
+ The standard doesn't define the case of shifting negative
+ numbers, and we try to be compatible with other compilers, most
+ notably g77, here. */
+ rshift = convert (type,
+ fold (build2 (RSHIFT_EXPR, utype,
+ convert (type, arg), width)));
tmp = fold (build2 (GE_EXPR, boolean_type_node, arg2,
convert (TREE_TYPE (arg2), integer_zero_node)));
@@ -1807,12 +1808,10 @@ gfc_conv_intrinsic_ishft (gfc_se * se, g
special case. */
num_bits = convert (TREE_TYPE (arg2),
build_int_cst (NULL, TYPE_PRECISION (type)));
- cond = fold (build2 (GE_EXPR, boolean_type_node, width,
- convert (TREE_TYPE (arg2), num_bits)));
+ cond = fold (build2 (GE_EXPR, boolean_type_node, width, num_bits));
se->expr = fold (build3 (COND_EXPR, type, cond,
- convert (type, integer_zero_node),
- tmp));
+ convert (type, integer_zero_node), tmp));
}
/* Circular shift. AKA rotate or barrel shift. */