Copyright Digital Equipment Corp. All rights reserved.

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.