On Thu, Oct 15, 2015 at 7:49 AM, Kugan
<kugan.vivekanandara...@linaro.org> wrote:
>
>
> On 12/10/15 23:21, Richard Biener wrote:
>> On Sun, Oct 11, 2015 at 12:35 PM, Kugan
>> <kugan.vivekanandara...@linaro.org> wrote:
>>>
>>>
>>> On 15/09/15 23:18, Richard Biener wrote:
>>>> On Mon, Sep 7, 2015 at 4:55 AM, Kugan <kugan.vivekanandara...@linaro.org> 
>>>> wrote:
>>>>>
>>>>> This patch adds support for new tree code SEXT_EXPR.
>>>>
>>>> diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
>>>> index d567a87..bbc3c10 100644
>>>> --- a/gcc/cfgexpand.c
>>>> +++ b/gcc/cfgexpand.c
>>>> @@ -5071,6 +5071,10 @@ expand_debug_expr (tree exp)
>>>>      case FMA_EXPR:
>>>>        return simplify_gen_ternary (FMA, mode, inner_mode, op0, op1, op2);
>>>>
>>>> +    case SEXT_EXPR:
>>>> +      return op0;
>>>>
>>>> that looks wrong.  Generate (sext:... ) here?
>>>>
>>>> +    case SEXT_EXPR:
>>>> +       {
>>>> +         rtx op0 = expand_normal (treeop0);
>>>> +         rtx temp;
>>>> +         if (!target)
>>>> +           target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (treeop0)));
>>>> +
>>>> +         machine_mode inner_mode
>>>> +           = smallest_mode_for_size (tree_to_shwi (treeop1),
>>>> +                                     MODE_INT);
>>>> +         temp = convert_modes (inner_mode,
>>>> +                               TYPE_MODE (TREE_TYPE (treeop0)), op0, 0);
>>>> +         convert_move (target, temp, 0);
>>>> +         return target;
>>>> +       }
>>>>
>>>> Humm - is that really how we expand sign extensions right now?  No helper
>>>> that would generate (sext ...) directly?  I wouldn't try using 'target' 
>>>> btw but
>>>> simply return (sext:mode op0 op1) or so.  But I am no way an RTL expert.
>>>>
>>>> Note that if we don't disallow arbitrary precision SEXT_EXPRs we have to
>>>> fall back to using shifts (and smallest_mode_for_size is simply wrong).
>>>>
>>>> +    case SEXT_EXPR:
>>>> +      {
>>>> +       if (!INTEGRAL_TYPE_P (lhs_type)
>>>> +           || !INTEGRAL_TYPE_P (rhs1_type)
>>>> +           || TREE_CODE (rhs2) != INTEGER_CST)
>>>>
>>>> please constrain this some more, with
>>>>
>>>>    || !useless_type_conversion_p (lhs_type, rhs1_type)
>>>>
>>>> +         {
>>>> +           error ("invalid operands in sext expr");
>>>> +           return true;
>>>> +         }
>>>> +       return false;
>>>> +      }
>>>>
>>>> @@ -3414,6 +3422,9 @@ op_symbol_code (enum tree_code code)
>>>>      case MIN_EXPR:
>>>>        return "min";
>>>>
>>>> +    case SEXT_EXPR:
>>>> +      return "sext from bit";
>>>> +
>>>>
>>>> just "sext" please.
>>>>
>>>> +/*  Sign-extend operation.  It will sign extend first operand from
>>>> + the sign bit specified by the second operand.  */
>>>> +DEFTREECODE (SEXT_EXPR, "sext_expr", tcc_binary, 2)
>>>>
>>>> "from the INTEGER_CST sign bit specified"
>>>>
>>>> Also add "The type of the result is that of the first operand."
>>>>
>>>
>>>
>>>
>>> Thanks for the review. Attached patch attempts to address the above
>>> comments. Does this look better?
>>
>> +    case SEXT_EXPR:
>> +      gcc_assert (CONST_INT_P (op1));
>> +      inner_mode = mode_for_size (INTVAL (op1), MODE_INT, 0);
>>
>> We should add
>>
>>         gcc_assert (GET_MODE_BITSIZE (inner_mode) == INTVAL (op1));
>>
>> +      if (mode != inner_mode)
>> +       op0 = simplify_gen_unary (SIGN_EXTEND,
>> +                                 mode,
>> +                                 gen_lowpart_SUBREG (inner_mode, op0),
>> +                                 inner_mode);
>>
>> as we're otherwise silently dropping things like SEXT (short-typed-var, 13)
>>
>> +    case SEXT_EXPR:
>> +       {
>> +         machine_mode inner_mode = mode_for_size (tree_to_shwi (treeop1),
>> +                                                  MODE_INT, 0);
>>
>> Likewise.  Also treeop1 should be unsigned, thus tree_to_uhwi?
>>
>> +         rtx temp, result;
>> +         rtx op0 = expand_normal (treeop0);
>> +         op0 = force_reg (mode, op0);
>> +         if (mode != inner_mode)
>> +           {
>>
>> Again, for the RTL bits I'm not sure they are correct.  For example I don't
>> see why we need a lowpart SUBREG, isn't a "regular" SUBREG enough?
>>
>> +    case SEXT_EXPR:
>> +      {
>> +       if (!INTEGRAL_TYPE_P (lhs_type)
>> +           || !useless_type_conversion_p (lhs_type, rhs1_type)
>> +           || !INTEGRAL_TYPE_P (rhs1_type)
>> +           || TREE_CODE (rhs2) != INTEGER_CST)
>>
>> the INTEGRAL_TYPE_P (rhs1_type) check is redundant with
>> the useless_type_Conversion_p one.  Please check
>> tree_fits_uhwi (rhs2) instead of != INTEGER_CST.
>>
>
> Thanks for the review, Please find the updated patch based on the review
> comments.

Ok.

Thanks,
Richard.


> Thanks,
> Kugan

Reply via email to