VMS Help  —  MACRO  /MIGRATION  Macros for 64-Bit Addressing, $PUSH ARG64, Description
    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 on OpenVMS Alpha or
    eight arguments on OpenVMS I64, this macro checks for SP or AP
    references in the argument.

    If the call contains more than six arguments on OpenVMS Alpha or
    eight arguments on OpenVMS I64, SP references are not allowed,
    and AP references are allowed only if the inline option is used.

    OpenVMS Alpha systems only: 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.

    OpenVMS Alpha systems only: 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.

    OpenVMS Alpha systems only: 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 Help