Sorry for the slow response.  Jeff has approved the patch in the
meantime, but I didn't want to go ahead and apply it while there
was still disagreement...

Eric Botcazou <ebotca...@adacore.com> writes:
>> Please be more specific though.  If you don't think the patch is correct,
>> what do you think the requirement should be and how should it be integrated
>> into the existing checks?
>
> Good question, but I have asked it first. :-)
>
> So what are the new subregs that we want to accept here?  Can someone write 
> this down explicitly, I think that we cannot go ahead without that.

The idea is that if:

(1) we have a non-paradoxical subreg;
(2) both (reg:ymode xregno) and (reg:xmode xregno) occupy full
    hard registers (no padding or unused upper bits);
(3) (reg:ymode xregno) and (reg:xmode xregno) store the same number
    of bytes (X) in each constituent hard register;
(4) the offset is a multiple of X, i.e. the data we're accessing
    is aligned to a register boundary; and
(5) endianness is regular (no differences between words and bytes,
    or between registers and memory)

then the register offset is always the byte offset divided by X.

>> E.g. the assert is there because the main calculation is based on:
>> 
>>   /* Size of ymode must not be greater than the size of xmode.  */
>>   mode_multiple = GET_MODE_SIZE (xmode) / GET_MODE_SIZE (ymode);
>>   gcc_assert (mode_multiple != 0);
>> 
>> which clearly isn't a useful value if the division isn't exact.
>> Do you mean that, since mode_multiple isn't correct for the
>> DI-of-a-CI case, we should reformulate the end of the function
>> to avoid using mode_multiple at all?
>
> Yes.

It's not really obvious to me how to do that though.  Maybe I just
don't understand the cases that the existing code is trying to handle
well enough.

Thanks,
Richard

Reply via email to