HELPLIB.HLB  —  RTL Routines, OTS$  OTS$JUMP_TO_BPV, Description
    When a procedure value that refers to a bound procedure
    descriptor is used to make a call, the routine designated in
    the OTS_ENTRY field (typically OTS$JUMP_TO_BPV) receives control
    with the GP register pointing to the bound procedure descriptor
    (instead of a global offset table). This routine performs the
    following steps:

    1. Load the "real" target entry address into a volatile branch
       register, for example, B6.

    2. Load the dynamic environment value into the appropriate
       uplevel-addressing register for the target function, for
       example, OTS$JUMP_TO_BPV uses R9.

    3. Load the "real" target GP address into the GP register

    4. Transfer control (branch, not call) to the target entry
       address.

    Control arrives at the real target procedure address with both
    the GP and environment register values established appropriately.

    Support routine OTS$JUMP_TO_BPV is included as a standard library
    routine. The operation of OTS$JUMP_TO_BPV is logically equivalent
    to the following code:

       OTS$JUMP_TO_BPV::
            add     gp=gp,24        ; Adjust GP to point to entry address
            ld8     r9=[gp],16      ; Load target entry address
            mov     b6=r9
            ld8     r9=[gp],-8      ; Load target environment value
            ld8     gp=[gp]         ; Load target GP
            br      b6              ; Transfer to target

    Note that there can be multiple OTS$JUMP_TO_BPV-like support
    routines, corresponding to different target registers where
    the environment value should be placed. The code that creates
    the bound function descriptor is also necessarily compiled by
    the same compiler that compiles the target procedure, thus can
    correctly select an appropriate support routine.
Close Help