Ported VAX MACRO code sometimes requires access to Alpha native instructions to deal directly with a 64-bit quantity or to include an Alpha instruction that has no VAX equivalent. The compiler provides built-ins to allow you access to these instructions. The following byte and word built-ins are included in the MACRO compiler: o EVAX_LDBU o EVAX_LDWU o EVAX_STB o EVAX_STW o EVAX_SEXTB o EVAX_SEXTW You use these built-ins in the same way that you use native VAX instructions, using any VAX operand mode. For example, EVAX_ ADDQ 8(R0),(SP)+,R1 is legal. The only exception is that the first operand of any Alpha load/store built-in (EVAX_LD*, EVAX_ ST*) must be a register. On OpenVMS Alpha, the best environment in which to run code that contains the byte and word built-ins is on a system that implements these instructions in hardware. If you run such code on an Alpha system that implements them by software emulation, the following limitations exist: o Significant performance loss The overhead of handling the exception to trigger the software emulation causes a significant performance loss. If software emulation is in effect, you will see this message: %SYSTEM-I-EMULATED, an instruction not implemented on this processor was emulated o Some capabilities not present in the software emulation The software emulation is not capable of providing all the capabilities that would be present on a system that implemented the the instructions in hardware. Code that executes in inner access modes and at elevated IPL is allowed to use these instructions. For example, activation of the software emulator above IPL 2 will not cause a bug check. However, certain applications where these instructions might be useful, such as direct writes to hardware control registers, will be impossible, because such applications require the presence of address lines whose function cannot be emulated. Furthermore, if the code with these built-ins executes on a system without either the byte and word software emulator or a processor that implements the byte and word instructions in hardware, it will incur a fatal exception, such as the following: %SYSTEM-F-OPCDEC, opcode reserved to Digital fault at PC=00000000000020068,PS=0000001B NOTE Memory references in the MACRO compiler built-ins are always assumed to be quadword aligned except in EVAX_SEXTB, EVAX_ SEXTW, EVAX_LDBU, EVAX_LDWU, EVAX_STB, EVAX_STW, EVAX_LDQU, and EVAX_STQU. The following table summarizes the Alpha built-ins supported by the compiler. The built-ins that are Alpha-only (cannot be used to generate or access Itanium instructions) are noted in the table. Functional on Built-in Operands Description OpenVMS I64? EVAX_SEXTB <RQ,WB> Sign-extend byte Yes EVAX_SEXTW <RQ,WW> Sign-extend word Yes EVAX_SEXTL <RQ,WL> Sign-extend longword Yes EVAX_LDBU <WQ,AB> Load zero-extended Yes byte from memory EVAX_LDWU <WQ,AQ> Load zero-extended Yes word from memory EVAX_LDLL <WL,AL> Load longword locked Yes EVAX_LDAQ <WQ,AQ> Load address of Yes quadword EVAX_LDQ <WQ,AQ> Load quadword Yes EVAX_LDQL <WQ,AQ> Load quadword locked Yes EVAX_LDQU <WQ,AQ> Load unaligned Yes quadword EVAX_STB <RQ,AB> Store byte from Yes register to memory EVAX_STW <RQ,AW> Store word from Yes register to memory EVAX_STLC <ML,AL> Store longword Yes conditional EVAX_STQ <RQ,AQ> Store quadword Yes EVAX_STQC <MQ,AQ> Store quadword Yes conditional EVAX_STQU <RQ,AQ> Store unaligned Yes quadword EVAX_ADDQ <RQ,RQ,WQ> Quadword add Yes EVAX_SUBQ <RQ,RQ,WQ> Quadword subtract Yes EVAX_MULQ <RQ,RQ,WQ> Quadword multiply Yes EVAX_UMULH <RQ,RQ,WQ> Unsigned quadword Yes multiply high EVAX_AND <RQ,RQ,WQ> Logical product Yes EVAX_OR <RQ,RQ,WQ> Logical sum Yes EVAX_XOR <RQ,RQ,WQ> Logical difference Yes EVAX_BIC <RQ,RQ,WQ> Bit clear Yes EVAX_ORNOT <RQ,RQ,WQ> Logical sum with Yes complement EVAX_EQV <RQ,RQ,WQ> Logical equivalence Yes EVAX_SLL <RQ,RQ,WQ> Shift left logical Yes EVAX_SRL <RQ,RQ,WQ> Shift right logical Yes EVAX_SRA <RQ,RQ,WQ> Shift right Yes arithmetic EVAX_EXTBL <RQ,RQ,WQ> Extract byte low Yes EVAX_EXTWL <RQ,RQ,WQ> Extract word low Yes EVAX_EXTLL <RQ,RQ,WQ> Extract longword low Yes EVAX_EXTQL <RQ,RQ,WQ> Extract quadword low Yes EVAX_EXTBH <RQ,RQ,WQ> Extract byte high Yes EVAX_EXTWH <RQ,RQ,WQ> Extract word high Yes EVAX_EXTLH <RQ,RQ,WQ> Extract longword high Yes EVAX_EXTQH <RQ,RQ,WQ> Extract quadword high Yes EVAX_INSBL <RQ,RQ,WQ> Insert byte low Yes EVAX_INSWL <RQ,RQ,WQ> Insert word low Yes EVAX_INSLL <RQ,RQ,WQ> Insert longword low Yes EVAX_INSQL <RQ,RQ,WQ> Insert quadword low Yes EVAX_INSBH <RQ,RQ,WQ> Insert byte high Yes EVAX_INSWH <RQ,RQ,WQ> Insert word high Yes EVAX_INSLH <RQ,RQ,WQ> Insert longword high Yes EVAX_INSQH <RQ,RQ,WQ> Insert quadword high Yes EVAX_TRAPB <> Trap barrier No EVAX_MB <> Memory barrier Yes EVAX_RPCC <WQ> Read process cycle No counter EVAX_CMPEQ <RQ,RQ,WQ> Integer signed Yes compare, equal EVAX_CMPLT <RQ,RQ,WQ> Integer signed Yes compare, less than EVAX_CMPLE <RQ,RQ,WQ> Integer signed Yes compare, less equal EVAX_CMPULT <RQ,RQ,WQ> Integer unsigned Yes compare, less than EVAX_CMPULE <RQ,RQ,WQ> Integer unsigned Yes compare, less equal EVAX_BEQ <RQ,AQ> Branch equal Yes EVAX_BLT <RQ,AQ> Branch less than Yes EVAX_BNE <RQ,AQ> Branch not equal Yes EVAX_CMOVEQ <RQ,RQ,WQ> Conditional Yes move/equal EVAX_CMOVNE <RQ,RQ,WQ> Conditional move/not Yes equal EVAX_CMOVLT <RQ,RQ,WQ> Conditional move/less Yes than EVAX_CMOVLE <RQ,RQ,WQ> Conditional move/less Yes or equal EVAX_CMOVGT <RQ,RQ,WQ> Conditional Yes move/greater than EVAX_CMOVGE <RQ,RQ,WQ> Conditional Yes move/greater or equal EVAX_CMOVLBC <RQ,RQ,WQ> Conditional move/low Yes bit clear EVAX_CMOVLBS <RQ,RQ,WQ> Conditional move/low Yes bit set EVAX_MF_FPCR <WQ> Move from floating- No point control register EVAX_MT_FPCR <WQ,RQ> Move to floating- No point control register EVAX_ZAP <RQ,RQ,WQ> Zero bytes Yes EVAX_ZAPNOT <RQ,RQ,WQ> Zero bytes with NOT Yes mask