[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: GCC bug?
From: |
Ian Molton |
Subject: |
Re: GCC bug? |
Date: |
Fri, 17 Dec 2021 21:33:20 +0000 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.3.1 |
Ok, I don't want to sound rude, but did anyone actually *read* what I wrote?
I'll highlight the parts of lines in question this time, perhaps that
will help...
if (AVR_HAVE_RAMPZ
^^^^^^^^^^^^^^
&& TEST_HARD_REG_BIT (set, REG_Z)
&& TEST_HARD_REG_BIT (set, REG_Z + 1))
{
emit_push_sfr (rampz_rtx, false /* frame */, AVR_HAVE_RAMPD,
^^^^^^^^^^^^^^
treg);
}
OVER HERE ------------->>>>>--------------------------^^^^^^^^^^^^^^^^^
Either I'm missing something here, or someone needs to explain to me why
a test for AVR_HAVE_RAMPZ preceeds the use of AVR_HAVE_RAMPD in the code.
Shouldn't that last one also be RAMPZ ?
If not, why?
-Ian
On 17/12/2021 16:53, Bruce D. Lightner wrote:
> Ian,
>
> I apologize if I was being obtuse! :-)
>
> The AVR_HAVE_RAMPD #define tells the routine "emit_push_sfr()" to save
> the RAMPD register, but only if the third parameter to the call is
> non-zero. The constant AVR_HAVE_RAMPD will be non-zero if the AVR
> micro-architecture supports a RAMPD register.
>
> That's why you see the code you reported. Much older versions of
> avr-gcc have "emit_push_sfr()" source code with one less parameter
> (i.e., no AVR_HAVE_RAMPD reference) because the RAMPD "paging" register
> is a relatively "new" AVR feature.
>
> Best regards,
>
> Bruce
>
> ------------------------------------------------------------------------
> On 12/17/2021 5:39 AM, Ian Molton wrote:
>> I think you misunderstood me;
>>
>> I know this is where the compiler will save RAMPZ where needed.
>>
>> So why is it referencing RAMP *D* ?
>>
>> On 17/12/2021 00:50, Bruce D. Lightner wrote:
>>> Ian,
>>>
>>> Just from a purely AVR architecture point of view, the AVR_HAVE_RAMPD
>>> #define indicates that the AVR chip in question supports the "RAMP"
>>> paging register, described as follows:
>>>
>>> *RAMPD*
>>> Register concatenated with the Z-register enabling direct addressing
>>> of the whole data space on MCUs
>>> with more than 64KB data space.
>>>
>>> Eventually the originally tiny AVR chips' addressable memory got so big
>>> that we needed a "paging" register. (That's a repeating theme with
>>> every 8-bit/16-bit microcontroller family.)
>>>
>>> So the "RAMPD" register needs to be saved along with the X, Y and Z
>>> "special function" registers, if it is present.
>>>
>>> Best regards,
>>>
>>> Bruce
>>>
>>> ------------------------------------------------------------------------
>>> On 12/16/2021 3:46 PM, Ian Molton wrote:
>>>> Browsing the GCC source, I found this in gcc/config/avr/avr.c
>>>>
>>>> if (AVR_HAVE_RAMPZ
>>>> && TEST_HARD_REG_BIT (set, REG_Z)
>>>> && TEST_HARD_REG_BIT (set, REG_Z + 1))
>>>> {
>>>> emit_push_sfr (rampz_rtx, false /* frame */, AVR_HAVE_RAMPD,
>>>> treg);
>>>> }
>>>>
>>>>
>>>> I wont pretend to fully understand this part of the compiler, but that
>>>> AVR_HAVE_RAMPD looks shady to me?
>>>>
>>>> Anyone with deeper knowledge want to have a look?
>>>>
>>>> -Ian
>>>>
>>>
>
> --
> *Bruce D. Lightner*
> *Lightner Engineering*
> La Jolla, CA
> Email: lightner@lightner.net
> URL: http://www.lightner.net/lightner/bruce/