avr-gcc-list
[Top][All Lists]
Advanced

[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/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]