The VSI C built-in functions available on OpenVMS Alpha systems are
also available on I64 systems, with some differences:
o There is no support for the asm, fasm, and dasm intrinsics
(declared in the <c_asm.h> header file).
o The functionality provided by the special-case treatment of R26
on an Alpha system asm, as in asm("MOV R26,R0"), is provided by
a new built-in function for I64 systems:
__int64 __RETURN_ADDRESS(void);
o The only PAL function calls implemented as built-in functions
within the compiler are the 24 queue-manipulation builtins.
The queue manipulation builtins generate calls to new OpenVMS
system services SYS$<name>, where <name> is the name of the
builtin with the leading underscores removed.
Any other OpenVMS PAL calls are supported through macros
defined in the <pal_builtins.h> header file included in the
<builtins.h> header file. Typically, the macros in
<pal_builtins.h> transform an invocation of an Alpha system
builtin into a call to a system service that performs the
equivalent function on an I64 system. Two notable exceptions
are __PAL_GENTRAP and __PAL_BUGCHK, which instead invoke the
I64 specific compiler builtin __break2.
o There is no support for the various floating-point built-in
functions used by the OPenVMS math library (for example,
operations with chopped rounding and conversions).
o For most built-in functions that take a retry count, the
compiler issues a warning message, evaluates the count for
possible side effects, ignores it, and then invokes the same
function without a retry count. This is necessary because the
retry behavior allowed by Alpha load-locked/store-conditional
sequences does not exist on I64 systems. There are two
exceptions to this: __LOCK_LONG_RETRY and
__ACQUIRE_SEM_LONG_RETRY; in these cases, the retry behavior
involves comparisons of data values, not just
load-locked/store-conditional.
o The __CMP_STORE_LONG and __CMP_STORE_QUAD built-in functions
produce either a warning or an error, depending on whether or
not the compiler can determine if the source and destination
addresses are identical. If the addresses are identical, the
compiler treats the builtin as the new __CMP_SWAP_ form and
issues a warning. Otherwise it is an error.