¿ªÔÆÌåÓý

GCCLIB - Double Branch on calls to RESLIB library - needed?


 

At the moment the stubs (linked to the client program) look like this:

? ? ? ? ?EXTRN GCCANCHR
VFPRINTF CSECT
? ? ? ? ?USING VFPRINTF,R15
? ? ? ? ?L? ? ?R15,=V(GCCANCHR) get anchor ptr
? ? ? ? ?L? ? ?R15,0(R15)? ? ? ?get the anchor
? ? ? ? ?LA? ? R15,VTVFPRIN(R15)? ?<- i.e. the nth entry
? ? ? ? ?BR? ? R15? ? ? ? ? ? go there
? ? ? ? ?LTORG
? ? ? ? ?VTABLE
? ? ? ? ?REGEQU
? ? ? ? ?END

This jumps to a location in the RESLIB library which looks like this

FPRINTF? ? DS? ? 0H
? ? ? ? ?USING *,R15
? ? ? ? ?L? ? ?R15,=V(FPRINTF)? ? <- the stub has worked out that?VTVFPRIN / FPRINTF is entry n with address here
? ? ? ? ?BR? ? R15

Which jumps to the implementation. Two branches.

(I am assuming that "FPRINTF? ? DS? ? 0H" is something that the linker sorts out - not sure why an EXTRN is not used but is above - besides the point!)

Is there anyway that I can just do something like:

In the table have
? ? ? DS??=V(FPRINTF)
? ? ? DS??=V(PRINTF)
? ? ? DS??=V(ANOTHER)

and in the stub do something like
? ? ? ? ?USING VFPRINTF,R15
? ? ? ? ?L? ? ?R15,=V(GCCANCHR) get anchor ptr
? ? ? ? ?L? ? ?R15,0(R15)? ? ? ?get the anchor
? ? ? ? ?LA? ? R15,VTVFPRIN(R15)
? ? ? ? ?LA? ? R15,0(R15)
? ? ? ? ?BR? ? R15? ? ? ? ? ? go there
?
But in an efficient way - or is two branches as fast as it gets?!
Can someone craft some Assembler for me?

Something I will come to next after doing the dynamic stack, as I want to automate the stub building anyway.

Thanks as always!

Adrian


 

LA R15,0(R15) would add 0 to the value of R15. I dont?think thats what you want.

Joe

On Tue, Apr 14, 2020 at 6:22 AM adriansutherland67 <adrian@...> wrote:
At the moment the stubs (linked to the client program) look like this:

? ? ? ? ?EXTRN GCCANCHR
VFPRINTF CSECT
? ? ? ? ?USING VFPRINTF,R15
? ? ? ? ?L? ? ?R15,=V(GCCANCHR) get anchor ptr
? ? ? ? ?L? ? ?R15,0(R15)? ? ? ?get the anchor
? ? ? ? ?LA? ? R15,VTVFPRIN(R15)? ?<- i.e. the nth entry
? ? ? ? ?BR? ? R15? ? ? ? ? ? go there
? ? ? ? ?LTORG
? ? ? ? ?VTABLE
? ? ? ? ?REGEQU
? ? ? ? ?END

This jumps to a location in the RESLIB library which looks like this

FPRINTF? ? DS? ? 0H
? ? ? ? ?USING *,R15
? ? ? ? ?L? ? ?R15,=V(FPRINTF)? ? <- the stub has worked out that?VTVFPRIN / FPRINTF is entry n with address here
? ? ? ? ?BR? ? R15

Which jumps to the implementation. Two branches.

(I am assuming that "FPRINTF? ? DS? ? 0H" is something that the linker sorts out - not sure why an EXTRN is not used but is above - besides the point!)

Is there anyway that I can just do something like:

In the table have
? ? ? DS??=V(FPRINTF)
? ? ? DS??=V(PRINTF)
? ? ? DS??=V(ANOTHER)

and in the stub do something like
? ? ? ? ?USING VFPRINTF,R15
? ? ? ? ?L? ? ?R15,=V(GCCANCHR) get anchor ptr
? ? ? ? ?L? ? ?R15,0(R15)? ? ? ?get the anchor
? ? ? ? ?LA? ? R15,VTVFPRIN(R15)
? ? ? ? ?LA? ? R15,0(R15)
? ? ? ? ?BR? ? R15? ? ? ? ? ? go there
?
But in an efficient way - or is two branches as fast as it gets?!
Can someone craft some Assembler for me?

Something I will come to next after doing the dynamic stack, as I want to automate the stub building anyway.

Thanks as always!

Adrian


 

On Tue, Apr 14, 2020 at 02:51 PM, Joe Monk wrote:
LA R15,0(R15) would add 0 to the value of R15. I dont?think thats what you want.
Perhaps I mean just L? Anyway I am guessing from silence that the double branch is as good as it gets!