VMS Help
MACRO, /MIGRATION, Alpha Instruction Built-Ins

 *Conan The Librarian (sorry for the slow response - running on an old VAX)

    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.

                                   NOTE

       Be careful when mixing built-ins with VAX MACRO instructions
       on the same registers. The code generated by the compiler
       expects registers to contain 32-bit sign extended values,
       but it is possible to create 64-bit register values that are
       not in this format. Subsequent longword operations on these
       registers could produce incorrect results.

       Therefore, make sure to return registers to 32-bit sign
       extended format before using them in VAX MACRO instructions
       as source operands. (Loading the register with a new value
       using a VAX MACRO instruction (such as MOVL) returns it to
       this format.)

    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.

    It is recommended that you place any built-in within an
    ".IF DF,EVAX"  conditional code block unless the module is Alpha
    specific.

    The following byte and word built-ins are included in the MACRO-
    32 compiler, starting with OpenVMS Alpha Version 7.1:

    o  EVAX_LDBU

    o  EVAX_LDWU

    o  EVAX_STB

    o  EVAX_STW

    o  EVAX_SEXTB

    o  EVAX_SEXTW

    The best environment in which to run code that contains the byte
    and word built-ins is on an Alpha computer that implements these
    instructions in hardware. If you run such code on an OpenVMS
    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 the following 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 bugcheck.
       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

    The following table summarizes the Alpha built-ins supported by
    the compiler.

                                   NOTE

       Memory references in the MACRO-32 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.

    Built-in      Operands      Description

    EVAX_SEXTB    <RQ,WB>       Sign extend byte
    EVAX_SEXTW    <RQ,WW>       Sign extend word
    EVAX_SEXTL    <RQ,WL>       Sign extend longword

    EVAX_LDBU     <WQ,AB>       Load zero-extended byte from memory
    EVAX_LDWU     <WQ,AQ>       Load zero-extended word from memory
    EVAX_LDLL     <WL,AL>       Load longword locked
    EVAX_LDAQ     <WQ,AQ>       Load address of quadword
    EVAX_LDQ      <WQ,AQ>       Load quadword
    EVAX_LDQL     <WQ,AQ>       Load quadword locked
    EVAX_LDQU     <WQ,AQ>       Load unaligned quadword

    EVAX_STB      <RQ,AB>       Store byte from register to memory
    EVAX_STW      <RQ,AW>       Store word from register to memory
    EVAX_STLC     <ML,AL>       Store longword conditional
    EVAX_STQ      <RQ,AQ>       Store quadword
    EVAX_STQC     <MQ,AQ>       Store quadword conditional
    EVAX_STQU     <RQ,AQ>       Store unaligned quadword

    EVAX_ADDQ     <RQ,RQ,WQ>    Quadword add
    EVAX_SUBQ     <RQ,RQ,WQ>    Quadword subtract
    EVAX_MULQ     <RQ,RQ,WQ>    Quadword multiply
    EVAX_UMULH    <RQ,RQ,WQ>    Unsigned quadword multiply high

    EVAX_AND      <RQ,RQ,WQ>    Logical product
    EVAX_OR       <RQ,RQ,WQ>    Logical sum
    EVAX_XOR      <RQ,RQ,WQ>    Logical difference
    EVAX_BIC      <RQ,RQ,WQ>    Bit clear
    EVAX_ORNOT    <RQ,RQ,WQ>    Logical sum with complement
    EVAX_EQV      <RQ,RQ,WQ>    Logical equivalence
    EVAX_SLL      <RQ,RQ,WQ>    Shift left logical
    EVAX_SRL      <RQ,RQ,WQ>    Shift right logical
    EVAX_SRA      <RQ,RQ,WQ>    Shift right arithmetic

    EVAX_EXTBL    <RQ,RQ,WQ>    Extract byte low
    EVAX_EXTWL    <RQ,RQ,WQ>    Extract word low
    EVAX_EXTLL    <RQ,RQ,WQ>    Extract longword low
    EVAX_EXTQL    <RQ,RQ,WQ>    Extract quadword low
    EVAX_EXTBH    <RQ,RQ,WQ>    Extract byte high
    EVAX_EXTWH    <RQ,RQ,WQ>    Extract word high
    EVAX_EXTLH    <RQ,RQ,WQ>    Extract longword high
    EVAX_EXTQH    <RQ,RQ,WQ>    Extract quadword high

    EVAX_INSBL    <RQ,RQ,WQ>    Insert byte low
    EVAX_INSWL    <RQ,RQ,WQ>    Insert word low
    EVAX_INSLL    <RQ,RQ,WQ>    Insert longword low
    EVAX_INSQL    <RQ,RQ,WQ>    Insert quadword low
    EVAX_INSBH    <RQ,RQ,WQ>    Insert byte high
    EVAX_INSWH    <RQ,RQ,WQ>    Insert word high
    EVAX_INSLH    <RQ,RQ,WQ>    Insert longword high
    EVAX_INSQH    <RQ,RQ,WQ>    Insert quadword high

    EVAX_TRAPB    <>            Trap barrier
    EVAX_MB       <>            Memory barrier
    EVAX_RPCC     <WQ>          Read process cycle counter

    EVAX_CMPEQ    <RQ,RQ,WQ>    Integer signed compare, equal
    EVAX_CMPLT    <RQ,RQ,WQ>    Integer signed compare, less than
    EVAX_CMPLE    <RQ,RQ,WQ>    Integer signed compare, less equal
    EVAX_CMPULT   <RQ,RQ,WQ>    Integer unsigned compare, less than
    EVAX_CMPULE   <RQ,RQ,WQ>    Integer unsigned compare, less equal

    EVAX_BEQ      <RQ,AQ>       Branch equal
    EVAX_BLT      <RQ,AQ>       Branch less than
    EVAX_BNE      <RQ,AQ>       Branch not equal

    EVAX_CMOVEQ   <RQ,RQ,WQ>    Conditional move/equal
    EVAX_CMOVNE   <RQ,RQ,WQ>    Conditional move/not equal
    EVAX_CMOVLT   <RQ,RQ,WQ>    Conditional move/less than
    EVAX_CMOVLE   <RQ,RQ,WQ>    Conditional move/less or equal
    EVAX_CMOVGT   <RQ,RQ,WQ>    Conditional move/greater than
    EVAX_CMOVGE   <RQ,RQ,WQ>    Conditional move/greater or equal
    EVAX_CMOVLBC  <RQ,RQ,WQ>    Conditional move/low bit clear
    EVAX_CMOVLBS  <RQ,RQ,WQ>    Conditional move/low bit set

    EVAX_MF_FPCR  <WQ>          Move from floating-point control
                                register
    EVAX_MT_FPCR  <WQ,RQ>       Move to floating-point control
                                register
    EVAX_ZAP      <RQ,RQ,WQ>    Zero bytes
    EVAX_ZAPNOT   <RQ,RQ,WQ>    Zero bytes with NOT mask
  Close     HLB-list     TLB-list     Help  

[legal] [privacy] [GNU] [policy] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.