User`s guide

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.
$CALL64
Invokes the target routine.
Format
$CALL64 call_target
Parameters
call_target
The routine to be invoked.
Macros for 64-Bit Addressing E–3