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: light...@lightner.net > URL: http://www.lightner.net/lightner/bruce/