From: Richard Sandiford Date: Sun, 4 Jan 2009 22:14:39 +0000 (+0000) Subject: tree.def (LSHIFT_EXPR, [...]): Add commentary. X-Git-Tag: releases/gcc-4.4.0~1045 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0009b473a0fe5c76e303f1cc34251df0cba2d478;p=thirdparty%2Fgcc.git tree.def (LSHIFT_EXPR, [...]): Add commentary. gcc/ * tree.def (LSHIFT_EXPR, RSHIFT_EXPR): Add commentary. * tree-cfg.c (verify_gimple_assign_binary): Allow shifts of fixed-point types, and vectors of the same. From-SVN: r143061 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 032f0280817e..d7056f3de804 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-01-04 Richard Sandiford + + * tree.def (LSHIFT_EXPR, RSHIFT_EXPR): Add commentary. + * tree-cfg.c (verify_gimple_assign_binary): Allow shifts of + fixed-point types, and vectors of the same. + 2009-01-04 Richard Sandiford * config/mips/sync.md (*mb_barrier): Rename to... diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 3def9a2ec9b8..875d123244d0 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3474,6 +3474,12 @@ verify_gimple_assign_binary (gimple stmt) case LSHIFT_EXPR: case RSHIFT_EXPR: + if (FIXED_POINT_TYPE_P (rhs1_type) + && INTEGRAL_TYPE_P (rhs2_type) + && useless_type_conversion_p (lhs_type, rhs1_type)) + return false; + /* Fall through. */ + case LROTATE_EXPR: case RROTATE_EXPR: { @@ -3495,7 +3501,8 @@ verify_gimple_assign_binary (gimple stmt) case VEC_RSHIFT_EXPR: { if (TREE_CODE (rhs1_type) != VECTOR_TYPE - || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)) + || !(INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)) + || FIXED_POINT_TYPE_P (TREE_TYPE (rhs1_type))) || (!INTEGRAL_TYPE_P (rhs2_type) && (TREE_CODE (rhs2_type) != VECTOR_TYPE || !INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type)))) diff --git a/gcc/tree.def b/gcc/tree.def index 3e077cc2cd7a..19a502952eff 100644 --- a/gcc/tree.def +++ b/gcc/tree.def @@ -691,7 +691,13 @@ DEFTREECODE (ABS_EXPR, "abs_expr", tcc_unary, 1) The second operand is the number of bits to shift by; it need not be the same type as the first operand and result. Note that the result is undefined if the second operand is larger - than or equal to the first operand's type size. */ + than or equal to the first operand's type size. + + The first operand of a shift can have either an integer or a + (non-integer) fixed-point type. We follow the ISO/IEC TR 18037:2004 + semantics for the latter. + + Rotates are defined for integer types only. */ DEFTREECODE (LSHIFT_EXPR, "lshift_expr", tcc_binary, 2) DEFTREECODE (RSHIFT_EXPR, "rshift_expr", tcc_binary, 2) DEFTREECODE (LROTATE_EXPR, "lrotate_expr", tcc_binary, 2)