User`s guide
How the MACRO Compiler Functions on Different Platforms
2.9 Using Packed Decimal Instructions
The emulation routines have their own trap routines for reserved operand,
decimal divide by zero, integer overflow, and decimal overflow. Reserved
operand and decimal divide by zero traps are always taken when the events
occur. The overflow traps are taken only when they have been explicitly
enabled. The traps call LIB$SIGNAL with a severity of fatal.
• Messages from the packed decimal emulation routines
All messages from the packed decimal emulation routines of the compiler
use the following standard OpenVMS signal values: SS$_ROPRAND,
SS$_DECOVF, SS$_INTOVF, and SS$_FLTDIV.
• Restriction on format of arguments
Because these instructions are implemented by means of macros, there is one
restriction on the format of the arguments. In a macro invocation, an initial
circumflex ( ^ ) is interpreted to mean that the parameter is a string, and
the character immediately following the circumflex is the string delimiter.
Because of this, you cannot use arguments that begin with an operand type
specification, such as ^x20(SP). Note that immediate mode arguments, such
as #^XFF, can use an operand type specification because the circumflex is not
the initial character.
2.10 Using Floating-Point Instructions
All floating-point instructions and directives, with the exception of POLYx,
EMODx and all H_floating instructions, are supported.
These instructions are emulated by means of subroutine calls. This support is
provided to allow hands-off compatibility for most existing VAX MACRO modules
and is not designed for fast floating-point performance.
Besides the overhead of the emulation routine call, on OpenVMS Alpha systems,
all floating-point operands must be passed through memory because the Alpha
architecture does not have instructions to move values directly from the integer
registers to the floating-point registers. In addition, on the first floating-point
instruction, the FEN (floating-point enable) bit is set for the process which will
cause the entire floating-point register set to be saved and restored on every
context switch for the life of the image.
2.10.1 Differences Between the OpenVMS VAX and OpenVMS Alpha/I64
Implementations
The differences between the implementations on OpenVMS VAX and OpenVMS
Alpha/I64 systems are noted in the following list:
• Floating-point instructions and atomicity
Since all floating-point instructions are emulated by means of subroutine
calls, they are not atomic or restartable, and cannot be made atomic by
the .PRESERVE ATOMICITY directive or /PRESERVE=ATOMICITY option.
Also, there is no guarantee that registers from R16 through R28 are preserved
across the instruction.
• Use of argument registers
Arguments are passed to the emulation routines by means of the argument
registers (R16 through R21 on OpenVMS Alpha systems); attempts to use
these registers as arguments in a floating-point instruction will not work
correctly.
How the MACRO Compiler Functions on Different Platforms 2–19