Although debuggers and post-mortem traces will not love you for it, right?

Charles


-----Original Message-----
From: IBM Mainframe Assembler List [mailto:ASSEMBLER-LIST@LISTSERV.UGA.EDU] On 
Behalf Of Tony Thigpen
Sent: Tuesday, November 30, 2021 9:58 AM
To: ASSEMBLER-LIST@LISTSERV.UGA.EDU
Subject: Re: Base-less macros

You don't have to always save ALL the registers. No matter what the 
caller provides, you can always do a
   STMG 14,4,8(13)
   STG  13,64(13)
because it fits in the standard 72 byte minimal save area.
After the STMG, you can then decide if the caller passed a larger area 
or you can just acquire a larger save area yourself and store everything 
"correctly" in it.

Of course, if your routine can be written to only use R13-R4, you can 
just do your work and return back.

After processing is done, you can then restore everything from the 
larger area, then restore 14-5 from the original save are, then return 
back. (Just don't use the RETURN macro.)

Tony Thigpen

Mark Hammack wrote on 11/30/21 10:53 AM:
> In our case, the caller doesn't "know" whether the called subroutine is
> base 31 or base 64.  So it is up to the called subroutine to "figure out"
> whether the caller used a 72 byte save area or a 144 byte save area.
> Parameters to the macro set addressing mode, RSA size, etc.  This allows
> for a 31 bit module to call a 64 bit subroutine and vice versa.  That's
> what I really mean by "switches between".  The one caveat is that the
> caller must provide a large enough area to allow for the 144 byte area.
> 
> Since some subroutines accept arguments in R0 and/or R1 (and unfortunately
> assume other registers are pre-loaded) those can't be touched before being
> saved.  Likewise, if the routine is called from another 64 bit subroutine,
> the high halves of registers are (potentially) in use.  However, since
> (currently) all of our programs run below the bar, using the high half of
> R14 may be an option.  I need to look into using a FPR or AR but the 4 byte
> literal pool works for now.  Storing R14 in 8(R13) is not a bad idea either.
> 
> Thanks!
> 
> 
> 
> *Mark*
> 
> 
> On Tue, Nov 30, 2021 at 8:37 AM Charles Mills <charl...@mcn.org> wrote:
> 
>> Ah! I have not been clear on the convention. As I read it now, the called
>> program puts one of the FnSA strings in its *new* save area to indicate how
>> *it* previously stored the registers in its entry save area.
>>
>> So the OP's premise is incorrect. A program cannot learn the length or
>> format of the incoming save area by examining it (although an FnSA string
>> there would give you a clue of what the caller was up to in general).
>>
>> I am inferring that there is no way for a called program to determine
>> programmatically the length or expected format of the incoming save area.
>> It
>> must be agreed upon by the two programs, or phrasing it differently, the
>> called program's save area expectations must be documented and respected by
>> the caller.
>>
>> Am I right, or off (pardon the pun) base?
>>
>> Charles
>>
>>
>> -----Original Message-----
>> From: IBM Mainframe Assembler List [mailto:ASSEMBLER-LIST@LISTSERV.UGA.EDU
>> ]
>> On Behalf Of Peter Relson
>> Sent: Tuesday, November 30, 2021 5:39 AM
>> To: ASSEMBLER-LIST@LISTSERV.UGA.EDU
>> Subject: Re: Base-less macros
>>
>> Steve Smith wrote:
>>> And there are other bizarre ways to return without
>>> restoring R14, which is not actually required by documented conventions.
>>
>> Only restoring of AR14 and the high half of R14 are required (for
>> non-AMODE 64 cases), in general.
>> (Although I would guess that there are many violations of preserving the
>> high half of R14).
>> Some interfaces might define that they preserve R14 completely. Most do
>> not.
>>
>> Mark Hammack wrote
>>> I have a macro that switches between a regular (24/31 bit style)
>>> save area and an extended (64 bit "F4SA") save area.
>>
>> What do you mean by "switches between"? It is fine to use a different
>> style than the style your caller was using (as long as the savearea
>> provided is big enough to accommodate your needs), without having any care
>> about what was being used by your caller. The string at +4 identifies how
>> you saved your caller's registers.
>>
>> Peter Relson
>> z/OS Core Technology Design
>>

Reply via email to