Hello ASSEMBLER list,

I have a problem which is difficult to explain,
let me give it a try ...

I am rewriting old ASSEMBLER modules which have SIIS problems.
There are customer written macros which have inline parameter lists
which are modified, which leads to SIIS performance problems.

One elegant soluton is: the customer macros can generate reentrant code,
if a global switch is set. If so, they put all their variable parts in a certain (global) DSECT called #DRENT, and a dynamic area for this DSECT is obtained by the startup macro. The nice thing about this is that the total size of this DSECT is computed automatically at the end by the ASSEMBLER and the startup macro can obtain the needed area size.
(The #DRENT DSECT is addressed using register 13 with reentrant programs,
and it simply is the area following the system save area, so there is no special
register needed to address it in the reentrant case).

I now decided to use this mechanism to get rid of the SIIS problems;
I simply set the global switch to YES, although the programs are NORENT,
and then define a "static #DRENT", much like this

#DRENT_STATICĀ  DS CL(#END_OF_DRENT-#DRENT)

then I have to find a free register and identify the register with the "static #DRENT" by a USING instruction. (Register 13 is not possible in this case, because it is already occupied by the system save area in the startup macro, and this area cannot be extended).

That is: I am cheating; the customer macros "think" they have to generate code
for the reentrant case.

This way, the SIIS problems disappear, because now the stores etc. have a distance
big enough from the PSW position. It works, and in some processes, I have
performance gains of 6 percent and more. And there is almost no change to the customer modules (only two new macro calls, and all SIIS problems in all macro
calls throughout the whole module disappear).

Now my problem:

with several large programs, it is not easy to find a free register for the "static #DRENT".

But: there are registers which access the static area of the program, that is,
the area where the static definitions and the constants reside.

say: register 10 is the base for those static definitions and constants.

and: let's assume that the new "static #DRENT" can be positioned at the very beginning
of this static and constant area

How can I convince the ASSEMBLER to use register 10 during translation for
both the #DRENT DSECT (inside the customer macros) and the static area
(in the open code)? Is this possible? Is there a solution using new ASSEMBLER
techniques like LOCTR etc.?

I don't want to change the customer macros, because they are used in 1000s of other
modules; only changes to the open code, if possible ...

Thank you, kind regards

Bernd

Reply via email to