OSDN Git Service

gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 Jan 2009 22:14:39 +0000 (22:14 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 Jan 2009 22:14:39 +0000 (22:14 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143061 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-cfg.c
gcc/tree.def

index 032f028..d7056f3 100644 (file)
@@ -1,5 +1,11 @@
 2009-01-04  Richard Sandiford  <rdsandiford@googlemail.com>
 
+       * 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  <rdsandiford@googlemail.com>
+
        * config/mips/sync.md (*mb_barrier): Rename to...
        (*memory_barrier): ...this.
 
index 3def9a2..875d123 100644 (file)
@@ -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))))
index 3e077cc..19a5029 100644 (file)
@@ -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)