User`s guide

MACRO Support for 64-Bit Addressing
5.2 Passing 64-Bit Values
warning. The safest approach is to use registers R22 through R28 when a
temporary register is required.
Note
The $SETUP_CALL64, $PUSH_ARG64, and $CALL64 macros are
intended to be used in an inline sequence. That is, you cannot branch into
the middle of a $SETUP_CALL64/$PUSH_ARG64/$CALL64 sequence,
nor can you branch around $PUSH_ARG64 macros or branch out of the
sequence to avoid the $CALL64.
For more information about $SETUP_CALL64, $PUSH_ARG64, and $CALL64,
see Appendix E.
5.2.2 Calls with a Variable-Size Argument List
For calls with a variable-size argument list, use the EVAX_CALLG_64 built-in, as
shown in the following steps:
1. Create an in-memory argument list.
2. Call a routine, passing the in-memory argument list. For example:
EVAX_CALLG_64 (Rn), routine
The argument list in the EVAX_CALLG_64 built-in is read as a series of
quadwords, beginning with a quadword argument count.
5.3 Declaring 64-Bit Arguments
You can use QUAD_ARGS=TRUE, a .CALL_ENTRY parameter, to declare the
use of quadword arguments in a routine’s argument list. With the presence of
the QUAD_ARGS parameter, the compiler behaves differently when a quadword
reference to the argument list occurs. First, it does not force argument-list
homing, which such a reference normally requires. (An argument list containing
a quadword value cannot be homed because homing, by definition, packs the
arguments into longword slots.) Second, unaligned memory reference will not
be reported on these quadword references to the argument list.
Note that the actual code generated for the argument-list reference itself is not
changed by the presence of the QUAD_ARGS clause, except when the reference is
in a VAX quadword instruction, such as MOVQ. For the most part, QUAD_ARGS
only prevents argument-list homing due to a quadword reference and suppresses
needless alignment messages. This suppression applies to both EVAX_ built-ins
and VAX quadword instructions such as MOVQ.
For VAX quadword instructions, the QUAD_ARGS clause causes the compiler
to read the quadword argument as it does for EVAX_ built-ins—as an actual
quadword. Consider the following example:
MOVQ 4(AP), 8(R2)
If the QUAD_ARGS clause is specified, MOVQ stores the entire 64 bits of
argument 1 into the quadword at 8(R2). If the QUAD_ARGS clause is not
specified, MOVQ stores the low longwords of arguments 1 and 2 into the
quadword at 8(R2).
5–4 MACRO Support for 64-Bit Addressing