VMS Help
MACRO, /MIGRATION, Macros for 64-Bit Addressing, $PUSH ARG64, Description

 *Conan The Librarian (sorry for the slow response - running on an old VAX)

    This macro pushes a 64-bit argument for a 64-bit call. The macro
    $SETUP_CALL64 must be used before you can use $PUSH_ARG64.

    Arguments will be read as aligned quadwords. That is, $PUSH_ARG64
    4(R0) will read the quadword at 4(R0), and push the quadword. Any
    indexed operations will be done in quadword mode.

    To push a longword value from memory as a quadword, first move it
    into a register with a longword instruction, and then use $PUSH_
    ARG64 on the register. Similarly, to push a quadword value that
    you know is not aligned, move it to a temporary register first,
    and then use $PUSH_ARG64.

    If the call contains more than six arguments, this macro checks
    for SP or AP references in the argument. If the call contains
    more than six arguments, SP references are not allowed, and AP
    references are allowed only if the inline option is used.

    The macro also checks for references to argument registers that
    have already been set up for the current $CALL64. If it finds
    such references, a warning is reported to advise the user to be
    careful not to overwrite an argument register before it is used
    as the source in a $PUSH_ARG64.

    The same checking is done for AP references when there are six
    or fewer arguments; they are allowed, but the compiler cannot
    prevent you from overwriting one before you use it. Therefore, if
    such references are found, an informational message is reported.

    Note that if the operand uses a symbol whose name includes one
    of the strings R16 through R21, not as a register reference,
    this macro might report a spurious error. For example, if the
    invocation $PUSH_ARG64 SAVED_R21 is made after R21 has been set
    up, this macro will unnecessarily report an informational message
    about overwriting argument registers.

    Also note that $PUSH_ARG64 cannot be in conditional code. $PUSH_
    ARG64 updates several symbols, such as the remaining argument
    count. Attempting to write code that branches around a $PUSH_
    ARG64 in the middle of a $SETUP_CALL64/$CALL64 sequence will not
    work properly.
  Close     HLB-list     TLB-list     Help  

[legal] [privacy] [GNU] [policy] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.