On Jan 14, 2014, at 7:25 AM, Richard Sandiford <rsand...@linux.vnet.ibm.com> 
wrote:
> Mike Stump <mikest...@comcast.net> writes:
>> diff --git a/gcc/expmed.c b/gcc/expmed.c
>> index ce063eb..720d8c1 100644
>> --- a/gcc/expmed.c
>> +++ b/gcc/expmed.c
>> @@ -4963,6 +4963,7 @@ make_tree (tree type, rtx x)
>>       return t;
>> 
>>     case CONST_DOUBLE:
>> +      gcc_assert (HOST_BITS_PER_WIDE_INT * 2 <= MAX_BITSIZE_MODE_ANY_INT);
>>       if (TARGET_SUPPORTS_WIDE_INT == 0 && GET_MODE (x) == VOIDmode)
>>      t = wide_int_to_tree (type,
>>                            wide_int::from_array (&CONST_DOUBLE_LOW (x), 2,
> 
> I think this would be better as a STATIC_ASSERT.

The cost should be the same in generated code.  The C folks can read and 
understand the gcc_assert easier, and the static property of the check we don't 
make any use of.  I could change it, but there are 0 of these in *.c presently, 
and I think we want to tread lightly on those folks that know and like C, and 
don't want gcc to be `different' for no good reason.  That said, if people 
think it would be good to use it, I'd be happy to change it.

>> @@ -1440,10 +1442,10 @@ real_to_integer (const REAL_VALUE_TYPE *r, bool 
>> *fail, int precision)
>>      }
>> #endif
>>       w = SIGSZ * HOST_BITS_PER_LONG + words * HOST_BITS_PER_WIDE_INT;
>> -      result = wide_int::from_array
>> +      tmp = real_int::from_array
>>      (val, (w + HOST_BITS_PER_WIDE_INT - 1) / HOST_BITS_PER_WIDE_INT, w);
>> -      result = wi::lrshift (result, (words * HOST_BITS_PER_WIDE_INT) - exp);
>> -      result = wide_int::from (result, precision, UNSIGNED);
>> +      tmp = wi::lrshift<real_int> (tmp, (words * HOST_BITS_PER_WIDE_INT) - 
>> exp);
>> +      result = wide_int::from (tmp, precision, UNSIGNED);
> 
> Why did you need the <real_int>?  It was supposed to work without.

The code in question needs something that is max int + max significand real in 
size, we made the max int smaller (smaller than this quantity on x86) so, this 
code needs a special wide int that is bigger.  The type is free as vrp uses the 
same type.  As for why Kenny choose this method, I'd defer to him.

>> diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
>> index 00b5439..7c21afa 100644
>> --- a/gcc/simplify-rtx.c
>> +++ b/gcc/simplify-rtx.c
>> @@ -5384,6 +5384,7 @@ simplify_immed_subreg (enum machine_mode outermode, 
>> rtx op,
>>              tmp[u] = buf;
>>              base += HOST_BITS_PER_WIDE_INT;
>>            }
>> +        gcc_assert (GET_MODE_PRECISION (outer_submode) <= 
>> MAX_BITSIZE_MODE_ANY_INT);
>>          r = wide_int::from_array (tmp, units,
>>                                    GET_MODE_PRECISION (outer_submode));
>>          elems[elem] = immed_wide_int_const (r, outer_submode);
> 
> Long line.

Fixed:

Index: simplify-rtx.c
===================================================================
--- simplify-rtx.c      (revision 206601)
+++ simplify-rtx.c      (working copy)
@@ -5384,7 +5384,8 @@ simplify_immed_subreg (enum machine_mode
                tmp[u] = buf;
                base += HOST_BITS_PER_WIDE_INT;
              }
-           gcc_assert (GET_MODE_PRECISION (outer_submode) <= 
MAX_BITSIZE_MODE_ANY_INT);
+           gcc_assert (GET_MODE_PRECISION (outer_submode)
+                       <= MAX_BITSIZE_MODE_ANY_INT);
            r = wide_int::from_array (tmp, units,
                                      GET_MODE_PRECISION (outer_submode));
            elems[elem] = immed_wide_int_const (r, outer_submode);

Thanks for the review.

Reply via email to