X86-64 ILI Definitions

Key to ILI Template Listing

ILI Operand Types:

irlnk

link to previous ili with result type ir.

splnk

link to previous ili with result type sp.

dplnk

link to previous ili with result type dp.

arlnk

link to previous ili with result type ar.

krlnk

link to previous ili with result type kr.

qplnk

link to previous ili with result type qp.

cslnk

link to previous ili with result type cs.

cdlnk

link to previous ili with result type cd.

cqlnk

link to previous ili with result type cq.

128lnk

link to previous ili with result type 128.

256lnk

link to previous ili with result type 256.

512lnk

link to previous ili with result type 512.

x87lnk

link to previous ili with result type x87.

lnk

link to previous ili with result type lnk.

ir

integer register number (for x86-64, one of the general purpose registers).

sp

floating-point register number.

dp

double-precision register.

kr

64 bit integer register.

cs

single(4+4 bytes) precision complex register.

cd

double(8+8 bytes) precision complex register.

cq

16x2 bytes complex register.

qp

16x2 bytes register.

128

128 bits register.

256

256 bits register.

512

512 bits register.

x87

80-bit x87 register.

ar

Address register (for x86-64, one of the general purpose registers).

stc

16 bit constant. May be interpreted as either signed or unsigned depending on the machine instruction operand which uses it.

nme

pointer to names table entry for a load or store.

sym

symbol table pointer.

ILI Types (1st attribute of each ILI):

arth

arithmetic operation.

branch

branch operation.

cons

constant.

load

store

define

register define.

proc

function call.

move

register move.

other

Commutivity attribute (2nd attribute of each ILI): .CM comm Commutative operation. .CM null Not commutative.

ILI result type (3rd attribute of each ILI): .RT lnk no result, but ili is pointed-to by link. .RT ir result goes into an integer register. .RT sp result goes into a floating-point register. .RT dp double-precision floating-point. .RT ar address register result. .RT trm this ili does not produce a value and cannot be pointed to by any link operand of another ili.

Other ILI Attributes: .IA dom specifies that this ili is a dominator ili. .IA cse specifies that this ili is a candidate for constant subexpression elimination. An ili is not allowed to have both the cse and the dom attributes. .IA ssenme indicates that this is an sse operation with operand 1 an arlnk field and operand 3 a nme field.

Code Generator ILI Attributes (x86-64 compilers): .CA notCG ili opcode never used within the code generator, though it may process such an ili while linearizing the shared ili form. .CA CGonly ili is created and used only by the code generator. .CA notAILI opcode which should not appear in the AILI (set automatically if notCG is specified). .CA replaceby specifies opcode which replaces this one during linearization. .CA terminal specifies ili for which code_gen is called directly from cgmain. .CA move Indicates aili which can be eliminated if src1 is the same as dest. .CA conditional_branch .CA asm_special during generation of assembly code by the code generator, this opcode is treated as a special case. .CA asm_nop No assembly output is required for this aili.

ILI Definitions

ICON

32-bit integer constant.

The value is pulled from the CONVAL2 field of sym.

Attributes: cons null ir cse .CG “mov” ‘l’direct lat(1)

ACON

Load address constant into address register. 'sym’ must be a symtab ptr to an address constant.

Attributes: cons null ar cse .CG notAILI

ACON_PIC_EXTRN

Address constant used for PIC generation. It represents the load of the address of an external variable from the GOTPCREL table. 'sym’ is the symbol table pointer for the external variable, NOT an address constant symbol.

Attributes: cons null ar cse .CG CGonly “mov” ‘q’ asm_special*direct* lat(1)

  1. ACON_STATIC sym Type: sym

    Used in the linear ili to represent an address constant with a full 64-bit offset. The first sym points to a static or external variable, or a label, and the second to a symbol table 64-bit integer constant.

    Attributes: cons null ar cse .CG CGonly “lea” ‘q’direct lat(2)

ACON_TLS

Load a TLS immediate address 'sym’ must be a symtab ptr to an address constant.

Attributes: cons null ar .CG CGonly “lea” ‘q’ asm_special*direct* lat(1)

ACON_TLS_PIC

Load a TLS address that is stored as a PIC value 'sym’ is the symbol table pointer for the external variable, NOT an address constant symbol.

Attributes: cons null ar .CG CGonly “lea” ‘q’ asm_special*direct* lat(1)

  1. ACON_AUTO sym Type: sym

    Same as ACON_STATIC, but the first sym is a stack variable.

    Attributes: cons null ar cse .CG CGonly “lea” ‘q’direct lat(2)

KCON

64-bit integer constant. ‘sym’ is a symbol table constant of type DT_INT or DT_INT8.

Attributes: cons null kr cse .CG “mov” ‘q’direct lat(1)

  1. ACEXT nme Type: sym

    Label address. 'sym’ is address constant for label symbol. 'nme’ is zero.

    Attributes: cons null ar cse .CG “mov”direct lat(1)

FCON

Single-precision floating-point constant.

Attributes: cons null sp cse .CG “movss” move avx_special*ld* double lat(3)

st direct lat(2)

direct lat(2)

DCON

Double-precision floating-point constant.

Attributes: cons null dp cse .CG “movsd” move avx_special*ld* double fadd fmul fst lat(3)

st direct fst lat(2)

direct fadd fmul lat(2)

SCMPLXCON

Single-precision complex constant.

Attributes: cons null cs cse .CG “movsd” move avx_special*ld* double fadd fmul fst lat(3)

st direct fst lat(2)

direct fadd fmul lat(2)

DCMPLXCON

Double-precision complex constant.

Attributes: cons null cd cse .CG “movapd” move sse_avx*ld* double fadd fmul fst lat(3)

st direct fst lat(2)

direct fadd fmul lat(2)

  1. LD nme stc Type: arlnk

    'arlnk’ points to an address expression.

    'nme’ points to the names table entry of the variable being referenced.

    'stc’ size modifier of the memory operation - one of the MSZ_ macros defined in ili.h. For the code generator, possible values are:

    MSZ_SBYTE signed byte MSZ_UBYTE unsigned byte MSZ_SHWORD signed half-word MSZ_UHWORD unsigned half-word MSZ_SWORD signed word (32-bit) MSZ_UWORD unsigned word

    Attributes: load null ir .CG “mov” move*direct* lat(1)

    ld direct lat(3)

    st direct lat(3)

  2. LDSP nme stc Type: arlnk

    Load single-precision floating value. ‘stc’ is not used.

    Attributes: load null sp .CG “movss” move avx_special*ld* double lat(3)

    st direct lat(2)

    direct lat(2)

  3. LDDP nme stc Type: arlnk

    Load double precision value. ‘stc’ is not used.

    Attributes: load null dp .CG “movsd” move avx_special*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  4. LDSCMPLX nme stc Type: arlnk

    Load single precision complex value. ‘stc’ is not used.

    Attributes: load null cs .CG “movsd” move avx_special*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  5. LDDCMPLX nme stc Type: arlnk

    Load double precision complex value. ‘stc’ is not used.

    Attributes: load null cd .CG “movupd” move sse_avx*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  6. LDQ nme stc Type: arlnk

    Load an __m128 value. ‘stc’ is not used.

    Attributes: load null dp .CG “movapd” move sse_avx*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  7. LDQU nme stc Type: arlnk

    Load an unaligned __m128 value. ‘stc’ is not used.

    Attributes: load null dp .CG “movupd” move sse_avx*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  8. LD256 nme stc Type: arlnk

    Load an __m256 value. ‘stc’ is not used. May generate a LD256U.

    Attributes: load null dp .CG “vmovapd” ‘y’ move avx_only*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  9. LD256A nme stc Type: arlnk

    Load an aligned __m256 value. ‘stc’ is not used. Will generate the aligned case for LD256.

    Attributes: load null dp .CG notAILI

  10. LD256U nme stc Type: arlnk

    Load an unaligned __m256 value. ‘stc’ is not used.

    Attributes: load null dp .CG “vmovupd” ‘y’ move avx_only*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  11. LD512 nme stc Type: arlnk

    Load an __m512 value. ‘stc’ is not used.

    Attributes: load null 512 .CG “vmovupd” ‘z’ move avx_only*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  12. LDA nme Type: arlnk

    Load address register from memory location whose address is represented by op1. For x86-64 compilers, LDA’s are replaced by LDKR’s by cgoptim1.

    Attributes: load null ar .CG notAILI

  13. LDKR nme stc Type: arlnk

    Load 64 bit integer value. ‘stc’ is not used.

    Attributes: load null kr .CG notAILI

INEG

Signed integer32 negate.

Attributes: arth null ir cse .CG memdest ccarith “neg” ‘l’direct lat(4:1)

UINEG

Unsigned integer32 negate.

Attributes: arth null ir cse .CG notCG replaceby INEG

KNEG

Signed integer64 negate.

Attributes: arth null kr cse .CG memdest ccarith “neg” ‘q’direct lat(4:1)

UKNEG

Unsigned integer64 negate.

Attributes: arth null kr cse .CG notCG replaceby KNEG

FNEG

Real*4 negation. This LILI is replaced by an FXOR LILI in cgoptim1.c:lili_peephole_opts_2().

Attributes: arth null sp cse .CG notAILI

DNEG

Real*8 negation. This LILI is replaced by a DXOR LILI in cgoptim1.c:lili_peephole_opts_2().

Attributes: arth null dp cse .CG notAILI

SCMPLXNEG

Complex*8 negation. This LILI is replaced by an SCMPLXXOR LILI in cgoptim1.c:lili_peephole_opts_2().

Attributes: arth null cs cse .CG notAILI

DCMPLXNEG

Complex*16 negation. This LILI is replaced by a DCMPLXXOR LILI in cgoptim1.c:lili_peephole_opts_2().

Attributes: arth null cd cse .CG notAILI

  1. FXOR splnk Type: splnk

    This only appears in the LILIs and AILIs, not in shared ILIs. It is generated in cgoptim1.c:lili_peephole_opts_2() by transforming FNEG( op1 ) into an FXOR LILI in order to negate ‘op1’ by XORing its sign bit with 1. This ILI is specified as non-commutative (i.e. ‘null’, not ‘comm’) for reasons explained in that function.

    Attributes: arth null sp cse .CG CGonly “xorps” sse_avx

  2. DXOR dplnk Type: dplnk

    This only appears in the LILIs and AILIs, not in shared ILIs. It is generated in cgoptim1.c:lili_peephole_opts_2() by transforming DNEG( op1 ) into a DXOR LILI in order to negate ‘op1’ by XORing its sign bit with 1. This ILI is specified as non-commutative (i.e. ‘null’, not ‘comm’) for reasons explained in that function.

    Attributes: arth null dp cse .CG CGonly “xorpd” sse_avx*double* fmul lat(5:3)

  3. SCMPLXXOR cslnk Type: cslnk

    This only appears in the LILIs and AILIs, not in shared ILIs. It is generated in cgoptim1.c:lili_peephole_opts_2() by transforming SCMPLXNEG( op1 ) into an SCMPLXXOR LILI in order to negate ‘op1’ by XORing its sign bits with 1. This ILI is specified as non-commutative (i.e. ‘null’, not ‘comm’) for reasons explained in that function.

    Attributes: arth null cs cse .CG CGonly “xorps” sse_avx

  4. DCMPLXXOR cdlnk Type: cdlnk

    This only appears in the LILIs and AILIs, not in shared ILIs. It is generated in cgoptim1.c:lili_peephole_opts_2() by transforming DCMPLXNEG( op1 ) into a DCMPLXXOR LILI in order to negate ‘op1’ by XORing its sign bits with 1. This ILI is specified as non-commutative (i.e. ‘null’, not ‘comm’) for reasons explained in that function.

    Attributes: arth null cd cse .CG CGonly “xorpd” sse_avx

SCMPLXCONJG

Single-precision complex conjugate.

Attributes: arth null cs cse .CG “xorps” sse_avx asm_special

DCMPLXCONJG

Double-precision complex conjugate.

Attributes: arth null cd cse .CG “xorpd” sse_avx asm_special

IABS

Integer absolute value. Expanded into shift-xor-sub sequence.

Attributes: arth null ir cse .CG notCG

KABS

Integer64 absolute value. Expanded into shift-xor-sub sequence.

Attributes: arth null kr cse .CG notCG

FABS

Real (single-precision) absolute value.

Attributes: arth null sp cse .CG notAILI

  1. FAND splnk Type: splnk

    This is generated either in iliutil.c:addarth() to implement an approximate scalar FSQRT or in cglinear.c:gen_lilis() to compute FABS( op1 ) by clearing ‘op1’s sign bit. This ILI is specified as non-commutative (i.e. ‘null’, not ‘comm’) for the same reason that FXOR is non-commutative.

    Attributes: arth null sp cse .CG “andps” sse_avx*double* fmul lat(5:3)

DABS

Double precision absolute value.

Attributes: arth null dp cse .CG notAILI

  1. DAND dplnk Type: dplnk

    This only appears in the LILIs and AILIs, not in shared ILIs. It is generated in cglinear.c:gen_lilis() by transforming a DABS( op1 ) ILI into a DAND LILI which computes the absolute value of ‘op1’ by clearing its sign bit. This ILI is specified as non-commutative (i.e. ‘null’, not ‘comm’) for the same reason that DXOR is non-commutative.

    Attributes: arth null dp cse .CG CGonly “andpd” sse_avx*direct* fadd lat(5:3)

NOT

32 bit bitwise not.

Attributes: arth null ir cse .CG memdest “not” ‘l’direct lat(4:1)

UNOT

Unsigned bitwise negation of 32 bit bitwise not.

Attributes: arth null ir cse .CG notCG replaceby NOT

KNOT

64 bit bitwise not.

Attributes: arth null kr cse .CG memdest “not” ‘q’direct lat(4:1)

UKNOT

64 bit bitwise not.

Attributes: arth null kr cse .CG notCG replaceby KNOT

FSQRT

Single-precision floating-point square root.

Attributes: arth null sp cse .CG “sqrtss” avx_special*direct* fmul lat(21:19)

DSQRT

Double-precision square root.

Attributes: arth null dp cse .CG “sqrtsd” avx_special*direct* fmul lat(29:27)

FRSQRT

Single-precision floating-point reciprocal square root. 1.0/sqrt(x) – will be replaced by the Newton’s appx via the ALT field

Attributes: arth null sp cse .CG notCG

RCPSS

Single-precision approximation to reciprocal.

Attributes: arth null sp cse .CG “rcpss” avx_special*direct* fmul lat(21:19)

RSQRTSS

Single-precision approximation to reciprocal square root.

Attributes: arth null sp cse .CG “rsqrtss” avx_special*direct* fmul lat(21:19)

  1. CMPNEQSS splnk Type: splnk

    Used for single-precision square root approximation.

    Attributes: arth null sp cse .CG “cmpneqss” sse_avx

FNSIN

Utility ili: only referenced by the ‘alt’ field of an FSIN ili; always points to an FSINCOS ili.

Attributes: arth null sp cse .CG notAILI

DNSIN

Utility ili: only referenced by the ‘alt’ field of an DSIN ili; always points to an DSINCOS ili.

Attributes: arth null dp cse .CG notAILI

FSIN

Single precision floating point sine. Implemented as a function call.

Attributes: arth null sp cse .CG notAILI

DSIN

Double precision sine. Implemented as a function call.

Attributes: arth null dp cse .CG notAILI

FNCOS

Utility ili: only referenced by the ‘alt’ field of an FCOS ili; always points to an FSINCOS ili.

Attributes: arth null sp cse .CG notAILI

DNCOS

Utility ili: only referenced by the ‘alt’ field of an DCOS ili; always points to an DSINCOS ili.

Attributes: arth null dp cse .CG notAILI

FCOS

Single precision floating point cosine. Implemented as library call.

Attributes: arth null sp cse .CG notAILI

DCOS

Double precision cosine. Implemented as library call.

Attributes: arth null dp cse .CG notAILI

FSINCOS

Used to implement SINCOS optimization (single precision).

Attributes: arth null sp cse .CG notAILI

DSINCOS

Used to implement SINCOS optimization (double precision).

Attributes: arth null dp cse .CG notAILI

FTAN

Single-precision floating-point tangent.

Attributes: arth null sp cse .CG notCG

DTAN

Double-precision tangent.

Attributes: arth null dp cse .CG notCG

FLOG

Single-precision floating-point natural logarithm.

Attributes: arth null sp cse .CG notCG

DLOG

Double-precision natural logarithm.

Attributes: arth null dp cse .CG notCG

FLOG10

Single-precision floating-point common logarithm.

Attributes: arth null sp cse .CG notCG

DLOG10

Double-precision common logarithm.

Attributes: arth null dp cse .CG notCG

FEXP

Single-precision floating-point exponential.

Attributes: arth null sp cse .CG notCG

DEXP

Double-precision exponential.

Attributes: arth null dp cse .CG notCG

FACOS

Single-precision floating-point arccosine.

Attributes: arth null sp cse .CG notCG

DACOS

Double-precision arccosine.

Attributes: arth null dp cse .CG notCG

FASIN

Single-precision floating-point arcsine.

Attributes: arth null sp cse .CG notCG

DASIN

Double-precision arcsine.

Attributes: arth null dp cse .CG notCG

FATAN

Single-precision floating-point arctangent.

Attributes: arth null sp cse .CG notCG

DATAN

Double-precision arctangent.

Attributes: arth null dp cse .CG notCG

  1. FATAN2 splnk Type: splnk

    Single-precision floating-point two-argument arctangent.

    Attributes: arth null sp cse .CG notCG

  2. DATAN2 dplnk Type: dplnk

    Double-precision two-argument arctangent.

    Attributes: arth null dp cse .CG notCG

FSINH

Single-precision floating-point hyperbolic sin

Attributes: arth null sp cse .CG notCG

DSINH

Double-precision hyperbolic sin

Attributes: arth null dp cse .CG notCG

FCOSH

Single-precision floating-point hyperbolic cos

Attributes: arth null sp cse .CG notCG

DCOSH

Double-precision hyperbolic cos

Attributes: arth null dp cse .CG notCG

FTANH

Single-precision floating-point hyperbolic tan

Attributes: arth null sp cse .CG notCG

DTANH

Double-precision hyperbolic tan

Attributes: arth null dp cse .CG notCG

  1. FNEWT splnk splnk Type: splnk

    Single-precision floating-point multiply used for single divides. Not used by the x86-64 compilers.

    Attributes: arth null sp cse .CG notCG

  2. DNEWT dplnk dplnk Type: dplnk

    Double-precision floating-point multiply used for double divides. Not used by the x86-64 compilers.

    Attributes: arth null dp cse .CG notCG

NINT

Real NINT.

Attributes: arth null ir cse .CG notCG

KNINT

Real NINT.

Attributes: arth null kr cse .CG notCG

IDNINT

Double NINT.

Attributes: arth null ir cse .CG notCG

KIDNINT

Double NINT.

Attributes: arth null kr cse .CG notCG

  1. ISIGN irlnk Type: irlnk

    Integer sign intrinsic.

    Attributes: arth null ir cse .CG notCG

  2. SIGN splnk Type: splnk

    Real sign.

    Attributes: arth null sp cse .CG notCG

  3. DSIGN dplnk Type: dplnk

    Double sign.

    Attributes: arth null dp cse .CG notCG

  4. IDIM irlnk Type: irlnk

    Integer dim intrinsic.

    Attributes: arth null ir cse .CG notCG

  5. FDIM splnk Type: splnk

    Real dim.

    Attributes: arth null sp cse .CG notCG

  6. DDIM dplnk Type: dplnk

    Double dim.

    Attributes: arth null dp cse .CG notCG

FFLOOR

Real FLOOR.

Attributes: arth null sp cse .CG “roundss” sse_avx

DFLOOR

Double FLOOR.

Attributes: arth null dp cse .CG “roundsd” sse_avx

FCEIL

Real CEILING.

Attributes: arth null sp cse .CG “roundss” sse_avx

DCEIL

Double CEILING.

Attributes: arth null dp cse .CG “roundsd” sse_avx

AINT

Single precision trunction.

Attributes: arth null sp cse .CG notAILI

DINT

Double precision trunction.

Attributes: arth null dp cse .CG notAILI

SCMPLXEXP

Single-precision complex exponential.

Attributes: arth null cs cse .CG notCG

DCMPLXEXP

Double-precision complex exponential.

Attributes: arth null cd cse .CG notCG

SCMPLXCOS

Single-precision complex cosine.

Attributes: arth null cs cse .CG notCG

DCMPLXCOS

Double-precision complex cosine.

Attributes: arth null cd cse .CG notCG

SCMPLXSIN

Single-precision complex sine.

Attributes: arth null cs cse .CG notCG

DCMPLXSIN

Double-precision complex sine.

Attributes: arth null cd cse .CG notCG

SCMPLXTAN

Single-precision complex tangent.

Attributes: arth null cs cse .CG notCG

DCMPLXTAN

Double-precision complex tangent.

Attributes: arth null cd cse .CG notCG

SCMPLXACOS

Single-precision complex arccosine.

Attributes: arth null cs cse .CG notCG

DCMPLXACOS

Double-precision complex arccosine.

Attributes: arth null cd cse .CG notCG

SCMPLXASIN

Single-precision complex arcsine.

Attributes: arth null cs cse .CG notCG

DCMPLXASIN

Double-precision complex arcsine.

Attributes: arth null cd cse .CG notCG

SCMPLXATAN

Single-precision complex arctangent.

Attributes: arth null cs cse .CG notCG

DCMPLXATAN

Double-precision complex arctangent.

Attributes: arth null cd cse .CG notCG

SCMPLXCOSH

Single-precision complex hyperbolic cos.

Attributes: arth null cs cse .CG notCG

DCMPLXCOSH

Double-precision complex hyperbolic cos.

Attributes: arth null cd cse .CG notCG

SCMPLXSINH

Single-precision complex hyperbolic sin.

Attributes: arth null cs cse .CG notCG

DCMPLXSINH

Double-precision complex hyperbolic sin.

Attributes: arth null cd cse .CG notCG

SCMPLXTANH

Single-precision complex hyperbolic tan.

Attributes: arth null cs cse .CG notCG

DCMPLXTANH

Double-precision complex hyperbolic tan.

Attributes: arth null cd cse .CG notCG

SCMPLXLOG

Single-precision complex natural logarithm.

Attributes: arth null cs cse .CG notCG

DCMPLXLOG

Double-precision complex natural logarithm.

Attributes: arth null cd cse .CG notCG

SCMPLXSQRT

Single-precision complex square root.

Attributes: arth null cs cse .CG notCG

DCMPLXSQRT

Double-precision complex square root.

Attributes: arth null cd cse .CG notCG

  1. SCMPLXPOW cslnk Type: cslnk

    Single-precision complex raised to a single-precision complex power.

    Attributes: arth null cs cse .CG notCG

  2. DCMPLXPOW cdlnk Type: cdlnk

    Double-precision complex raised to a double-precision complex power.

    Attributes: arth null cd cse .CG notCG

  3. SCMPLXPOWI irlnk Type: cslnk

    Single-precision complex raised to an integer power.

    Attributes: arth null cs cse .CG notCG

  4. DCMPLXPOWI irlnk Type: cdlnk

    Double-precision complex raised to an integer power.

    Attributes: arth null cd cse .CG notCG

  5. SCMPLXPOWK krlnk Type: cslnk

    Single-precision complex raised to an integer power.

    Attributes: arth null cs cse .CG notCG

  6. DCMPLXPOWK krlnk Type: cdlnk

    Double-precision complex raised to an integer power.

    Attributes: arth null cd cse .CG notCG

ITOUI

Integer to unsigned integer conversion. Treated as a nop by linearization.

Attributes: arth null ir cse .CG notCG

UITOI

Unsigned integer to integer conversion. Treated as a nop by linearization.

Attributes: arth null ir cse .CG notCG

IKMV

Signed integer*4 to signed or unsigned integer*8 type conversion.

Attributes: move null kr cse .CG asm_special “movslq” ‘q’ld direct lat(1)

st direct lat(4)

direct lat(1)

  1. PIKMV xmm nme Type: arlnk

    Convert ‘N’ packed signed integer*4 values from ‘arlnk’ into ‘N’ packed signed or unsigned integer*8 values in ‘xmm’, where ‘N’ is 2, 4 or 8 if ‘xmm’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm ssenme .CG terminal “pmovsxdq” sse_avx

  2. PIKMVX xmm Type: xmm

    Convert ‘N’ packed signed integer*4 values from ‘xmm1’ (an xmm or ymm register) into ‘N’ packed signed or unsigned integer*8 values in ‘xmm2’ (an xmm, ymm or zmm register), where ‘N’ is 2, 4 or 8 if ‘xmm2’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm .CG terminal “pmovsxdq” avx_special

UIKMV

Unsigned integer*4 to signed or unsigned integer*8 type conversion.

Attributes: move null kr cse .CG asm_special “movl” ‘q’

  1. PUIKMV xmm nme Type: arlnk

    Convert ‘N’ packed unsigned integer*4 values from ‘arlnk’ into ‘N’ packed signed or unsigned integer*8 values in ‘xmm’, where ‘N’ is 2, 4 or 8 if ‘xmm’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm ssenme .CG terminal “pmovzxdq” sse_avx

  2. PUIKMVX xmm Type: xmm

    Convert ‘N’ packed unsigned integer*4 values from ‘xmm1’ (an xmm or ymm register) into ‘N’ packed signed or unsigned integer*8 values in ‘xmm2’ (an xmm, ymm or zmm register), where ‘N’ is 2, 4 or 8 if ‘xmm2’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm .CG terminal “pmovzxdq” avx_special

KIMV

Signed or unsigned integer*8 to signed or unsigned integer*4 type conversion with truncation. Note, we mustn’t treat this as a move for the purposes of register allocation.

Attributes: move null ir cse .CG “mov” ‘l’direct lat(1)

ld direct lat(3)

st direct lat(3)

  1. PKIMVX xmm Type: xmm

    Truncate ‘N’ packed signed or unsigned integer*8 values from ‘xmm1’ (an xmm, ymm or zmm register) into ‘N’ packed signed or unsigned integer*4 values in ‘xmm2’ (an xmm or ymm register), where ‘N’ is 2, 4 or 8 if ‘xmm1’ is an xmm, ymm or zmm register respectively. This instruction requires support for AVX-512F and AVX-512VL, and the source operand must be a register (unusually for AVX instructions the destination can be a memory operand!).

    Attributes: other null trm .CG terminal “vpmovqd” avx_only avx_special

IAMV

Move an integer reg into an address reg. Sign extension required?

Attributes: move null ar cse .CG notCG replaceby IKMV

AIMV

Move an address register to a integer register. Truncation required.

Attributes: move null ir cse .CG notCG replaceby KIMV

KAMV

Move an 64 bit integer reg into an address reg. Treated as a nop by Linearize.

Attributes: move null ar cse .CG notCG

AKMV

Move an address register to a 64 bit integer register. Treated as a nop in Linearize.

Attributes: move null kr cse .CG notCG

MOVSB

Load a signed byte into a 32 or 64 bit register.

Attributes: move null ir .CG CGonly asm_special “movsb” ‘l’

MOVSBQ

Load a signed byte into a 64 bit register. (JHM, 1 Oct 2013: Redundant?)

Attributes: move null kr .CG CGonly asm_special “movsb” ‘q’

  1. PMOVSB xmm nme Type: arlnk

    Convert ‘N’ packed signed byte values from ‘arlnk’ into ‘N’ packed integer*4 values in ‘xmm’, where ‘N’ is 4, 8 or 16 if ‘xmm’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm ssenme .CG terminal “pmovsxbd” sse_avx

  2. PMOVSBX xmm Type: xmm

    Convert ‘N’ packed signed byte values from ‘xmm1’ (an xmm register) into ‘N’ packed integer*4 values in ‘xmm2’ (an xmm, ymm or zmm register), where ‘N’ is 4, 8 or 16 if ‘xmm2’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm .CG terminal “pmovsxbd” avx_special

MOVZB

Load an unsigned byte into a 32 or 64 bit register.

Attributes: move null ir .CG CGonly asm_special “movzb” ‘l’

MOVZBQ

Load an unsigned byte into a 64 bit register. (JHM, 1 Oct 2013: Redundant?)

Attributes: move null kr .CG CGonly asm_special “movzb” ‘q’

  1. PMOVZB xmm nme Type: arlnk

    Convert ‘N’ packed unsigned byte values from ‘arlnk’ into ‘N’ packed integer*4 values in ‘xmm’, where ‘N’ is 4, 8 or 16 if ‘xmm’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm ssenme .CG terminal “pmovzxbd” sse_avx

  2. PMOVZBX xmm Type: xmm

    Convert ‘N’ packed unsigned byte values from ‘xmm1’ (an xmm register) into ‘N’ packed integer*4 values in ‘xmm2’ (an xmm, ymm or zmm register), where ‘N’ is 4, 8 or 16 if ‘xmm2’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm .CG terminal “pmovzxbd” avx_special

MOVSW

Load a signed integer*2 value into a 32 or 64 bit register.

Attributes: move null ir .CG CGonly asm_special “movsw” ‘l’

MOVSWQ

Load a signed integer*2 value into a 64 bit register. (JHM, 1 Oct 2013: Redundant?)

Attributes: move null kr .CG CGonly asm_special “movsw” ‘q’

  1. PMOVSW xmm nme Type: arlnk

    Convert ‘N’ packed signed integer*2 values from ‘arlnk’ into ‘N’ packed integer*4 values in ‘xmm’, where ‘N’ is 4, 8 or 16 if ‘xmm’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm ssenme .CG terminal “pmovsxwd” sse_avx

  2. PMOVSWX xmm Type: xmm

    Convert ‘N’ packed signed integer*2 values from ‘xmm1’ (an xmm or ymm register) into ‘N’ packed integer*4 values in ‘xmm2’ (an xmm, ymm or zmm register), where ‘N’ is 4, 8 or 16 if ‘xmm2’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm .CG terminal “pmovsxwd” avx_special

MOVZW

Load an unsigned integer*2 value into a 32 or 64 bit register.

Attributes: move null ir .CG CGonly asm_special “movzw” ‘l’

MOVZWQ

Load an unsigned integer*2 value into a 64 bit register. (JHM, 1 Oct 2013: Redundant?)

Attributes: move null kr .CG CGonly asm_special “movzw” ‘q’

  1. PMOVZW xmm nme Type: arlnk

    Convert ‘N’ packed unsigned integer*2 values from ‘arlnk’ into ‘N’ packed integer*4 values in ‘xmm’, where ‘N’ is 4, 8 or 16 if ‘xmm’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm ssenme .CG terminal “pmovzxwd” sse_avx

  2. PMOVZWX xmm Type: xmm

    Convert ‘N’ packed unsigned integer*2 values from ‘xmm1’ (an xmm or ymm register) into ‘N’ packed integer*4 values in ‘xmm2’ (an xmm, ymm or zmm register), where ‘N’ is 4, 8 or 16 if ‘xmm2’ is an xmm (>= SSE4.1), ymm (>= AVX2) or zmm (AVX-512) register respectively.

    Attributes: other null trm .CG terminal “pmovzxwd” avx_special

FLOAT

Integer*4 to real*4 type conversion.

Attributes: arth null sp cse .CG “cvtsi2ss” ‘l’ sse_avx asm_special

PFLOAT

Packed integer*4 to real*4 type conversion. ONLY USED ON x86-64. WE SHOULD DELETE THIS AND USE PSFLOAT INSTEAD.

Attributes: arth null sp cse .CG “cvtdq2ps” ‘l’ sse_avx asm_special

  1. PSFLOAT xmm nme Type: arlnk

    Convert 4 integer*4 values from ‘arlnk’ into 4 real*4 values in ‘xmm’.

    Attributes: other null trm ssenme .CG terminal “cvtdq2ps” sse_avx

  2. PSFLOATX xmm Type: xmm

    Convert 4 integer*4 values from ‘xmm1’ into 4 real*4 values in ‘xmm2’.

    Attributes: other null trm .CG terminal “cvtdq2ps” sse_avx

FLOATU

Unsigned integer*4 to real*4 type conversion. Equivalent to UIKMV + FLOATK combination.

Attributes: arth null sp cse .CG notCG

FLOATK

Integer*8 to real*4 type conversion.

Attributes: arth null sp cse .CG “cvtsi2ss” ‘q’ avx_special

FLOATUK

Unsigned integer*8 to real*4 type conversion.

Attributes: arth null sp cse .CG notAILI

DFLOAT

Integer*4 to real*8 type conversion.

Attributes: arth null dp cse .CG “cvtsi2sd” ‘l’ sse_avx asm_special*ld* direct fst lat(6)

double fst lat(11)

  1. PDFLOAT xmm nme Type: arlnk

    Convert ‘N’ packed signed integer*4 values from ‘arlnk’ into ‘N’ packed real*8 values in ‘xmm’, where ‘N’ is 2, 4 or 8 if ‘xmm’ is an xmm (>= SSE2), ymm (>= AVX) or zmm (AVX-512F) register respectively.

    Attributes: other null trm ssenme .CG terminal “cvtdq2pd” ssedp sse_avx

  2. PDFLOATX xmm Type: xmm

    Convert ‘N’ packed signed integer*4 values from ‘xmm1’ (an xmm or ymm register) into ‘N’ packed real*8 values in ‘xmm2’ (an xmm, ymm or zmm register), where ‘N’ is 2, 4 or 8 if ‘xmm’ is an xmm (>= SSE2), ymm (>= AVX) or zmm (AVX-512F) register respectively.

    Attributes: other null trm .CG terminal “cvtdq2pd” ssedp avx_special

DFLOATU

Unsigned integer*4 to real*8 type conversion. Equivalent to UIKMV + DFLOATK combination.

Attributes: arth null dp cse .CG notCG

DFLOATK

Integer*8 to real*8 type conversion.

Attributes: arth null dp cse .CG “cvtsi2sd” ‘q’ avx_special*ld* direct fst lat(6)

double fst lat(11)

DFLOATUK

Unsigned integer*8 to real*8 type conversion.

Attributes: arth null dp cse .CG notAILI

  1. PDFLOATK xmm nme Type: arlnk

    AVX512-DQ instruction to convert packed integer*8 values from ‘arlnk’ into real*8 values in ‘xmm’.

    Attributes: other null trm ssenme .CG terminal notAILI

  2. PDFLOATKX xmm Type: xmm

    AVX512-DQ instruction to convert packed integer*8 values from ‘xmm1’ into real*8 values in ‘xmm2’.

    Attributes: other null trm .CG terminal notAILI

FIX

Real*4 to integer*4 type conversion.

Attributes: arth null ir cse .CG “cvttss2si” ‘l’ sse_avx asm_special*ld* vector fst lat(10)

double fst lat(9)

UFIX

Real*4 to unsigned integer*4 type conversion. Equivalent to FIXK + KIMV combination.

Attributes: arth null ir .CG notCG

  1. PSFIX xmm nme Type: arlnk

    Convert 4 real*4 values from ‘arlnk’ into 4 integer*4 values in ‘xmm’.

    Attributes: other null trm ssenme .CG terminal “cvttps2dq” sse_avx

  2. PSFIXX xmm Type: xmm

    Convert 4 real*4 values from ‘xmm1’ into 4 integer*4 values in ‘xmm2’.

    Attributes: other null trm .CG terminal “cvttps2dq” sse_avx

FIXK

Real*4 to integer*8 type conversion.

Attributes: arth null kr cse .CG “cvttss2si” ‘q’ sse_avx asm_special*ld* vector fst lat(10)

double fst lat(9)

FIXUK

Real*4 to unsigned integer*8 type conversion. Implemented as a QJSR.

Attributes: arth null kr cse .CG notCG

DFIX

Real*8 to integer*4 type conversion.

Attributes: arth null ir cse .CG “cvttsd2si” ‘l’ sse_avx asm_special*double* fst lat(9)

ld vector fadd fmul fstore lat(10)

DFIXU

Real*8 to unsigned integer*4 type conversion. Equivalent to DFIXK + KIMV combination.

Attributes: arth null ir cse .CG notCG

  1. PDFIX xmm nme Type: arlnk

    Convert 2 real*8 values from ‘arlnk’ into 2 integer*4 values in the low half of ‘xmm’.

    Attributes: other null trm ssenme .CG terminal “cvttpd2dq” avx_special

  2. PDFIXX xmm Type: xmm

    Convert 2 real*8 values from ‘xmm1’ into 2 integer*4 values in the low half of ‘xmm2’.

    Attributes: other null trm .CG terminal “cvttpd2dq” avx_special

DFIXK

Real*8 to to integer*8 type conversion.

Attributes: arth null kr cse .CG “cvttsd2si” ‘q’ sse_avx asm_special*double* fst lat(9)

ld vector fadd fmul fstore lat(10)

DFIXUK

Real*8 to unsigned integer*8 type conversion. Implemented as a QJSR.

Attributes: arth null kr cse .CG notCG

SNGL

Real*8 to real*4 type conversion.

Attributes: arth null sp cse .CG “cvtsd2ss” avx_special

  1. PSNGL xmm nme Type: arlnk

    Convert 2 real*8 values from ‘arlnk’ into 2 real*4 values in the low half of ‘xmm’.

    Attributes: other null trm ssenme .CG terminal “cvtpd2ps” avx_special*vector* lat(10)

  2. PSNGLX xmm Type: xmm

    Convert 2 real*8 values from ‘xmm1’ into 2 real*4 values in the low half of ‘xmm2’.

    Attributes: other null trm .CG terminal “cvtpd2ps” avx_special*vector* lat(8)

DBLE

Real*4 to real*8 type conversion.

Attributes: arth null dp cse .CG “cvtss2sd” avx_special

  1. PDBLE xmm nme Type: arlnk

    Convert ‘N’ packed real*4 values from ‘arlnk’ into ‘N’ packed real*8 values in ‘xmm’, where ‘N’ is 2, 4 or 8 if ‘xmm’ is an xmm (>= SSE2), ymm (>= AVX) or zmm (AVX-512F) register respectively.

    Attributes: other null trm ssenme .CG terminal “cvtps2pd” ssedp sse_avx*double* lat(5)

  2. PDBLEX xmm Type: xmm

    Convert ‘N’ packed real*4 values from ‘xmm1’ (an xmm or ymm register) into ‘N’ packed real*8 values in ‘xmm2’ (an xmm, ymm or zmm register), where ‘N’ is 2, 4 or 8 if ‘xmm’ is an xmm (>= SSE2), ymm (>= AVX) or zmm (AVX-512F) register respectively.

    Attributes: other null trm .CG terminal “cvtps2pd” ssedp avx_special*double* lat(3)

IR2SP

Copy an integer*4 value from a ‘gp’ register to an ‘xmm’ register without type conversion. The upper 12 bytes of the ‘xmm’ register are zeroed.

Attributes: arth null sp cse .CG “movd” ‘l’ sse_avx asm_special

KR2SP

To be eliminated?

Attributes: arth null sp .CG notCG

KR2DP

Copy an integer*8 value from a ‘gp’ register to an ‘xmm’ register without type conversion. The upper 8 bytes of the ‘xmm’ register are zeroed.

Attributes: arth null dp .CG ‘q’ sse_avx asm_special

KR2CS

Copy an integer*8 value from a ‘gp’ register to an ‘xmm’ register without type conversion. The upper 8 bytes of the ‘xmm’ register are zeroed.

Attributes: arth null cs .CG ‘q’ sse_avx asm_special

SP2IR

Copy a real*4 value from an ‘xmm’ register to a ‘gp’ register without type conversion.

Attributes: arth null ir cse .CG “movd” ‘l’ sse_avx asm_special

SP2KR

Not used.

Attributes: arth null kr .CG notCG

DP2KR

Copy a real*8 value from an ‘xmm’ register to a ‘gp’ register without type conversion.

Attributes: arth null kr .CG ‘q’ sse_avx asm_special

CS2KR

Copy a single precision complex from an ‘xmm’ register to a ‘gp’ register without type conversion.

Attributes: arth null kr .CG ‘q’ sse_avx asm_special

  1. ROTL irlnk Type: irlnk

    Attributes: arth null ir cse .CG ccarith “rol” ‘l’

  2. ROTR irlnk Type: irlnk

    Attributes: arth null ir cse .CG ccarith “ror” ‘l’

  3. IADD irlnk Type: irlnk

    Signed integer addition.

    Attributes: arth comm ir cse .CG memdest ccarith “add” ‘l’direct lat(4:1)

  4. UIADD irlnk Type: irlnk

    Unsigned integer addition.

    Attributes: arth comm ir cse .CG memdest ccarith “add” ‘l’direct lat(4:1)

  5. KADD krlnk Type: krlnk

    Signed integer64 addition.

    Attributes: arth comm kr cse .CG memdest ccarith “add” ‘q’direct lat(4:1)

  6. UKADD krlnk Type: krlnk

    Unsigned integer64 addition.

    Attributes: arth comm kr cse .CG notCG replaceby KADD

  7. AADD arlnk stc Type: arlnk

    Address unit add. The stc operand is not used by the x86-64 code generator.

    Attributes: arth null ar cse .CG notCG replaceby KADD

  8. FADD splnk Type: splnk

    Single-precision floating-point addition.

    Attributes: arth comm sp cse .CG “addss” sse_avx*fadd* double lat(6:4)

  9. DADD dplnk Type: dplnk

    Double-precision floating-point addition.

    Attributes: arth comm dp cse .CG “addsd” sse_avx*fadd* direct lat(6:4)

  10. SCMPLXADD cslnk Type: cslnk

    Single-precision complex addition.

    Attributes: arth comm cs cse .CG “addps” sse_avx*double* fadd lat(5:7)

  11. DCMPLXADD cdlnk Type: cdlnk

    Double-precision complex addition.

    Attributes: arth comm cd cse .CG “addpd” sse_avx*double* fadd lat(5:7)

  12. ISUB irlnk Type: irlnk

    Signed 32-bit integer subtraction.

    Attributes: arth null ir cse .CG memdest ccarith “sub” ‘l’direct lat(4:1)

  13. UISUB irlnk Type: irlnk

    Unsigned integer subtract. op1 - op2.

    Attributes: arth null ir cse .CG memdest ccarith “sub” ‘l’direct lat(4:1)

  14. KSUB krlnk Type: krlnk

    Signed integer64 subtraction.

    Attributes: arth null kr cse .CG memdest ccarith “sub” ‘q’direct lat(4:1)

  15. UKSUB krlnk Type: krlnk

    Unsigned integer64 subtraction.

    Attributes: arth null kr cse .CG notCG replaceby KSUB

  16. ASUB arlnk stc Type: arlnk

    Address unit subtract. The stc operand is not used.

    Attributes: arth null ar cse .CG notCG replaceby KSUB

  17. FSUB splnk Type: splnk

    Single-precision floating-point subtraction.

    Attributes: arth null sp cse .CG “subss” sse_avx*direct* fadd lat(6:4)

  18. FSUBR splnk Type: splnk

    Single-precision floating-point subtraction - operands reversed (used by llvect.c as a convenience).

    Attributes: arth null sp cse .CG notCG

  19. DSUB dplnk Type: dplnk

    Double-precision floating-point subtraction.

    Attributes: arth null dp cse .CG “subsd” sse_avx*direct* fadd lat(6:4)

  20. SCMPLXSUB cslnk Type: cslnk

    Single-precision complex subtraction.

    Attributes: arth null cs cse .CG “subps” sse_avx*double* fadd lat(7:5)

  21. DCMPLXSUB cdlnk Type: cdlnk

    Double-precision complex subtraction.

    Attributes: arth null cd cse .CG “subpd” sse_avx*double* fadd lat(7:5)

  22. IMUL irlnk Type: irlnk

    Integer Multiply. It’a a bug to give this opcode the ‘cc’ attribute.

    Attributes: arth comm ir cse .CG “imul” ‘l’ ccmod*direct* lat(7)

  23. UIMUL irlnk Type: irlnk

    Unsigned integer multiply. Same as signed.

    Attributes: arth comm ir cse .CG notCG replaceby IMUL

  24. IMULH irlnk Type: irlnk

    Integer multiply, high 32-bits of product as result

    Attributes: arth comm ir cse .CG “imul” ‘l’ ccmod*direct* lat(7)

  25. UIMULH irlnk Type: irlnk

    Integer multiply, high 32-bits of product as result

    Attributes: arth comm ir cse .CG “mul” ‘l’ ccmod*direct* lat(7)

  26. KMUL krlnk Type: krlnk

    Integer64 Multiply.

    Attributes: arth comm kr cse .CG “imul” ‘q’ ccmod*direct* lat(8)

  27. KMULH krlnk Type: krlnk

    Integer64 Multiply, high 64-bits of product returned.

    Attributes: other comm kr cse .CG “imul” ‘q’ ccmod*direct* lat(8)

  28. UKMUL krlnk Type: krlnk

    Unsigned integer64 Multiply.

    Attributes: arth comm kr cse .CG notCG replaceby KMUL

  29. UKMULH krlnk Type: krlnk

    Integer64 Multiply, high 64-bits of product returned.

    Attributes: other comm kr cse .CG “mul” ‘q’ ccmod*direct* lat(8)

  30. FMUL splnk Type: splnk

    Single-precision floating-point multiply.

    Attributes: arth comm sp cse .CG “mulss” sse_avx*direct* fmul lat(4)

  31. DMUL dplnk Type: dplnk

    Double-precision multiply.

    Attributes: arth comm dp cse .CG “mulsd” sse_avx*direct* fmul lat(6:4)

  32. SCMPLXMUL cslnk Type: cslnk

    Single-complex multiply.

    Attributes: arth comm cs cse .CG sse_avx asm_special

  33. DCMPLXMUL cdlnk Type: cdlnk

    Double-complex multiply.

    Attributes: arth comm cd cse .CG sse_avx asm_special

  34. IDIV irlnk Type: irlnk

    Signed integer divide.

    Attributes: arth null ir cse .CG notCG

  35. UIDIV irlnk Type: irlnk

    Unsigned integer divide.

    Attributes: arth null ir cse .CG notCG

  36. KDIV krlnk Type: krlnk

    Signed integer64 divide.

    Attributes: arth null kr cse .CG notCG

  37. UKDIV krlnk Type: krlnk

    Unsigned integer64 divide.

    Attributes: arth null kr cse .CG notCG

  38. IDIVZ irlnk Type: irlnk

    Signed integer divide where divide by zero does not fault.

    Attributes: arth null ir cse .CG notCG

  39. UIDIVZ irlnk Type: irlnk

    Unsigned integer divide where divide by zero does not fault.

    Attributes: arth null ir cse .CG notCG

  40. KDIVZ krlnk Type: krlnk

    Signed integer64 divide where divide by zero does not fault.

    Attributes: arth null kr cse .CG notCG

  41. UKDIVZ krlnk Type: krlnk

    Unsigned integer64 divide where divide by zero does not fault.

    Attributes: arth null kr cse .CG notCG

  42. IDIVZR irlnk Type: irlnk

    Signed integer divide where the remainder is zero

    Attributes: arth null ir cse .CG notCG

  43. KDIVZR krlnk Type: krlnk

    Signed integer64 divide where the remainder is zero

    Attributes: arth null kr cse .CG notCG

  44. QUOREM irlnk Type: irlnk

    Represents an integer divide and/or mod operation. Use of this ili allows a single divide instruction to both a divide and mod result.

    Attributes: arth null ir cse .CG notAILI ‘l’

  45. KQUOREM krlnk Type: krlnk

    Represents a long divide and/or mod operation. Use of this ili allows a single divide instruction to both a divide and mod result.

    Attributes: arth null kr cse .CG notAILI ‘q’

NIDIV

Signed integer divide that points to QUOREM. Result is in register %eax.

Attributes: arth null ir cse .CG “idiv” ‘l’ ccmod

NUIDIV

Unsigned integer divide that points to QUOREM. Result is in register %eax.

Attributes: arth null ir cse .CG “div” ‘l’ ccmod

NKDIV

Signed integer64 divide that points to QUOREM. Result is in register %rax.

Attributes: arth null kr cse .CG “idiv” ‘q’ ccmod

NUKDIV

Unsigned integer64 divide that points to QUOREM. Result is in register %rax.

Attributes: arth null kr cse .CG “div” ‘q’ ccmod

  1. FDIV splnk Type: splnk

    Single-precision divide.

    Attributes: arth null sp cse .CG “divss” sse_avx*direct* fmul lat(18:16)

  2. FDIVR splnk Type: splnk

    Single-precision divide - operands reversed (used by llvect.c as a convenience).

    Attributes: arth null sp cse .CG notCG

  3. DDIV dplnk Type: dplnk

    Double divide.

    Attributes: arth null dp cse .CG “divsd” sse_avx*direct* fmul lat(22:20)

  4. SCMPLXDIV cslnk Type: cslnk

    Single precision complex divide.

    Attributes: arth null cs cse .CG “divps” sse_avx

  5. DCMPLXDIV cdlnk Type: cdlnk

    Double precision complex divide.

    Attributes: arth null cd cse .CG “divpd” sse_avx

  6. MOD irlnk Type: irlnk

    Integer remainder.

    Attributes: arth null ir cse .CG notCG

  7. UIMOD irlnk Type: irlnk

    Unsigned integer mod.

    Attributes: arth null ir cse .CG notCG

  8. KMOD krlnk Type: krlnk

    Integer64 remainder.

    Attributes: arth null kr .CG notCG

  9. KUMOD krlnk Type: krlnk

    Integer64 remainder.

    Attributes: arth null kr .CG notCG

  10. MODZ irlnk Type: irlnk

    Integer remainder where divide by zero does not fault.

    Attributes: arth null ir cse .CG notCG

  11. UIMODZ irlnk Type: irlnk

    Unsigned integer mod where divide by zero does not fault.

    Attributes: arth null ir cse .CG notCG

  12. KMODZ krlnk Type: krlnk

    Integer64 remainder where divide by zero does not fault.

    Attributes: arth null kr .CG notCG

  13. KUMODZ krlnk Type: krlnk

    Integer64 remainder where divide by zero does not fault.

    Attributes: arth null kr .CG notCG

NMOD

Integer remainder that points to a QUOREM ili. Result is in register %edx.

Attributes: arth null ir cse .CG “idiv” ‘l’ ccmod

NUIMOD

Unsigned integer mod that points to QUOREM ili. Result is in register %edx.

Attributes: arth null ir cse .CG “div” ‘l’ ccmod

NKMOD

Integer remainder that points to a QUOREM ili. Result is in register %rdx.

Attributes: arth null kr cse .CG “idiv” ‘q’ ccmod

NUKMOD

Unsigned integer mod that points to QUOREM ili. Result is in register %rdx.

Attributes: arth null kr cse .CG “div” ‘q’ ccmod

  1. FMOD splnk Type: splnk

    Single-precision mod.

    Attributes: arth null sp cse .CG notCG

  2. DMOD dplnk Type: dplnk

    Double-precision mod.

    Attributes: arth null dp cse .CG notCG

  3. IMAX irlnk Type: irlnk

    Integer maximum value. Expanded in-line by Code Generator.

    Attributes: arth comm ir cse .CG asm_special “cmpl” ‘l’ ccmod

  4. UIMAX irlnk Type: irlnk

    Unsigned integer maximum value. Expanded in-line by Code Generator.

    Attributes: arth comm ir cse .CG notCG

  5. IMIN irlnk Type: irlnk

    Integer minimum value. Expanded in-line by Code Generator.

    Attributes: arth comm ir cse .CG asm_special “cmpl” ‘l’ ccmod

  6. UIMIN irlnk Type: irlnk

    Unsigned integer minimum value. Expanded in-line by Code Generator.

    Attributes: arth comm ir cse .CG notCG

  7. KMAX krlnk Type: krlnk

    Integer64 maximum value. Expanded in-line by Code Generator.

    Attributes: arth comm kr cse .CG asm_special “cmpq” ‘q’ ccmod

  8. UKMAX krlnk Type: krlnk

    Unsigned integer64 maximum value. Expanded in-line by Code Generator.

    Attributes: arth comm kr cse .CG notCG

  9. KMIN krlnk Type: krlnk

    Integer64 minimum value. Expanded in-line by Code Generator.

    Attributes: arth comm kr cse .CG asm_special “cmpq” ‘q’ ccmod

  10. UKMIN krlnk Type: krlnk

    Unsigned integer64 minimum value. Expanded in-line by Code Generator.

    Attributes: arth comm kr cse .CG notCG

  11. FMAX splnk Type: splnk

    Single precision maximum.

    Attributes: arth comm sp cse .CG “maxss” sse_avx*direct* fadd lat(4:2)

  12. FMIN splnk Type: splnk

    Single precision minimum.

    Attributes: arth comm sp cse .CG “minss” sse_avx*direct* fadd lat(4:2)

  13. DMAX dplnk Type: dplnk

    Double precision maximum.

    Attributes: arth comm dp cse .CG “maxsd” sse_avx*direct* fadd lat(4:2)

  14. DMIN dplnk Type: dplnk

    Double precison minimum.

    Attributes: arth comm dp cse .CG “minsd” sse_avx*direct* fadd lat(4:2)

  15. JN splnk Type: irlnk

    float bessel_jn

    Attributes: arth null sp cse .CG notCG

  16. DJN dplnk Type: irlnk

    double bessel_jn

    Attributes: arth null dp cse .CG notCG

  17. YN splnk Type: irlnk

    float bessel_yn

    Attributes: arth null sp cse .CG notCG

  18. DYN dplnk Type: irlnk

    double bessel_yn

    Attributes: arth null dp cse .CG notCG

  19. DFMA dplnk dplnk Type: dplnk

    This opcode is only used in AILIs, not shared or linear ILIs. It represents a scalar double-precision FMA3 or FMA4 instruction which computes:

    dest = <sign> (src1 * src2) <addop> src3

    Either ‘src2’ or ‘src3’, but not both, can be a memory operand, and the other operands are xmm register operands. The values of <sign> (+/-) and <addop> (+/-) are specified by an ‘FMA_…’ flag set in the cc field of the AILI. Since AILIs allow at most 2 source operands, this AILI is always immediately preceded by a USE AILI which specifies the ‘src1’ operand.

    Attributes: arth null dp .CG CGonly asm_special

  20. FFMA splnk splnk Type: splnk

    This is the same as DFMA except that it represents a scalar single precision FMA3 or FMA4 instruction.

    Attributes: arth null sp .CG CGonly asm_special

  21. IPOWI irlnk Type: irlnk

    Integer raised to an integer power.

    Attributes: arth null ir cse .CG notCG

  22. KPOWI irlnk Type: krlnk

    Integer raised to an integer power.

    Attributes: arth null kr cse .CG notCG

  23. KPOWK krlnk Type: krlnk

    Integer raised to an integer power.

    Attributes: arth null kr cse .CG notCG

  24. FPOWI irlnk Type: splnk

    Real raised to an integer power.

    Attributes: arth null sp cse .CG notCG

  25. FPOWK krlnk Type: splnk

    Real raised to an integer power.

    Attributes: arth null sp cse .CG notCG

  26. FPOWF splnk Type: splnk

    Real raised to a real power.

    Attributes: arth null sp cse .CG notCG

  27. DPOWI irlnk Type: dplnk

    Double raised to a integer power.

    Attributes: arth null dp cse .CG notCG

  28. DPOWK krlnk Type: dplnk

    Double raised to a integer power.

    Attributes: arth null dp cse .CG notCG

  29. DPOWD dplnk Type: dplnk

    Double raised to a double power.

    Attributes: arth null dp cse .CG notCG

  30. ICMP irlnk stc Type: irlnk

    Integer compare with result of true or false. For C the value of true is 1, and for Fortran, -1. 'stc’ denotes condition code, as for the ICJMP ili. Due to problems when this operation is used with SELECT ili, it is not given the ‘cse’ attribute.

    Attributes: arth null ir cse .CG asm_special “cmpl” ‘l’ ccmod*direct* lat(4:1)

  31. UICMP irlnk stc Type: irlnk

    Unsigned integer compare.

    Attributes: arth null ir cse .CG notAILI ‘l’

  32. KCMP krlnk stc Type: krlnk

    Integer64 compare with result of true or false. Conditions are same as ICJMP ILI.

    Attributes: arth null ir cse .CG notAILI “cmpq” ‘q’direct lat(4:1)

  33. UKCMP krlnk stc Type: krlnk

    Integer compare with result of true or false. Conditions are same as ICJMP ILI.

    Attributes: arth null ir cse .CG notAILI ‘q’

  34. ACMP arlnk stc Type: arlnk

    Address compare with result of true or false. The conditions (stc) are the same as for ICMP.

    Attributes: arth null ir cse .CG notCG replaceby UKCMP

  35. FCMP splnk stc Type: splnk

    Single float compare with result of true or false.

    Attributes: arth null ir cse .CG asm_special “ucomiss” ccmod sse_avx*vector* lat(6:4)

  36. DCMP dplnk stc Type: dplnk

    Double precision compare with result of true or false.

    Attributes: arth null ir cse .CG asm_special “ucomisd” ccmod sse_avx*vector* fadd lat(5:4)

  37. SCMPLXCMP dplnk stc Type: dplnk

    Single precision complex compare with result of true or false.

    Attributes: arth comm ir cse .CG asm_special “ucomisd” ccmod sse_avx*vector* fadd lat(5:4)

  38. DCMPLXCMP dplnk stc Type: dplnk

    Double precision complex compare with result of true or false.

    Attributes: arth comm ir cse .CG asm_special “ucomisd” ccmod sse_avx*vector* fadd lat(5:4)

  39. ICMPZ stc Type: irlnk

    Integer compare with zero. Conditions are same as ICJMP ILI.

    Attributes: arth null ir cse .CG notAILI ‘l’

  40. UICMPZ stc Type: irlnk

    Unsigned integer compare with zero.

    Attributes: arth null ir cse .CG notAILI ‘l’

  41. KCMPZ stc Type: krlnk

    Integer64 compare with zero; returns integer value. Conditions are same as ICJMP ILI.

    Attributes: arth null ir cse .CG notAILI ‘q’

  42. UKCMPZ stc Type: krlnk

    Integer64 compare with zero. Conditions are same as ICJMP ILI.

    Attributes: arth null ir cse .CG notAILI ‘q’

  43. ACMPZ stc Type: arlnk

    Address compare with zero. The conditions (stc) are the same as for ICMP.

    Attributes: arth null ir cse .CG notCG replaceby UKCMPZ

  44. FCMPZ stc Type: splnk

    Single float compare with zero; result is TRUE or FALSE.

    Attributes: arth null ir cse .CG notCG

  45. DCMPZ stc Type: dplnk

    Double precision compare with zero.

    Attributes: arth null ir cse .CG notCG

  46. QCMPZ stc Type: qplnk

    Quad precision compare with zero.

    Attributes: arth null ir cse .CG notCG

  47. TEST irlnk Type: irlnk

    Compare register value with 0.

    Attributes: arth comm ir cse .CG CGonly “testl” cclogical ‘l’ asm_special*direct* lat(4:1)

  48. KTEST krlnk Type: krlnk

    Compare register value with 0.

    Attributes: arth comm ir cse .CG CGonly “testq” cclogical ‘q’ asm_special*direct* lat(4:1)

  49. ISELECT irlnk irlnk Type: irlnk

    Select either the 2nd or 3rd operand value based on the comparison operation pointed to by the 1st operand.

    Attributes: other null ir cse .CG notAILI ‘l’

  50. KSELECT krlnk krlnk Type: irlnk

    Attributes: other null kr cse .CG notAILI ‘q’

  51. ASELECT arlnk arlnk Type: irlnk

    Attributes: other null ar cse .CG notCG replaceby KSELECT

  52. FSELECT splnk splnk Type: irlnk

    Attributes: other null sp cse .CG notAILI

  53. DSELECT dplnk dplnk Type: irlnk

    Attributes: other null dp cse .CG notAILI

  54. CSSELECT cslnk cslnk Type: irlnk

    Attributes: other null cs cse .CG notAILI

  55. CDSELECT cdlnk cdlnk Type: irlnk

    Attributes: other null cd cse .CG notAILI

  56. AND irlnk Type: irlnk

    Bitwise 32-bit ‘and’ operation.

    Attributes: arth comm ir cse .CG memdest cclogical “and” ‘l’direct lat(4:1)

  57. KAND krlnk Type: krlnk

    Bitwise 64-bit ‘and’ operation.

    Attributes: arth comm kr .CG memdest cclogical “and” ‘q’direct lat(4:1)

  58. OR irlnk Type: irlnk

    Bitwise 32-bit ‘or’ operation.

    Attributes: arth comm ir cse .CG memdest cclogical “or” ‘l’direct lat(4:1)

  59. KOR krlnk Type: krlnk

    Bitwise 64-bit ‘or’ operation.

    Attributes: arth comm kr .CG memdest cclogical “or” ‘q’direct lat(4:1)

  60. XOR irlnk Type: irlnk

    Bitwise exclusive-or operation.

    Attributes: arth comm ir cse .CG memdest cclogical “xor” ‘l’direct lat(4:1)

  61. LEQV irlnk Type: irlnk

    Bitwise exclusive-or followed by not operation.

    Attributes: arth comm ir cse .CG memdest cclogical “notxor” ‘l’direct lat(4:1)

  62. KXOR krlnk Type: krlnk

    Bitwise 64-bit exclusive-or operation.

    Attributes: arth comm kr .CG memdest cclogical “xor” ‘q’direct lat(4:1)

  63. EQV irlnk Type: irlnk

    Attributes: arth comm ir cse .CG notCG

  64. JISHFT irlnk Type: irlnk

    Shift op1 by op2. Left if op2 is > 0; else right (no sign extension). This ili only shows up for Fortran, specifically for the JISHFT intrinsic. If 2nd operand is compile time constant, this ili will have been replaced by either a left or right shift ili by the Expander. Otherwise, it is implemented as a call to a run-time function.

    Attributes: arth null ir cse .CG notCG

  65. KISHFT krlnk Type: krlnk

    Shift op1 by op2. Left if op2 is > 0; else right (no sign extension). This ili only shows up for Fortran, specifically for the KISHFT intrinsic. If 2nd operand is compile time constant, this ili will have been replaced by either a left or right shift ili by the Expander. Otherwise, it is implemented as a call to a run-time function.

    Attributes: arth null kr cse .CG notCG

  66. USHIFT irlnk Type: irlnk

    Shift op1 logically by op2. Left if op2 is > 0; else right. This ili should have been replaced before code generator.

    Attributes: arth null ir cse .CG notCG

  67. SHIFTA arlnk Type: irlnk

    Shift op1 logically by op2. Left if op2 is > 0; else right.

    Attributes: arth null ir cse .CG notCG

  68. USHIFTA arlnk Type: irlnk

    Unsigned shift op1 logically by op2. Left if op2 is > 0; else right.

    Attributes: arth null ir cse .CG notCG

  69. LSHIFT irlnk Type: irlnk

    Shift op1 left logically by op2.

    Attributes: arth null ir cse .CG memdest ccarith shiftop asm_special “shl” ‘l’direct lat(4:1)

  70. ULSHIFT irlnk Type: irlnk

    Shift op1 left logically by op2.

    Attributes: arth null ir cse .CG notCG replaceby LSHIFT

  71. LSHIFTI stc Type: irlnk

    Shift left immediate. This opcode used only in Code Generator.

    Attributes: arth null ir cse .CG memdest ccarith shiftop “shl” CGonly ‘l’direct lat(4:1)

  72. KLSHIFTI stc Type: krlnk

    Shift left immediate of 64-bit value.

    Attributes: arth null kr cse .CG memdest ccarith shiftop “shl” CGonly ‘q’direct lat(4:1)

  73. RSHIFT irlnk Type: irlnk

    Shift op1 logically right by op2 (sign extended).

    Attributes: arth null ir cse .CG notCG replaceby ARSHIFT

  74. URSHIFT irlnk Type: irlnk

    Shift op1 logically right by op2 (0 fill).

    Attributes: arth null ir cse .CG memdest ccarith shiftop asm_special “shr” ‘l’direct lat(4:1)

  75. ARSHIFT irlnk Type: irlnk

    Shift op1 arithmetically (sign extended) right by op2. Used for right shifts (>> operator) of signed values.

    Attributes: arth null ir cse .CG memdest ccarith shiftop asm_special “sar” ‘l’direct lat(4:1)

  76. KLSHIFT irlnk Type: krlnk

    Left shift of 64-bit value.

    Attributes: arth null kr cse .CG memdest ccarith shiftop asm_special “shl” ‘q’direct lat(4:1)

  77. KURSHIFT irlnk Type: krlnk

    Zero-fill right shift of 64-bit value.

    Attributes: arth null kr cse .CG memdest ccarith shiftop asm_special “shr” ‘q’direct lat(4:1)

  78. KARSHIFT irlnk Type: krlnk

    Sign-extended right shift of 64-bit value.

    Attributes: arth null kr cse .CG memdest ccarith shiftop asm_special “sar” ‘q’direct lat(4:1)

  79. ILEADZI stc Type: irlnk

    8-/16- bit integer LEADZ intrinsic. The value, 0 or 1, of the second operand indicates 8-bit or 16-bit, respectively.

    Attributes: arth null ir cse

ILEADZ

32-bit integer LEADZ intrinsic.

Attributes: arth null ir cse .CG “lzcnt” ‘l’

KLEADZ

64-bit integer LEADZ intrinsic.

Attributes: arth null kr cse .CG “lzcnt” ‘q’

  1. ITRAILZI stc Type: irlnk

    8-/16- bit integer TRAILZ intrinsic. The value, 0 or 1, of the second operand indicates 8-bit or 16-bit, respectively.

    Attributes: arth null ir cse

ITRAILZ

32-bit integer TRAILZ intrinsic.

Attributes: arth null ir cse .CG “tzcnt” ‘l’

KTRAILZ

64-bit integer TRAILZ intrinsic.

Attributes: arth null kr cse .CG “tzcnt” ‘q’

  1. IPOPCNTI stc Type: irlnk

    8-/16- bit integer POPCNT intrinsic. The value of second operand indicates 8-bit if 0 and 16-bit if 1.

    Attributes: arth null ir cse

IPOPCNT

32-bit integer POPCNT intrinsic.

Attributes: arth null ir cse .CG “popcnt” ‘l’

KPOPCNT

64-bit integer POPCNT intrinsic.

Attributes: arth null kr cse .CG “popcnt” ‘q’

  1. IPOPPARI stc Type: irlnk

    8-/16- bit integer POPPAR intrinsic. The value of second operand indicates 8-bit if 0 and 16-bit if 1.

    Attributes: arth null ir cse

IPOPPAR

32-bit integer POPPAR intrinsic.

Attributes: arth null ir cse

KPOPPAR

64-bit integer POPPAR intrinsic.

Attributes: arth null kr cse

  1. EXTRACT stc stc Type: irlnk

    Note that this ILI is defined for machines with bit field extract HW support (e.g. 88000). The two stc operand definitions are architecture DEPENDENT.

    Attributes: arth null ir cse .CG notCG

JMP

Unconditional jump to indicated label.

Attributes: branch null trm dom .CG terminal “jmp”direct lat(4:1)

JMPA

Branch indirect. Fortran only.

Attributes: branch null trm dom .CG terminal “jmp” asm_special*direct* lat(4:1)

  1. JMPM irlnk sym sym Type: irlnk

    Indexed jump from a memory table of jump addresses. irlnk1 - integer index expression.

    irlnk2 - table_size

    sym - label for memory table containing addresses

    sym - default label

    Attributes: branch null trm dom .CG terminal asm_special ‘l’

  2. JMPMK irlnk sym sym Type: krlnk

    Indexed jump using a 64-bit integer as index value.

    Attributes: branch null trm dom .CG terminal notAILI ‘q’

  3. JMPT irlnk Type: irlnk

    NOT USED. Indexed jump into a table of jump instructions.

    irlnk1 - integer index expression. The expression has
    already been normalized to 1 (the value 0 is
    reserved for the “default” jump). If the expression
    is not in the range 1:(n-1) where n is the jump table
    size, the default jump is taken.
    irlnk2 - table_size (includes the default label).

    Attributes: branch null trm dom .CG notCG

  4. QSWITCH lnk stc Type: sym

    Attributes: proc null lnk dom .CG notCG

  5. ICJMP irlnk stc sym Type: irlnk

    Integer compare and jump to the label ‘sym’ if the condition, denoted by stc, is true. Allowed values of stc:

    1 = CC_EQ (jump if equal) 2 = CC_NE (jump if not equal) 3 = CC_LT (jump if less than) 4 = CC_GE (jump if greater than or equal to) 5 = CC_LE (jump if less than or equal to) 6 = CC_GT (jump if greater than)

    Attributes: branch null trm dom .CG terminal notAILI ‘l’ conditional_branch

  6. UICJMP irlnk stc sym Type: irlnk

    Unsigned integer compare and jump to the label ‘sym’ if the condition, denoted by stc, is true. Conditions same as for ICJMP.

    Attributes: branch null trm dom .CG terminal notAILI ‘l’ conditional_branch

  7. KCJMP krlnk stc sym Type: krlnk

    integer64 compare and jump to the label ‘sym’ if the condition, denoted by stc, is true: The same conditions as ICJMP

    Attributes: branch null trm dom .CG terminal notAILI ‘q’ conditional_branch

  8. UKCJMP krlnk stc sym Type: krlnk

    unsigned integer64 compare and jump to the label ‘sym’ if the condition, denoted by stc, is true: The same conditions as ICJMP

    Attributes: branch null trm dom .CG terminal notAILI ‘q’ conditional_branch

  9. ACJMP arlnk stc sym Type: arlnk

    Address compare and jump to the label ‘sym’ if the condition, denoted by stc, is true: Conditions same as for ICJMP.

    Attributes: branch null trm dom .CG notCG replaceby UKCJMP conditional_branch

  10. FCJMP splnk stc sym Type: splnk

    Single precision compare and jump to the label ‘sym’ if the condition, denoted by stc, is true.

    Attributes: branch null trm dom .CG terminal conditional_branch notAILI

  11. DCJMP dplnk stc sym Type: dplnk

    Double precision compare and jump to the label ‘sym’ if the condition, denoted by stc, is true.

    Attributes: branch null trm dom .CG terminal conditional_branch notAILI

  12. QCJMP qplnk stc sym Type: qplnk

    Quad precision compare and jump to the label ‘sym’ if the condition, denoted by stc, is true.

    Attributes: branch null trm dom .CG terminal conditional_branch notAILI

  13. ICJMPZ stc sym Type: irlnk

    Integer compare with zero and branch to label ‘sym’ - the allowed values (and meanings) for stc are the same as for the ICJMP ILI.

    Attributes: branch null trm dom .CG terminal notAILI ‘l’ conditional_branch

  14. UICJMPZ stc sym Type: irlnk

    Unsigned integer compare with zero and branch to label ‘sym’ - the allowed values (and meanings) for stc are the same as for the ICJMP ILI.

    Attributes: branch null trm dom .CG terminal notAILI ‘l’ conditional_branch

  15. LCJMPZ stc sym Type: irlnk

    Logical compare with zero and branch to label ‘sym’ - the allowed values (and meanings) for stc are the same as for the ICJMP ILI.

    Attributes: branch null trm dom .CG notCG replaceby UICJMPZ conditional_branch

  16. KCJMPZ stc sym Type: krlnk

    Integer64 compare with zero and branch to label ‘sym’ - the allowed values (and meanings) for stc are the same as for the ICJMP ILI.

    Attributes: branch null trm dom .CG terminal notAILI ‘q’ conditional_branch

  17. UKCJMPZ stc sym Type: krlnk

    Integer64 compare with zero and branch to label ‘sym’ - the allowed values (and meanings) for stc are the same as for the ICJMP ILI.

    Attributes: branch null trm dom .CG terminal notAILI ‘q’ conditional_branch

  18. ACJMPZ stc sym Type: arlnk

    Address compare with zero and branch to label ‘sym’ - the allowed values (and meanings) for stc are the same as for the ICJMP ILI.

    Attributes: branch null trm dom .CG notCG replaceby UKCJMPZ conditional_branch

  19. FCJMPZ stc sym Type: splnk

    Single compare with zero and branch to label ‘sym’.

    Attributes: branch null trm dom .CG notCG conditional_branch

  20. DCJMPZ stc sym Type: dplnk

    Double compare with zero and branch to label ‘sym’.

    Attributes: branch null trm dom .CG notCG conditional_branch

  21. QCJMPZ stc sym Type: qplnk

    quad compare with zero and branch to label ‘sym’.

    Attributes: branch null trm dom .CG notCG conditional_branch

JCC

Conditional jump based on immediately preceding compare operation. Used only in the AILI.

Attributes: branch null trm dom .CG CGonly asm_special conditional_branch*direct* lat(1)

CSEIR

Integer register cse (common subexpression). The ILI located by the cse ILI is one whose value is to be re-used (the ILI need not be “evaluated”). This ILI is used when multiple references of an ILM occur in the same ILM block. The CSE ili are treated as a special case by the linearizer, and never appear in a linear ili block.

Attributes: arth null ir .CG notCG

CSESP

Single precision register cse.

Attributes: arth null sp .CG notCG

CSEDP

Double precision register cse.

Attributes: arth null dp .CG notCG

CSEQP

Quad precision register cse.

Attributes: arth null qp .CG notCG

CSECS

Single precision complex register cse.

Attributes: arth null cs .CG notCG

CSECD

Double precision complex register cse.

Attributes: arth null cd .CG notCG

CSEAR

Address register cse.

Attributes: arth null ar .CG notCG

CSEKR

Integer64 register cse.

Attributes: arth null kr .CG notCG

  1. CSE stc Type: lnk

    Complex cse (common subexpression). The ILI located by the cse ILI is one whose value is to be re-used (the ILI need not be “evaluated”). This ILI is used when multiple references of an ILM occur in the same ILM block. This ili is seen by the code generator but never appears in the linear ili.

    Attributes: arth null ir .CG notCG

APURE

Call a pure function with no arguments and returns an AR value. Will always have an ALT which is the actual call. arlnk is an ACON ili of the function being called.

Attributes: arth null ar cse .CG notCG

  1. APUREA arlnk Type: arlnk

    Call a pure function with one AR argument and returns an AR value. Will always have an ALT which is the actual call. arlnk is an ACON ili of the function being called.

    Attributes: arth null ar cse .CG notCG

  2. APUREI irlnk Type: arlnk

    Call a pure function with one IR argument and returns an AR value. Will always have an ALT which is the actual call. arlnk is an ACON ili of the function being called.

    Attributes: arth null ar cse .CG notCG

IPURE

Call a pure function with no arguments and returns an IR value. Will always have an ALT which is the actual call. arlnk is an ACON ili of the function being called.

Attributes: arth null ir cse .CG notCG

  1. IPUREA arlnk Type: arlnk

    Call a pure function with one AR argument and returns an IR value. Will always have an ALT which is the actual call. arlnk is an ACON ili of the function being called.

    Attributes: arth null ir cse .CG notCG

  2. IPUREI irlnk Type: arlnk

    Call a pure function with one IR argument and returns an IR value. Will always have an ALT which is the actual call. arlnk is an ACON ili of the function being called.

    Attributes: arth null ir cse .CG notCG

REP

Repeat prefix opcode for string operations (such as the following SMOVE). Emitted immediately before an SMOVE operation.

Attributes: other null trm dom .CG CGonly “rep”

  1. GSMOVE arlnk nme nme stc Type: arlnk

    General structure copy. A structure store (SMOVE ILM) is expanded into the GSMOVE ILI; a phase, such as the ACC CG, needs to have the structure assignment presented as a first-class ILI operation. After the last phase requiring GSMOVE, GSMOVE will then be expanded into lower level ILI which will be dependent on target, alignment, small vs large, etc.

    'op1’ is the source address. 'op2’ is the destination address. 'nme1’ is the names table entry for source struct. 'nme2’ is the names table entry for the destination struct. 'stc’ is the dtype of the struct.

    Attributes: other null trm dom .CG notCG

  2. SMOVE arlnk arlnk nme Type: arlnk

    Structure copy.

    'op1’ is the source address. 'op2’ is the destination address. 'op3’ is number of 8-byte units to copy. 'nme’ is names table entry for destination struct.

    Attributes: other null trm dom .CG terminal “movs”

  3. SMOVEJ arlnk nme nme stc Type: arlnk

    Simple structure copy. (MOVS is x86 parlance.) This is used to replace the SMOVEI/SMOVES pair, which was used when the ILI operand count was only 4. 'op1’ is the source address 'op2’ is the destination address 'nme1’ is the names table entry for source struct. 'nme2’ is the names table entry for the destination struct. 'op5’ is actual number of bytes to copy. This gets turned into SMOVE and load/store operations by rm_smove

    Attributes: other null trm dom .CG notCG

  4. XMOVE arlnk nme Type: arlnk

    Structure copy.

    'op1’ is the source address. 'op2’ is the destination address. 'nme’ is names table entry for destination struct.

    Attributes: other null trm dom .CG terminal “movapd” sse_avx

  5. ST arlnk nme stc Type: irlnk

    Store integer value. In ILI, the value to be stored must fit without implicit truncation, i.e. immediately reloading using LD with the same size modifier must reproduce the value that was stored. In LILI or AILI, ST may perform implicit truncation. 'op1’ is a pointer to an ili representing the value being stored.

    'op2’ is a pointer to the address expression of the variable being defined.

    'nme’ is a pointer to a names table entry of the variable being defined.

    'stc’ is the size modifier of the memory operation as described for the LD ili above.

    Attributes: store null trm .CG terminal “mov” move*direct* lat(1)

    ld direct lat(3)

    st direct lat(3)

  6. STSP arlnk nme stc Type: splnk

    Store single precision quantity. ‘stc’ must be MSZ_F4.

    Attributes: store null trm .CG terminal “movss” move avx_special*ld* double lat(3)

    st direct lat(2)

    direct lat(2)

  7. STDP arlnk nme stc Type: dplnk

    Store double precision quantity. ‘stc’ must be MSZ_F8.

    Attributes: store null trm .CG terminal “movsd” move avx_special*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  8. STSCMPLX arlnk nme stc Type: cslnk

    Store single precision complex quantity. ‘stc’ is not used.

    Attributes: store null trm .CG terminal “movsd” move avx_special*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  9. STDCMPLX arlnk nme stc Type: cdlnk

    Store double precision complex quantity. ‘stc’ is not used.

    Attributes: store null trm .CG terminal “movupd” move sse_avx*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  10. STQ arlnk nme stc Type: dplnk

    Store an __m128 quantity. ‘stc’ is not used.

    Attributes: store null trm .CG terminal “movapd” move sse_avx*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  11. STQU arlnk nme stc Type: dplnk

    Store an unaligned __m128 quantity. ‘stc’ is not used.

    Attributes: store null trm .CG terminal “movupd” move sse_avx*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  12. ST256 arlnk nme stc Type: dplnk

    Store an __m256 quantity. ‘stc’ is not used.

    Attributes: store null trm .CG terminal “vmovapd” ‘y’ move avx_only*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  13. ST256U arlnk nme stc Type: dplnk

    Store an unaligned __m256 quantity. ‘stc’ is not used.

    Attributes: store null trm .CG terminal “vmovupd” ‘y’ move avx_only*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  14. ST512 arlnk nme stc Type: 512lnk

    Store an __m512 value. ‘stc’ is not used.

    Attributes: store null trm .CG terminal “vmovupd” ‘z’ move avx_only*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  15. STA arlnk nme Type: arlnk

    Store address quantity inside of op1 into op2. Replaced by ST opcode in cgoptim1.

    Attributes: store null trm .CG terminal notAILI

  16. STRG1 stc Type: arlnk

    Store address quantity inside of op1 argument register described by stc. Used in g++ style thunks when adjusting the *this* pointer, (the first argument) just before jumping through to the function Replaced by ST opcode in cgoptim1.

    Attributes: store null trm .CG terminal notAILI

  17. STKR arlnk nme stc Type: krlnk

    Store 64 bit integer value. ‘stc’ should be MSZ_I8. (There may be legacy cases needing repair where it is zero.) Replaced by ST opcode with size == MSZ_I8 in cgoptim1.

    Attributes: store null trm .CG terminal notAILI

VZST

Special ili created by the vectorizer indicating that the variable whose address is op1 is stored; necessary in cases where the vectorizer replaces assignments with calls. The optimizer will process the ili to create store information and then delete the ili. Code generator will not see this ili.

Attributes: other null trm .CG notCG

  1. JSR lnk Type: sym

    'sym’ is external function or subroutine being called (standard linkage). 'lnk’ points to a list (terminated by NULL) of ARG ili for the arguments.

    Attributes: proc null lnk dom .CG terminal “call” asm_special ccmod

  2. JSRA lnk stc stc Type: arlnk

    JSR to routine whose address is pointed to by arlnk. lnk points to the list of ARG ILIs which represents the arguments. stc1 attribute flag (stdcall in x86) stc2 dtype

    Attributes: proc null lnk dom .CG terminal notAILI

  3. QJSR lnk Type: sym

    Quick (intrinsic) call. 'sym’ is the external procedure being called. 'lnk’ locates the list of arguments (define arg ILI - DAAR, DADR, DADP).

    Attributes: proc null lnk dom .CG terminal “call” asm_special ccmod

  4. GJSR lnk sym Type: sym

    Same as JSR, but the argument list is expressed using the general argument ILI, i.e., before applying the ABI. 'sym2’ is the label to jump to if an exception is thrown, 0 if the call cannot throw, or -1 if there is no cleanup.

    Attributes: proc null lnk dom .CG terminal notCG

  5. GJSRA lnk stc stc sym Type: arlnk

    Same as JSRA, but the argument list is expressed using the general argument ILI, i.e., before applying the ABI.

    Attributes: proc null lnk dom .CG terminal notCG

NULL

Used to mark the end of an argument list for a JSR, QJSR or JSRA ili.

Attributes: other null lnk .CG notAILI

  1. GARG lnk stc nme Type: lnk

    A general argument link, used before applying the ABI 'lnk’ (first) points to the value of the argument. 'lnk’ (second) points to the next ARG ILI. First 'stc’ is the dtype. Second 'stc’ is an NME value, if set, for address arguments.

    Attributes: define null lnk .CG notCG

  2. GARGRET lnk stc nme Type: lnk

    A general argument link representing the return value of the function 'lnk’ (first) points to the value of the argument. 'lnk’ (second) points to the next ARG ILI. 'stc’ is the dtype 'nme’ is the nme

    Attributes: define null lnk .CG notCG

  3. VA_ARG stc Type: arlnk

    va_arg(va_list x, typeof_arg) computes the address of the argument ‘arlnk’ address of the va_list ‘stc’ the dtype of the argument being reference

    Attributes: arth null ar .CG notCG

  4. ARGIR lnk Type: irlnk

    Defines an integer memory argument. 'irlnk’ points to the register value of the argument. 'lnk’ points to the next ARG ILI.

    Attributes: define null lnk .CG memarg “mov” ‘l’direct lat(1)

    ld direct lat(3)

    st direct lat(3)

  5. ARGSP lnk Type: splnk

    Defines a single-precision memory argument. 'splnk’ points to the register value of the argument. 'lnk’ points to the next ARG ILI.

    Attributes: define null lnk .CG memarg “movss” avx_special*ld* double lat(3)

    st direct lat(2)

    direct lat(2)

  6. ARGDP lnk Type: dplnk

    Defines a double precision memory argument. 'dplnk’ points to the register value of the argument. 'lnk’ points to the next ARG ILI.

    Attributes: define null lnk .CG memarg “movsd” avx_special*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  7. ARGAR lnk stc Type: arlnk

    A memory argument of type pointer or struct/union. 'arlnk’ points to the value of the argument. 'lnk’ points to the next ARG ILI. 'stc’ is the dtype if this is a struct arg, else it is 0.

    Attributes: define null lnk .CG memarg “mov” ‘q’ld double fadd fmul fst lat(4)

    st double fst lat(4)

    double fadd fmul lat(2)

  8. ARGKR lnk Type: krlnk

    Defines a 64 bit integer memory argument. 'krlnk’ points to the value of the argument. 'lnk’ points to the next ARG ILI.

    Attributes: define null lnk .CG memarg “mov” ‘q’ld double fadd fmul fst lat(4)

    st double fst lat(4)

    double fadd fmul lat(2)

  9. ARGRSRV lnk Type: stc

    For WINDOWS-ABI - reserve space in memory argument area for register arguments. 'stc’ defines the number of bytes to reserve.

    Attributes: define null lnk .CG memarg notAILI

  10. DAIR ir lnk Type: irlnk

    Define integer argument in general purpose register for a JSR or QJSR.

    Attributes: define null lnk .CG “mov” ‘l’ move*direct* lat(1)

    ld direct lat(3)

    st direct lat(3)

  11. DASP sp lnk Type: splnk

    Define a single precision register argument for a JSR or QJSR.

    Attributes: define null lnk .CG “movss” move avx_special*ld* double lat(3)

    st direct lat(2)

    direct lat(2)

  12. DASPSP dp lnk Type: dplnk

    Define a C struct argument of two floats, passed in the indicated xmm register.

    Attributes: define null lnk .CG “movq” sse_avx*ld* double fadd fmul fst lat(4)

    st double fst lat(4)

    double fadd fmul lat(2)

  13. DACS cs lnk Type: cslnk

    Define a C struct argument of two floats, passed in the indicated xmm register.

    Attributes: define null lnk .CG “movsd” move sse_avx*ld* double fadd fmul fst lat(4)

    st double fst lat(4)

    double fadd fmul lat(2)

  14. DACD cd lnk Type: cdlnk

    Define a C struct argument of two double, passed in the indicated xmm register.

    Attributes: define null lnk .CG “movupd” move sse_avx*ld* double fadd fmul fst lat(4)

    st double fst lat(4)

    double fadd fmul lat(2)

  15. DADP dp lnk Type: dplnk

    Define a double precision argument for a JSR or QJSR.

    Attributes: define null lnk .CG “movsd” move avx_special*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  16. DA128 dp lnk Type: dplnk

    Define an __m128 argument for a JSR or QJSR.

    Attributes: define null lnk .CG “movupd” move sse_avx*ld* double fadd fmul fst lat(4)

    st double fst lat(4)

    double fadd fmul lat(2)

  17. DA256 dp lnk Type: dplnk

    Define an __m256 argument in a ymm register for a JSR or QJSR (AVX only).

    Attributes: define null lnk .CG “vmovupd” ‘y’ move avx_only*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  18. PSARG stc lnk Type: xmm

    Move symbolic register ‘xmm’ into actual register ‘stc’ (typically XR_XMM0 or XR_XMM1) in preparation for call to vector intrinsic function.

    Attributes: define null lnk .CG “movaps” move sse_avx*ld* double lat(4)

    st double lat(3)

    double lat(2)

  19. PDARG stc lnk Type: xmm

    Move symbolic register ‘xmm’ into actual register ‘stc’ (typically XR_XMM0 or XR_XMM1) in preparation for call to vector intrinsic function.

    Attributes: define null lnk .CG “movapd” move ssedp sse_avx*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  20. DAAR ar lnk Type: arlnk

    Define argument in address register for a JSR or QJSR. Lnk1 points to the expression to be moved into the specified (ar2) address register. Lnk3 locates the next argument for the JSR.

    Attributes: define null lnk .CG notCG replaceby DAKR

  21. DAKR kr lnk Type: krlnk

    Define argument in integer64 register for a JSR or QJSR.

    Attributes: define null lnk .CG “mov” ‘q’ move*ld* double fadd fmul fst lat(4)

    st double fst lat(4)

    double fadd fmul lat(2)

  22. DFRIR ir Type: lnk

    Define function result in a integer register.

    Attributes: define null ir cse .CG terminal asm_nop ‘l’

  23. DFRSP sp Type: lnk

    Define single precision function result.

    Attributes: define null sp cse .CG terminal asm_nop

  24. DFRDP dp Type: lnk

    Define double precision function result in an xmm register.

    Attributes: define null dp cse .CG terminal asm_nop

  25. DFRCS cs Type: lnk

    Define single precision complex function result in an xmm register.

    Attributes: define null cs cse .CG terminal asm_nop

  26. DFRCD cd Type: lnk

    Define double precision complex function result in an xmm register.

    Attributes: define null cd cse .CG terminal asm_nop

  27. DFR128 dp Type: lnk

    Define 128-bit function result in an xmm register.

    Attributes: define null dp cse .CG terminal asm_nop

  28. DFR256 dp Type: lnk

    Define 256-bit function result in an ymm register.

    Attributes: define null dp cse .CG terminal asm_nop ‘y’ avx_only

  29. DFRAR ar Type: lnk

    Define function result in an address register. 'op1’ points to one of the JSR ILI.

    Attributes: define null ar cse .CG notCG replaceby DFRKR

  30. DFRKR kr Type: lnk

    Define function result in a integer64 register.

    Attributes: define null kr cse .CG terminal asm_nop ‘q’

  31. STSPSP arlnk nme stc Type: dplnk

    Store the result of a function returning a struct of two floats. dplnk always points to a DFRDP or DPDF ili. stc is always MSZ_F8.

    Attributes: other null trm .CG terminal “movq” ssest sse_avx*ld* double fadd fmul fst lat(4)

    st double fst lat(4)

    double fadd fmul lat(2)

IRDF

Define one of the 64-bit general purpose registers.

Attributes: define null ir cse .CG terminal asm_nop ‘l’

SPDF

Define single precision register (xmm register).

Attributes: define null sp cse .CG terminal asm_nop

DPDF

Define double precision register (xmm register).

Attributes: define null dp cse .CG terminal asm_nop

ARDF

Define address register. (ar is actual register number).

Attributes: define null ar cse .CG notCG replaceby KRDF

KRDF

Define integer64 register.

Attributes: define null kr .CG terminal asm_nop ‘q’

  1. MVIR ir Type: irlnk

    Move integer value into specific integer register, ir.

    Attributes: move null trm .CG terminal notAILI ‘l’

  2. MVSP sp Type: splnk

    This ili represents a single precision function return value. For X86_64, the value is moved into the specified xmm register.

    Attributes: move null trm .CG terminal “movss” move avx_special*ld* double lat(3)

    st direct lat(2)

    direct lat(2)

  3. MVSPSP dp Type: dplnk

    Move two single precision values to the lower 64 bits of the specified xmm register. dplnk always points to a LDDP ili.

    Attributes: move null trm .CG terminal “movq” sse_avx*ld* double fadd fmul fst lat(4)

    st double fst lat(4)

    double fadd fmul lat(2)

  4. SPSP2SCMPLX splnk Type: splnk

    Form a single complex value out of two single precision real values.

    Attributes: other null cs cse .CG “unpcklps” sse_avx asm_special

SPSP2SCMPLXI0

Form a single complex value out of two single precision real values, imaginary part is 0.

Attributes: other null cs cse .CG “unpcklps” sse_avx asm_special

  1. DPDP2DCMPLX dplnk Type: dplnk

    Form a double complex value out of two double precision real values.

    Attributes: other null cd cse .CG “unpcklpd” sse_avx asm_special

DPDP2DCMPLXI0

Form a double complex value out of two double precision real values, imaginary part is 0.

Attributes: other null cd cse .CG “unpcklpd” sse_avx asm_special

SCMPLX2IMAG

Return single precision imaginary part of a single complex value.

Attributes: other null sp cse .CG “movshdup” sse_avx asm_special

DCMPLX2IMAG

Return double precision imaginary part of a double complex value.

Attributes: other null dp cse .CG “unpckhpd” sse_avx asm_special

SCMPLX2REAL

Return single precision real part of a single complex value.

Attributes: other null sp cse .CG “movss” sse_avx asm_special

DCMPLX2REAL

Return double precision real part of a double complex value.

Attributes: other null dp cse .CG “movsd” sse_avx asm_special

  1. MVDP dp Type: dplnk

    This ili represents a double precision function return value. For X86_64, the value is moved into the specified xmm register.

    Attributes: move null trm .CG terminal “movsd” move avx_special*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  2. MVQ dp Type: dplnk

    This ili represents an __m128 function return value. For X86_64, the value is moved into the specified xmm register.

    Attributes: move null trm .CG terminal “movapd” move sse_avx*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  3. MV256 dp Type: dplnk

    This ili represents an __m256 function return value. For X86_64, the value is moved into the specified ymm register.

    Attributes: move null trm .CG terminal “vmovapd” ‘y’ move avx_only*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

MOVSP

Move a single-precision xmm register value.

Attributes: move null sp .CG CGonly “movss” move avx_special*ld* double lat(3)

st direct lat(2)

direct lat(2)

MOVDP

Move a double-precision xmm register value.

Attributes: move null dp .CG CGonly “movsd” move avx_special*ld* double fadd fmul fst lat(3)

st direct fst lat(2)

direct fadd fmul lat(2)

MOVCS

Move a single-precision complex xmm register value.

Attributes: move null cs .CG CGonly “movsd” move avx_special*ld* double lat(3)

st direct lat(2)

direct lat(2)

MOVCD

Move a double-precision complex xmm register value.

Attributes: move null cd .CG CGonly “movupd” move sse_avx*ld* double fadd fmul fst lat(3)

st direct fst lat(2)

direct fadd fmul lat(2)

MOVQP

Move an __m128 xmm register value.

Attributes: move null dp .CG CGonly “movapd” move sse_avx*ld* double fadd fmul fst lat(3)

st direct fst lat(2)

direct fadd fmul lat(2)

MOV256

Move an __m256 ymm register value.

Attributes: move null dp .CG CGonly “vmovapd” ‘y’ move avx_only*ld* double fadd fmul fst lat(3)

st direct fst lat(2)

direct fadd fmul lat(2)

  1. MVAR ar Type: arlnk

    Move address value into specific address register, ar.

    Attributes: move null trm .CG terminal notCG replaceby MVKR

  2. MVKR kr Type: krlnk

    Move integer value into specific integer register, kr.

    Attributes: move null trm .CG terminal notAILI ‘q’

FREEIR

Ensures that the result reg is freed. The FREExx ili are eliminated by the linearizer phase of the code generator.

Attributes: other null trm .CG terminal notAILI

FREESP

Attributes: other null trm .CG terminal notAILI

FREEDP

Attributes: other null trm .CG terminal notAILI

FREECS

Attributes: other null trm .CG terminal notAILI

FREECD

Attributes: other null trm .CG terminal notAILI

FREEAR

Attributes: other null trm .CG terminal notCG replaceby FREEKR

FREEKR

Attributes: other null trm .CG terminal notAILI

  1. FREE stc Type: lnk

    Attributes: other null trm .CG terminal notAILI

ENTRY

Main function entry or fortran ENTRY.

Attributes: other null trm dom .CG terminal asm_nop

EXIT

Exit the procedure.

Attributes: other null trm dom .CG terminal asm_special

ARGSAVE

For varargs/stdargs functions, this ili appears immediately after ENTRY ili. This ili stores the registers which may contain incoming arguments into a stack array where they can be accessed by the varargs/stdarg macros. 'sym’ is a symbol table pointer to the stack array.

Attributes: other null trm dom .CG terminal asm_special “leaq”direct lat(2)

NOP

Null operation - used when a linear ilo is deleted. Also, is the opcode for the head of the aili list.

Attributes: other null trm .CG asm_nop

ASM

Implements C inline assembly code, asm(), feature. Also used as a convenience by the code generator. ‘sym’ is a symbol table pointer to a string constant.

Attributes: other null trm dom .CG terminal asm_special

  1. GASM lnk lnk lnk Type: sym

    Compatible ASM language representation to support asm(). sym - the asm string lnk1 - linked list of generic GASMLNKOs of output expressions lnk2 - linked list of specific GASMLNKI/SP/DP/As of input expressions lnk3 - linked list of generic GASMLNKCs of clobber strings NOTE: For now we add ccmod. In the future we may only want to indicate ccmod if the user specifies “cc” in the clobber list.

    Attributes: other null trm dom .CG terminal asm_special ccmod

  2. GASMCNM sym Type: sym

    Used to represent a symbolic name for a gasm constraint sym - identifier of constraint name. Stored as an int since we only care

    about the name, not its type.

    sym - constraint number

    Attributes: other null trm .CG terminal asm_nop

  3. GASMLNKG nme lnk lnk Type: sym

    generic gasmlnk; sym - descriptor string nme - nme being stored lnk1 - input or output expression lnk2 - next GASMLNKG

    Attributes: other null lnk .CG asm_nop

  4. GASMLNKTYP lnk Type: stc

    generic gasmlnk - stores type stc - base type of expression lnk1 - input or output expression

    Attributes: other null lnk .CG asm_nop

  5. GASMLNKC lnk Type: sym

    sym - descriptor string lnk - next GASMLNKC

    Attributes: other null lnk .CG asm_nop

  6. GASMLNKO nme lnk stc Type: sym

    sym - descriptor string nme - nme being stored lnk - next GASMLNKO stc - dtype of expression

    Attributes: other null lnk .CG “” asm_nop

  7. GASMLNKI nme irlnk lnk Type: sym

    Represents Word reg. sym - descriptor string nme - nme being stored irlnk - the input expression lnk - next specific GASMLNK

    Attributes: other null lnk .CG “” asm_nop

  8. GASMLNKB nme irlnk lnk Type: sym

    Same as GASMLNKI, but represents byte reg sym - descriptor string nme - nme being stored irlnk - the input expression lnk - next specific GASMLNK

    Attributes: other null lnk .CG “” asm_nop

  9. GASMLNKH nme irlnk lnk Type: sym

    Same as GASMLNKI, but represents Half-word reg sym - descriptor string nme - nme being stored irlnk - the input expression lnk - next specific GASMLNK

    Attributes: other null lnk .CG “” asm_nop

  10. GASMLNKKR nme krlnk lnk Type: sym

    Same as GASMLNKI, but represents quad word reg sym - descriptor string nme - nme being stored krlnk - the input expression lnk - next specific GASMLNK

    Attributes: other null lnk .CG “” asm_nop

  11. GASMLNKSP nme splnk lnk Type: sym

    sym - descriptor string nme - nme being stored splnk - the input expression lnk - next specific GASMLNK

    Attributes: other null lnk .CG “” asm_nop

  12. GASMLNKDP nme dplnk lnk Type: sym

    sym - descriptor string nme - nme being stored dplnk - the input expression lnk - next specific GASMLNK

    Attributes: other null lnk .CG “” asm_nop

  13. GASMLNK256 nme dplnk lnk Type: sym

    __m256 sym - descriptor string nme - nme being stored dplnk - the input expression lnk - next specific GASMLNK

    Attributes: other null lnk .CG “” asm_nop

  14. GASMLNKQP nme dplnk lnk Type: sym

    __m128 sym - descriptor string nme - nme being stored dplnk - the input expression lnk - next specific GASMLNK

    Attributes: other null lnk .CG “” asm_nop

  15. GASMLNKA nme arlnk lnk Type: sym

    sym - descriptor string nme - nme being stored arlnk - the input expression lnk - next specific GASMLNK

    Attributes: other null lnk .CG “” asm_nop

  16. GASMLNKS nme arlnk lnk Type: sym

    the operand is a struct sym - descriptor string nme - nme being stored arlnk - the input expression lnk - next specific GASMLNK

    Attributes: other null lnk .CG “” asm_nop

  17. GASMLDI stc nme Type: stc

    word register stc - output argument number, 0..n stc - optional field filled in by CG, this is the constaint used. nme - nme of object we’re loading

    Attributes: other null ir .CG asm_nop

  18. GASMLDH stc nme Type: stc

    half word register stc - output argument number, 0..n stc - optional field filled in by CG, this is the constaint used. nme - nme of object we’re loading

    Attributes: other null ir .CG asm_nop

  19. GASMLDB stc nme Type: stc

    byte register stc - output argument number, 0..n stc - optional field filled in by CG, this is the constaint used. nme - nme of object we’re loading

    Attributes: other null ir .CG asm_nop

  20. GASMLDKR stc nme Type: stc

    quad register stc - output argument number, 0..n stc - optional field filled in by CG, this is the constaint used. nme - nme of object we’re loading

    Attributes: other null kr .CG asm_nop

  21. GASMLDSP stc nme Type: stc

    stc - output argument number, 0..n stc - optional field filled in by CG, this is the constaint used. nme - nme of object we’re loading

    Attributes: other null sp .CG asm_nop

  22. GASMLDDP stc nme Type: stc

    stc - output argument number, 0..n stc - optional field filled in by CG, this is the constaint used. nme - nme of object we’re loading

    Attributes: other null dp .CG asm_nop

  23. GASMLDQP stc nme Type: stc

    128-bit object (typically used for XMM reg) stc - output argument number, 0..n stc - optional field filled in by CG, this is the constaint used. nme - nme of object we’re loading

    Attributes: other null dp .CG asm_nop

  24. GASMLD256 stc nme Type: stc

    256-bit object (typically used for YMM reg) stc - output argument number, 0..n stc - optional field filled in by CG, this is the constaint used. nme - nme of object we’re loading

    Attributes: other null dp .CG asm_nop

  25. GASMLDA stc nme Type: stc

    stc - output argument number, 0..n stc - optional field filled in by CG, this is the constaint used. nme - nme of object we’re loading

    Attributes: other null ar .CG asm_nop

FPSAVE

Store the frame pointer in the location whose address is specified by op1.

Attributes: other null trm dom .CG terminal notAILI

VFENTER

Enter a “function” which will compute the value of an expression used as a variable format field. op1 locates a temporary area used to set up the environment of the expression:

op1+0 – contains the fp to use for the expression op1+4 – where to save the current fp

The code for VFENTER performs the following: 1. save current fp in addr(op1)+4 2. load fp from addr(op1)+0

Attributes: other null trm dom .CG terminal asm_special

  1. VFEXIT irlnk Type: arlnk

    Exit the variable format field function. lnk1 locates the temporary area (see VFENTER). lnk2 is the function return value. The code for VFEXIT performs the following: 1. value of lnk2 –> integer function return register 2. restore fp from addr(lnk1)+4 3. return.

    Attributes: other null trm dom .CG terminal asm_special

  2. PREFETCHNTA stc nme Type: arlnk

    Prefetch cache line. Non-Temporal Access - prefetch in such a way to minimize cache pollution. Second operand, ‘stc’ is not used.

    Attributes: other null trm ssenme .CG terminal “prefetchnta”direct lat(20)

  3. PREFETCHT0 stc nme Type: arlnk

    Prefetch cache line into all cache levels.

    Attributes: other null trm ssenme .CG terminal “prefetcht0”direct lat(20)

  4. PREFETCHW stc nme Type: arlnk

    Prefetch cache line into L1 data cache. Used in anticipation to subsequent store into the cache line.

    Attributes: other null trm ssenme .CG terminal “prefetchw”direct lat(20)

  5. PREFETCH stc nme Type: arlnk

    Prefetch cache line into L1 data cache.

    Attributes: other null trm ssenme .CG terminal “prefetch”direct lat(20)

  6. BPREFETCHI irlnk sym Type: irlnk

    This ILI immediately precedes a sequence of PREFETCHxx ILIs. During linearisation it is replaced by:

    if ( irlnk1 != irlnk2 ) goto sym

    where ‘sym’ is a label which immediately follows the last prefetch in the sequence (at the position marked by an EPREFETCH ILI).

    Attributes: other null trm dom .CG notCG terminal

  7. BPREFETCHK krlnk sym Type: krlnk

    This is the same as BPREFETCHI except that the first two operands are ‘krlnk’s instead of ‘irlnk’s.

    Attributes: other null trm dom .CG notCG terminal

  8. EPREFETCH sym Type: sym

    This ILI immediately follows a sequence of PREFETCHxx ILIs. ‘sym1’ is a label which is the target of the conditional jump from a BPREFETCH ILI. If ( sym2 != sym1 ) then the label ‘sym1’ is immediately preceded by an unconditional jump to ‘sym2’.

    Attributes: other null trm dom .CG terminal asm_special

LABEL

This ILI represents a label ‘sym’ that is within a basic block.

Attributes: other null trm dom .CG terminal asm_special

  1. PSLD xmm nme Type: arlnk

    Load packed real*4 values from address ‘arlnk’ into ‘xmm’. ‘xmm’ may be an xmm, ymm or zmm register and ‘arlnk’ must be 16, 32 or 64-byte aligned respectively.

    Attributes: pload null trm ssenme .CG terminal “movaps” move sse_avx*ld* double lat(4)

    st double lat(3)

    double lat(2)

  2. PDLD xmm nme Type: arlnk

    Load packed real*8 values from address ‘arlnk’ into ‘xmm’. ‘xmm’ may be an xmm, ymm or zmm register and ‘arlnk’ must be 16, 32 or 64-byte aligned respectively.

    Attributes: pload null trm ssenme .CG terminal “movapd” move ssedp sse_avx*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  3. PI4LD xmm nme Type: arlnk

    Load packed integer*4 values from address ‘arlnk’ into ‘xmm’. ‘xmm’ may be an xmm, ymm or zmm register and ‘arlnk’ must be 16, 32 or 64-byte aligned respectively.

    Attributes: pload null trm ssenme .CG terminal “movdqa” move ssedp avx3_special*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  4. PI8LD xmm nme Type: arlnk

    Load packed integer*8 values from address ‘arlnk’ into ‘xmm’. ‘xmm’ may be an xmm, ymm or zmm register and ‘arlnk’ must be 16, 32 or 64-byte aligned respectively.

    Attributes: pload null trm ssenme .CG terminal “movdqa” move ssedp avx3_special*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  5. PILD xmm nme Type: arlnk

    Load packed integer*4 or integer*8 values from address ‘arlnk’ into ‘xmm’. ‘xmm’ may be an xmm, ymm or zmm register and ‘arlnk’ must be 16, 32 or 64-byte aligned respectively.

    Attributes: pload null trm ssenme .CG terminal “movdqa” move ssedp sse_avx*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  6. PSLDU xmm nme Type: arlnk

    Load packed real*4 values from address ‘arlnk’ into ‘xmm’. ‘xmm’ may be an xmm, ymm or zmm register and there are no alignment requirements for ‘arlnk’.

    Attributes: pload null trm ssenme .CG terminal “movups” move sse_avx

  7. PDLDU xmm nme Type: arlnk

    Load packed real*8 values from address ‘arlnk’ into ‘xmm’. ‘xmm’ may be an xmm, ymm or zmm register and there are no alignment requirements for ‘arlnk’.

    Attributes: pload null trm ssenme .CG terminal “movupd” move ssedp sse_avx

  8. PI4LDU xmm nme Type: arlnk

    Load packed integer*4 values from address ‘arlnk’ into ‘xmm’. ‘xmm’ may be an xmm, ymm or zmm register and there are no alignment requirements for ‘arlnk’.

    Attributes: pload null trm ssenme .CG terminal “movdqu” move ssedp avx3_special

  9. PI8LDU xmm nme Type: arlnk

    Load packed integer*8 values from address ‘arlnk’ into ‘xmm’. ‘xmm’ may be an xmm, ymm or zmm register and there are no alignment requirements for ‘arlnk’.

    Attributes: pload null trm ssenme .CG terminal “movdqu” move ssedp avx3_special

  10. PILDU xmm nme Type: arlnk

    Load packed integer*4 or integer*8 values from address ‘arlnk’ into ‘xmm’. ‘xmm’ may be an xmm, ymm or zmm register and there are no alignment requirements for ‘arlnk’.

    Attributes: pload null trm ssenme .CG terminal “movdqu” move ssedp sse_avx

  11. PSMASKLD xmm nme xmm Type: arlnk

    Conditionally load packed real*4 elements from the 16-byte (for xmm) or 32-byte (for ymm) memory location whose starting address is given by ‘arlnk’ into the corresponding elements of the destination register ‘xmm1’, under the control of a mask in ‘xmm2’. The mask bit for each real*4 element is the most significant bit of that element in the mask register ‘xmm2’. If a mask bit is 1 then the corresponding real*4 element is copied from memory to ‘xmm1’, otherwise that element of ‘xmm1’ is set to 0.

    Attributes: pload null trm ssenme .CG terminal “vmaskmovps” avx_only

  12. PDMASKLD xmm nme xmm Type: arlnk

    Conditionally load packed real*8 elements from the 16-byte (for xmm) or 32-byte (for ymm) memory location whose starting address is given by ‘arlnk’ into the corresponding elements of the destination register ‘xmm1’, under the control of a mask in ‘xmm2’. The mask bit for each real*8 element is the most significant bit of that element in the mask register ‘xmm2’. If a mask bit is 1 then the corresponding real*8 element is copied from memory to ‘xmm1’, otherwise that element of ‘xmm1’ is set to 0.

    Attributes: pload null trm ssenme .CG terminal “vmaskmovpd” ssedp avx_only

  13. PSLD_SCALAR xmm nme Type: arlnk

    Move 4-byte scalar value whose address is indicated by arlnk, into least significant word of the 16-byte xmm register indicated by ‘xmm’.

    Attributes: other null trm ssenme .CG terminal “movss” avx_special*ld* double lat(3)

    st direct lat(2)

    direct lat(2)

  14. PSLD_LOWH xmm nme Type: arlnk

    Load 2 single precision values to low half of xmm register. This opcode and the next are used in combination, in place of “movups” due to a Hammer performance penalty for using “movups”.

    Attributes: other null trm ssenme .CG terminal “movlps” avx_special

  15. PSLD_HIGHH xmm nme Type: arlnk

    Load 2 single precision values to high half of xmm register.

    Attributes: other null trm ssenme .CG terminal “movhps” avx_special

  16. PDLD_LOWH xmm nme Type: arlnk

    Load 8 bytes from memory into low half of xmm register denoted by xmm.

    Attributes: other null trm ssenme .CG terminal “movlpd” ssedp avx_special*ld* direct fadd fmul fst lat(4)

    st direct fst lat(2)

  17. PDLD_HIGHH xmm nme Type: arlnk

    Load 8 bytes from memory into high half of xmm register denoted by xmm.

    Attributes: other null trm ssenme .CG terminal “movhpd” ssedp avx_special*ld* direct fadd fmul fst lat(4)

    st direct fst lat(2)

  18. PI1INSERT xmm nme stc Type: arlnk

    SSE4.1 and AVX instruction to load an integer*1 value from ‘arlnk’ and insert it into ‘xmm’ at the byte offset given by ‘stc’.

    Attributes: other null trm ssenme .CG terminal “pinsrb” sse_avx asm_special

  19. PI2INSERT xmm nme stc Type: arlnk

    SSE2 and AVX instruction to load an integer*2 value from ‘arlnk’ and insert it into ‘xmm’ at the word offset given by ‘stc’ (where a ‘word’ is 2 bytes).

    Attributes: other null trm ssenme .CG terminal “pinsrw” sse_avx asm_special

  20. PI4INSERT xmm nme stc Type: arlnk

    SSE4.1 and AVX instruction to load an integer*4 value from ‘arlnk’ and insert it into ‘xmm’ at the dword offset given by ‘stc’ (where a ‘dword’ is 4 bytes).

    Attributes: other null trm ssenme .CG terminal “pinsrd” sse_avx asm_special

  21. PI8INSERT xmm nme stc Type: arlnk

    SSE4.1 and AVX instruction to load an integer*8 value from ‘arlnk’ and insert it into ‘xmm’ at the qword offset given by ‘stc’ (where a ‘qword’ is 8 bytes). This instruction can only be used on x86-64.

    Attributes: other null trm ssenme .CG terminal “pinsrq” sse_avx asm_special

  22. PSST xmm nme Type: arlnk

    Store packed real*4 values from ‘xmm’ to address ‘arlnk’. ‘xmm’ may be an xmm, ymm or zmm register and ‘arlnk’ must be 16, 32 or 64-byte aligned respectively.

    Attributes: pstore null trm ssenme .CG terminal “movaps” move ssest sse_avx*ld* double lat(4)

    st double lat(3)

    double lat(2)

  23. PDST xmm nme Type: arlnk

    Store packed real*8 values from ‘xmm’ to address ‘arlnk’. ‘xmm’ may be an xmm, ymm or zmm register and ‘arlnk’ must be 16, 32 or 64-byte aligned respectively.

    Attributes: pstore null trm ssenme .CG terminal “movapd” move ssedp ssest sse_avx*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  24. PI4ST xmm nme Type: arlnk

    Store packed integer*4 values from ‘xmm’ to address ‘arlnk’. ‘xmm’ may be an xmm, ymm or zmm register and ‘arlnk’ must be 16, 32 or 64-byte aligned respectively.

    Attributes: pstore null trm ssenme .CG terminal “movdqa” move ssedp ssest avx3_special*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  25. PI8ST xmm nme Type: arlnk

    Store packed integer*8 values from ‘xmm’ to address ‘arlnk’. ‘xmm’ may be an xmm, ymm or zmm register and ‘arlnk’ must be 16, 32 or 64-byte aligned respectively.

    Attributes: pstore null trm ssenme .CG terminal “movdqa” move ssedp ssest avx3_special*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  26. PIST xmm nme Type: arlnk

    Store packed integer*4 or integer*8 values from ‘xmm’ to address ‘arlnk’. ‘xmm’ may be an xmm, ymm or zmm register and ‘arlnk’ must be 16, 32 or 64-byte aligned respectively.

    Attributes: pstore null trm ssenme .CG terminal “movdqa” move ssedp ssest sse_avx*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  27. PSSTU xmm nme Type: arlnk

    Store packed real*4 values from ‘xmm’ to address ‘arlnk’. ‘xmm’ may be an xmm, ymm or zmm register and there are no alignment requirements for ‘arlnk’.

    Attributes: pstore null trm ssenme .CG terminal “movups” move ssest sse_avx

  28. PDSTU xmm nme Type: arlnk

    Store packed real*8 values from ‘xmm’ to address ‘arlnk’. ‘xmm’ may be an xmm, ymm or zmm register and there are no alignment requirements for ‘arlnk’.

    Attributes: pstore null trm ssenme .CG terminal “movupd” move ssedp ssest sse_avx

  29. PI4STU xmm nme Type: arlnk

    Store packed integer*4 values from ‘xmm’ to address ‘arlnk’. ‘xmm’ may be an xmm, ymm or zmm register and there are no alignment requirements for ‘arlnk’.

    Attributes: pstore null trm ssenme .CG terminal “movdqu” move ssedp ssest avx3_special

  30. PI8STU xmm nme Type: arlnk

    Store packed integer*8 values from ‘xmm’ to address ‘arlnk’. ‘xmm’ may be an xmm, ymm or zmm register and there are no alignment requirements for ‘arlnk’.

    Attributes: pstore null trm ssenme .CG terminal “movdqu” move ssedp ssest avx3_special

  31. PISTU xmm nme Type: arlnk

    Store packed integer*4 or integer*8 values from ‘xmm’ to address ‘arlnk’. ‘xmm’ may be an xmm, ymm or zmm register and there are no alignment requirements for ‘arlnk’.

    Attributes: pstore null trm ssenme .CG terminal “movdqu” move ssedp ssest sse_avx

  32. PSMASKST xmm nme xmm Type: arlnk

    Conditionally store packed real*4 elements from the source register ‘xmm1’ into the corresponding elements of the 16-byte (for xmm) or 32-byte (for ymm) memory location whose starting address is given by ‘arlnk’, under the control of a mask in ‘xmm2’. The mask bit for each real*4 element is the most significant bit of that element in the mask register ‘xmm2’. If a mask bit is 1 then the corresponding real*4 element is copied from ‘xmm1’ to memory, otherwise that element of memory is left unchanged.

    Attributes: pstore null trm ssenme .CG terminal “vmaskmovps” ssest avx_only

  33. PDMASKST xmm nme xmm Type: arlnk

    Conditionally store packed real*8 elements from the source register ‘xmm1’ into the corresponding elements of the 16-byte (for xmm) or 32-byte (for ymm) memory location whose starting address is given by ‘arlnk’, under the control of a mask in ‘xmm2’. The mask bit for each real*8 element is the most significant bit of that element in the mask register ‘xmm2’. If a mask bit is 1 then the corresponding real*8 element is copied from ‘xmm1’ to memory, otherwise that element of memory is left unchanged.

    Attributes: pstore null trm ssenme .CG terminal “vmaskmovpd” ssedp ssest avx_only

  34. PSSTS xmm nme Type: arlnk

    Streaming store. Store 16 bytes from xmm register denoted by xmm into aligned memory bypassing cache.

    Attributes: pstore null trm ssenme .CG terminal “movntps” move ssest sse_avx

  35. PSSTS_SCALAR xmm nme Type: arlnk

    Scalar streaming store single precision quantity.

    Attributes: other null trm ssenme .CG terminal “movntss” move ssest

  36. SSTS_SCALAR arlnk nme stc Type: splnk

    Scalar streaming store single precision quantity.

    Attributes: store null trm .CG terminal “movntss” move

  37. PDSTS xmm nme Type: arlnk

    Streaming store. Store 16 bytes from xmm register denoted by xmm into aligned memory bypassing cache.

    Attributes: pstore null trm ssenme .CG terminal “movntpd” move ssedp ssest sse_avx

  38. PDSTS_SCALAR xmm nme Type: arlnk

    Scalar streaming store double precision quantity.

    Attributes: other null trm ssenme .CG terminal “movntsd” move ssedp ssest

  39. DSTS_SCALAR arlnk nme Type: dplnk

    Scalar streaming store double precision quantity.

    Attributes: store null trm .CG terminal “movntsd” move

  40. PISTS xmm nme Type: arlnk

    Streaming store. Store 16 bytes, 4 or byte integer, from xmm register denoted by xmm into aligned memory, bypassing cache.

    Attributes: pstore null trm ssenme .CG terminal “movntdq” move ssedp ssest sse_avx

  41. PSST_SCALAR xmm nme Type: arlnk

    Store value from xmm register into 4-byte variable.

    Attributes: other null trm ssenme .CG terminal “movss” move ssest avx_special*ld* double lat(3)

    st direct lat(2)

    direct lat(2)

  42. PDST_LOWH xmm nme Type: arlnk

    Store low half of xmm register into 8-byte memory location.

    Attributes: other null trm ssenme .CG terminal “movsd” move ssedp ssest avx_special*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  43. PDST_HIGHH xmm nme Type: arlnk

    Store high half of xmm register into 8-byte memory location.

    Attributes: other null trm ssenme .CG terminal “movhpd” ssedp ssest avx_special*ld* direct fadd fmul fst lat(4)

    st direct fst lat(2)

  44. PSST_LOWH xmm nme Type: arlnk

    Store 2 single precision values from low half of xmm register. This opcode and the next are used in combination, in place of “movups” due to a Hammer performance penalty for using “movups”.

    Attributes: other null trm ssenme .CG terminal “movlps” ssest avx_special

  45. PSST_HIGHH xmm nme Type: arlnk

    Store 2 single precision values from high half of xmm register.

    Attributes: other null trm ssenme .CG terminal “movhps” ssest avx_special

SFENCE

X86 sfence instruction used in conjunction with streaming stores.

Attributes: other null trm dom .CG terminal “sfence”

  1. PSMOVX xmm Type: xmm

    Move low order 4 byte value of xmm1 into low order 4 bytes of xmm2, without disturbing the other 12 bytes of xmm2.

    Attributes: other null trm .CG terminal “movss” avx_special*ld* double lat(4)

    st double lat(3)

    double lat(2)

  2. PSMOV xmm Type: xmm

    Copy the packed real*4 values from ‘xmm1’ to ‘xmm2’.

    Attributes: other null trm .CG terminal “movaps” move sse_avx*ld* double lat(4)

    st double lat(3)

    double lat(2)

  3. PDMOV xmm Type: xmm

    Copy the packed real*8 values from ‘xmm1’ to ‘xmm2’.

    Attributes: other null trm .CG terminal “movapd” move ssedp sse_avx*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  4. PI4MOV xmm Type: xmm

    Copy the packed integer*4 values from ‘xmm1’ to ‘xmm2’.

    Attributes: other null trm .CG terminal “movdqa” move avx3_special*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  5. PI8MOV xmm Type: xmm

    Copy the packed integer*8 values from ‘xmm1’ to ‘xmm2’.

    Attributes: other null trm .CG terminal “movdqa” move avx3_special*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  6. PIMOV xmm Type: xmm

    Copy the packed integer*4 or integer*8 values from ‘xmm1’ to ‘xmm2’.

    Attributes: other null trm .CG terminal “movdqa” move sse_avx*ld* double fadd fmul fst lat(2)

    st double fst lat(3)

    double fadd fmul lat(2)

  7. MOVSHDUP xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed real*4 values. This sets:

    xmm2(3:0) = [ xmm1(3), xmm1(3), xmm1(1), xmm1(1) ]

    where the subscripts refer to real*4 elements.

    Attributes: other null trm .CG terminal “movshdup” sse_avx

  8. MOVSLDUP xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed real*4 values. This sets:

    xmm2(3:0) = [ xmm1(2), xmm1(2), xmm1(0), xmm1(0) ]

    where the subscripts refer to real*4 elements.

    Attributes: other null trm .CG terminal “movsldup” sse_avx

  9. MOVDDUP xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed real*8 values. This sets:

    xmm2(1:0) = [ xmm1(0), xmm1(0) ]

    where the subscripts refer to real*8 elements.

    Attributes: other null trm .CG terminal “movddup” ssedp sse_avx

  10. PSDFR xmm Type: stc

    Move 16-byte register ‘stc’ containing result of vector intrinsic function, into symbolic register ‘xmm’. ‘stc’ is typically XR_XMM0.

    Attributes: other null trm .CG terminal “movaps” move sse_avx

  11. PDDFR xmm Type: stc

    Move 16-byte register ‘stc’ containing result of vector intrinsic function, into symbolic register ‘xmm’. ‘stc’ is typically XR_XMM0.

    Attributes: other null trm .CG terminal “movapd” move ssedp sse_avx

  12. PSMV_LOW xmm Type: splnk

    Copy a real*4 value into the bottom of an ‘xmm’ register.

    Attributes: other null trm .CG terminal “movss” move avx_special*ld* double lat(3)

    st direct lat(2)

    direct lat(2)

  13. PDMV_LOWH xmm Type: dplnk

    Copy a real*8 value into the low half of an ‘xmm’ register.

    Attributes: other null trm .CG terminal “movlpd” move ssedp avx_special*ld* direct fadd fmul fst lat(4)

    st direct fst lat(2)

  14. PDMV_HIGHH xmm Type: dplnk

    Copy a real*8 value into the high half of an ‘xmm’ register. If the input operand is a register, the “unpcklpd” instruction is used instead.

    Attributes: other null trm .CG terminal “movhpd” ssedp avx_special*ld* direct fadd fmul fst lat(4)

    st direct fst lat(2)

  15. PDMV_DUP xmm Type: dplnk

    Copy a real*8 value into both the low and high halves of an ‘xmm’ register.

    Attributes: other null trm .CG terminal “movddup” ssedp sse_avx*double* fmul lat(4)

  16. PSCMPLXMV_LOWH xmm Type: cslnk

    Copy a complex*8 value into the low half of an ‘xmm’ register.

    Attributes: other null trm .CG terminal “movlps” move avx_special

  17. PDCMPLXMV xmm Type: cdlnk

    Copy a complex*16 value into an ‘xmm’ register.

    Attributes: other null trm .CG terminal “movupd” move sse_avx

  18. PI4MV_LOW xmm Type: irlnk

    Copy an integer*4 value into the bottom of an ‘xmm’ register with zero extension to 16 bytes. E.g. llvect uses this followed by PI4SHUF to store 4 copies of an integer*4 value in an ‘xmm’ register. Typically this is done in the preheader of a vectorised loop to initialise the register for packed integer*4 operations.

    Attributes: other null trm .CG terminal “movd” ‘l’ sse_avx asm_special

  19. PI8MV_LOW xmm Type: krlnk

    Copy an integer*8 value into the low half of an ‘xmm’ register with zero extension to 16 bytes. E.g. llvect uses this followed by UNPCKLQDQ to store 2 copies of an integer*8 value in an ‘xmm’ register. Typically this is done in the preheader of a vectorised loop to initialise the register for packed integer*8 operations.

    Attributes: other null trm .CG terminal “movd” ‘q’ sse_avx asm_special

  20. MOVHLPS xmm Type: xmm

    Move high half of sp values from one xmm register into a low half of 2nd xmm register.

    Attributes: other null trm .CG terminal “movhlps” sse_avx

  21. MOVLHPS xmm Type: xmm

    Move low half of sp values from one xmm register into a high half of 2nd xmm register.

    Attributes: other null trm .CG terminal “movlhps” sse_avx

  22. UNPCKLPS xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed real*4 values. This sets:

    xmm2(3:0) = [ xmm1(1), xmm2(1), xmm1(0), xmm2(0) ]

    where the subscripts refer to real*4 elements.

    Attributes: other null trm .CG terminal “unpcklps” sse_avx

  23. UNPCKHPS xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed real*4 values. This sets:

    xmm2(3:0) = [ xmm1(3), xmm2(3), xmm1(2), xmm2(2) ]

    where the subscripts refer to real*4 elements.

    Attributes: other null trm .CG terminal “unpckhps” sse_avx

  24. UNPCKLPD xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed real*8 values. This sets:

    xmm2(1:0) = [ xmm1(0), xmm2(0) ]

    where the subscripts refer to real*8 elements.

    Attributes: other null trm .CG terminal “unpcklpd” ssedp sse_avx

  25. UNPCKHPD xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed real*8 values. This sets:

    xmm2(1:0) = [ xmm1(1), xmm2(1) ]

    where the subscripts refer to real*8 elements.

    Attributes: other null trm .CG terminal “unpckhpd” ssedp sse_avx

  26. UNPCKLDQ xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed integer*4 values. This sets:

    xmm2(3:0) = [ xmm1(1), xmm2(1), xmm1(0), xmm2(0) ]

    where the subscripts refer to integer*4 elements. This is only used in AILIs on x86-32, where it is generated from a PI8MV_LOW ILI.

    Attributes: other null trm .CG CGonly terminal “punpckldq” ssedp sse_avx

  27. UNPCKHQDQ xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed integer*8 values. This sets:

    xmm2(1:0) = [ xmm1(1), xmm2(1) ]

    where the subscripts refer to integer*8 elements. This is only used in AILIs on x86-64, where it is generated from a PDFLOATK ILI.

    Attributes: other null trm .CG CGonly terminal “punpckhqdq” ssedp sse_avx

  28. UNPCKLQDQ xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed integer*8 values. This sets:

    xmm2(1:0) = [ xmm1(0), xmm2(0) ]

    where the subscripts refer to integer*8 elements.

    Attributes: other null trm .CG terminal “punpcklqdq” ssedp sse_avx

  29. PSSHUF xmm stc Type: xmm

    Shuffle contents of xmm registers. Used to move value in least significant word into the 3 other words of a register: xmm1 and xmm2 denote the (same) xmm register, and stc3 is the immediate constant 0.

    Attributes: other null trm .CG terminal “shufps” sse_avx asm_special

  30. PDSHUF xmm stc Type: xmm

    Shuffle contents of xmm registers. Used to switch 2 d.p. values in register.

    Attributes: other null trm .CG terminal “shufpd” ssedp sse_avx asm_special

  31. PI4SHUF xmm stc Type: xmm

    Shuffle contents of xmm register containing 4-byte integers.

    Attributes: other null trm .CG terminal “pshufd” sse_avx asm_special

  32. PTEST xmm Type: xmm

    This sets the ZF flag if the bitwise AND of all the bits in the xmm register operands is 0, otherwise it clears the ZF flag, and it sets the CF flag if the bitwise ANDN of all the bits in the operands is 0, otherwise it clears the CF flag. Due to the latter operation its operands are not commutative. It clears the AF, OF, PF and SF flags.

    Attributes: other null ir .CG “ptest” ccmod sse_avx asm_special

  33. PI4ADD xmm nme Type: arlnk

    SSE2 packed signed or unsigned integer*4 addition.

    Attributes: other comm trm ssenme .CG terminal “paddd” sse_avx

  34. PI4AND xmm nme Type: arlnk

    SSE2 packed bitwise AND. For pre-AVX512 targets the same instruction ‘[v]pand’ is generated for all integer sizes, but for AVX512 the letter ‘d’ is added to the instruction mnemonic to denote integer*4 operands and result.

    Attributes: other comm trm ssenme .CG terminal “pand” avx3_special

  35. PI4ANDN xmm nme Type: arlnk

    SSE2 packed bitwise AND NOT. For pre-AVX512 targets the same instruction ‘[v]pandn’ is generated for all integer sizes, but for AVX512 the letter ‘d’ is added to the instruction mnemonic to denote integer*4 operands and result.

    Attributes: other null trm ssenme .CG terminal “pandn” avx3_special

  36. PI4MAX xmm nme Type: arlnk

    SSE4.1 packed signed integer*4 maximum.

    Attributes: other comm trm ssenme .CG terminal “pmaxsd” sse_avx

  37. PI4MIN xmm nme Type: arlnk

    SSE4.1 packed signed integer*4 minimum.

    Attributes: other comm trm ssenme .CG terminal “pminsd” sse_avx

  38. PI4MUL xmm nme Type: arlnk

    SSE4.1 packed signed integer*4 multiplication, yielding the low half of the integer*8 result.

    Attributes: other comm trm ssenme .CG terminal “pmulld” sse_avx

  39. PI4OR xmm nme Type: arlnk

    SSE2 packed bitwise OR. For pre-AVX512 targets the same instruction ‘[v]por’ is generated for all integer sizes, but for AVX512 the letter ‘d’ is added to the instruction mnemonic to denote integer*4 operands and result.

    Attributes: other comm trm ssenme .CG terminal “por” avx3_special

  40. PI4SUBR xmm nme Type: arlnk

    SSE2 packed signed or unsigned integer*4 reverse subtraction.

    Attributes: other null trm ssenme .CG terminal “psubd” sse_avx

  41. PI4XOR xmm nme Type: arlnk

    SSE2 packed bitwise XOR. For pre-AVX512 targets the same instruction ‘[v]pxor’ is generated for all integer sizes, but for AVX512 the letter ‘d’ is added to the instruction mnemonic to denote integer*4 operands and result.

    Attributes: other comm trm ssenme .CG terminal “pxor” avx3_special

  42. PI4ADDX xmm Type: xmm

    SSE2 packed signed or unsigned integer*4 addition.

    Attributes: other comm trm .CG terminal “paddd” sse_avx

  43. PI4ANDX xmm Type: xmm

    SSE2 packed bitwise AND. For pre-AVX512 targets the same instruction ‘[v]pand’ is generated for all integer sizes, but for AVX512 the letter ‘d’ is added to the instruction mnemonic to denote integer*4 operands and result.

    Attributes: other comm trm .CG terminal “pand” avx3_special

  44. PI4ANDNX xmm Type: xmm

    SSE2 packed bitwise AND NOT. For pre-AVX512 targets the same instruction ‘[v]pandn’ is generated for all integer sizes, but for AVX512 the letter ‘d’ is added to the instruction mnemonic to denote integer*4 operands and result.

    Attributes: other null trm .CG terminal “pandn” avx3_special

  45. PI4MAXX xmm Type: xmm

    SSE4.1 packed signed integer*4 maximum.

    Attributes: other comm trm .CG terminal “pmaxsd” sse_avx

  46. PI4MINX xmm Type: xmm

    SSE4.1 packed signed integer*4 minimum.

    Attributes: other comm trm .CG terminal “pminsd” sse_avx

  47. PI4MULX xmm Type: xmm

    SSE4.1 packed signed integer*4 multiplication, yielding the low half of the integer*8 result.

    Attributes: other comm trm .CG terminal “pmulld” sse_avx

  48. PI4ORX xmm Type: xmm

    SSE2 packed bitwise OR. For pre-AVX512 targets the same instruction ‘[v]por’ is generated for all integer sizes, but for AVX512 the letter ‘d’ is added to the instruction mnemonic to denote integer*4 operands and result.

    Attributes: other comm trm .CG terminal “por” avx3_special

  49. PI4SUBRX xmm Type: xmm

    SSE2 packed signed or unsigned integer*4 reverse subtraction.

    Attributes: other null trm .CG terminal “psubd” sse_avx

  50. PI4XORX xmm Type: xmm

    SSE2 packed bitwise XOR. For pre-AVX512 targets the same instruction ‘[v]pxor’ is generated for all integer sizes, but for AVX512 the letter ‘d’ is added to the instruction mnemonic to denote integer*4 operands and result.

    Attributes: other comm trm .CG terminal “pxor” avx3_special

  51. PI8ADD xmm nme Type: arlnk

    SSE2 packed signed or unsigned integer*8 addition.

    Attributes: other comm trm ssenme .CG terminal “paddq” sse_avx

  52. PI8AND xmm nme Type: arlnk

    SSE2 packed bitwise AND. For pre-AVX512 targets the same instruction ‘[v]pand’ is generated for all integer sizes, but for AVX512 the letter ‘q’ is added to the instruction mnemonic to denote integer*8 operands and result.

    Attributes: other comm trm ssenme .CG terminal “pand” avx3_special

  53. PI8ANDN xmm nme Type: arlnk

    SSE2 packed bitwise AND NOT. For pre-AVX512 targets the same instruction ‘[v]pandn’ is generated for all integer sizes, but for AVX512 the letter ‘q’ is added to the instruction mnemonic to denote integer*8 operands and result.

    Attributes: other null trm ssenme .CG terminal “pandn” avx3_special

  54. PI8OR xmm nme Type: arlnk

    SSE2 packed bitwise OR. For pre-AVX512 targets the same instruction ‘[v]por’ is generated for all integer sizes, but for AVX512 the letter ‘q’ is added to the instruction mnemonic to denote integer*8 operands and result.

    Attributes: other comm trm ssenme .CG terminal “por” avx3_special

  55. PI8SUBR xmm nme Type: arlnk

    SSE2 packed signed or unsigned integer*8 reverse subtraction.

    Attributes: other null trm ssenme .CG terminal “psubq” sse_avx

  56. PI8XOR xmm nme Type: arlnk

    SSE2 packed bitwise XOR. For pre-AVX512 targets the same instruction ‘[v]pxor’ is generated for all integer sizes, but for AVX512 the letter ‘q’ is added to the instruction mnemonic to denote integer*8 operands and result.

    Attributes: other comm trm ssenme .CG terminal “pxor” avx3_special

  57. PI8ADDX xmm Type: xmm

    SSE2 packed signed or unsigned integer*8 addition.

    Attributes: other comm trm .CG terminal “paddq” sse_avx

  58. PI8ANDX xmm Type: xmm

    SSE2 packed bitwise AND. For pre-AVX512 targets the same instruction ‘[v]pand’ is generated for all integer sizes, but for AVX512 the letter ‘q’ is added to the instruction mnemonic to denote integer*8 operands and result.

    Attributes: other comm trm .CG terminal “pand” avx3_special

  59. PI8ANDNX xmm Type: xmm

    SSE2 packed bitwise AND NOT. For pre-AVX512 targets the same instruction ‘[v]pandn’ is generated for all integer sizes, but for AVX512 the letter ‘q’ is added to the instruction mnemonic to denote integer*8 operands and result.

    Attributes: other null trm .CG terminal “pandn” avx3_special

  60. PI8ORX xmm Type: xmm

    SSE2 packed bitwise OR. For pre-AVX512 targets the same instruction ‘[v]por’ is generated for all integer sizes, but for AVX512 the letter ‘q’ is added to the instruction mnemonic to denote integer*8 operands and result.

    Attributes: other comm trm .CG terminal “por” avx3_special

  61. PI8SUBRX xmm Type: xmm

    SSE2 packed signed or unsigned integer*8 reverse subtraction.

    Attributes: other null trm .CG terminal “psubq” sse_avx

  62. PI8XORX xmm Type: xmm

    SSE2 packed bitwise XOR. For pre-AVX512 targets the same instruction ‘[v]pxor’ is generated for all integer sizes, but for AVX512 the letter ‘q’ is added to the instruction mnemonic to denote integer*8 operands and result.

    Attributes: other comm trm .CG terminal “pxor” avx3_special

  63. PI4CMPX xmm stc Type: xmm

    Vector dword integer compare; stc is the compare code; one of the instructions pcmpXXd is generated for this ili.

    Attributes: other null trm .CG terminal sse_avx asm_special

  64. PI8CMPX xmm stc Type: xmm

    Vector qword integer compare; stc is the compare code; one of the instructions pcmpXXq is generated for this ili.

    Attributes: other null trm .CG terminal sse_avx asm_special

  65. PUI4MAXX xmm Type: xmm

    SSE4.1 packed unsigned dword integer maximum.

    Attributes: other comm trm .CG terminal “pmaxud”

  66. PUI4MINX xmm Type: xmm

    SSE4.1 packed unsigned dword integer minimum.

    Attributes: other comm trm .CG terminal “pminud”

  67. PUI4MAX xmm nme Type: arlnk

    SSE4.1 packed unsigned dword integer maximum.

    Attributes: other comm trm ssenme .CG terminal “pmaxud”

  68. PUI4MIN xmm nme Type: arlnk

    SSE4.1 packed unsigned dword integer minimum.

    Attributes: other comm trm ssenme .CG terminal “pminud”

  69. PSADD xmm nme Type: arlnk

    Perform 4 single-precision floating-point adds of the 4 values in the 16-byte aligned memory location denoted by arlnk, and the 4 values in the xmm register denoted by xmm. The results are placed in xmm register ‘xmm’.

    Attributes: other comm trm ssenme .CG terminal “addps” sse_avx*double* fadd lat(7:5)

  70. PSSUBR xmm nme Type: arlnk

    Reverse subtract: computes ‘xmm’ - ‘arlnk’, result placed in the xmm register denoted by ‘xmm’.

    Attributes: other null trm ssenme .CG terminal “subps” sse_avx*double* fadd lat(7:5)

  71. PSMUL xmm nme Type: arlnk

    Multiply contents of memory and 16-byte xmm register.

    Attributes: other comm trm ssenme .CG terminal “mulps” sse_avx*double* fmul lat(7:5)

  72. PSDIVR xmm nme Type: arlnk

    Reverse divide: op2/op1 -> op2.

    Attributes: other null trm ssenme .CG terminal “divps” sse_avx*double* fmul lat(35:33)

  73. PSAND xmm nme Type: arlnk

    Bitwise AND operation on s.p. values - used to implement absolute value.

    Attributes: other comm trm ssenme .CG terminal “andps” sse_avx*double* fmul lat(5:3)

  74. PSXOR xmm nme Type: arlnk

    Bitwise XOR operation on s.p. values.

    Attributes: other comm trm ssenme .CG terminal “xorps” sse_avx*double* fmul lat(5:3)

  75. PSMAX xmm nme Type: arlnk

    Single-precision packed maximum.

    Attributes: other comm trm ssenme .CG terminal “maxps” sse_avx*double* fadd lat(5:3)

  76. PSMIN xmm nme Type: arlnk

    Single-precison packed minimum.

    Attributes: other comm trm ssenme .CG terminal “minps” sse_avx*double* fadd lat(5:3)

  77. PSSQRT xmm nme Type: arlnk

    Compute square root of 4 s.p. values in memory and put result into xmm register denoted by xmm.

    Attributes: other null trm ssenme .CG terminal “sqrtps” sse_avx*double* fmul lat(41:39)

  78. RCPPS xmm nme Type: arlnk

    Compute single-precision approximations to reciprocal.

    Attributes: other null trm ssenme .CG terminal “rcpps” avx3_special*double* fmul lat(41:39)

  79. RSQRTPS xmm nme Type: arlnk

    Compute single-precision approximations to reciprocal square root.

    Attributes: other null trm ssenme .CG terminal “rsqrtps” avx3_special*double* fmul lat(41:39)

  80. CMPNEQPS xmm nme Type: arlnk

    Used for single-precision sqrt approximation.

    Attributes: other null trm ssenme .CG terminal “cmpneqps” sse_avx*double* fadd lat(5:3)

  81. HADDPS xmm Type: xmm

    Horizontal add packed single.

    Attributes: other null trm .CG terminal “haddps” sse_avx

  82. PSADDX xmm Type: xmm

    Perform 4 single-precision floating point additions of the 4 values in xmm register xmm1 and the 4 values in register xmm2. The results are placed in register xmm2.

    Attributes: other comm trm .CG terminal “addps” sse_avx*double* fadd lat(7:5)

  83. PSADDSUBX xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed real*4 values. This subtracts the even-index values in ‘xmm1’ from the corresponding values in ‘xmm2’, and adds the odd-index values in ‘xmm1’ to the corresponding values in ‘xmm2’, placing the result in ‘xmm2’.

    Attributes: other null trm .CG terminal “addsubps” sse_avx*double* fadd lat(5:7)

  84. PSSUBRX xmm Type: xmm

    Reverse-subtract contents of two 16-byte xmm registers.

    Attributes: other null trm .CG terminal “subps” sse_avx*double* fadd lat(7:5)

  85. PSMULX xmm Type: xmm

    Multiply contents of two 16-byte xmm registers.

    Attributes: other comm trm .CG terminal “mulps” sse_avx*double* fmul lat(7:5)

  86. PSDIVRX xmm Type: xmm

    Reverse-divide contents of two 16-byte xmm registers.

    Attributes: other null trm .CG terminal “divps” sse_avx*double* fmul lat(35:33)

  87. PSANDX xmm Type: xmm

    Bitwise AND operation on s.p. values - used to implement absolute value.

    Attributes: other comm trm .CG terminal “andps” sse_avx*double* fmul lat(5:3)

  88. PSANDNX xmm Type: xmm

    Bitwise ANDNOT operation on s.p. values.

    Attributes: other null trm .CG terminal “andnps” sse_avx*double* fmul lat(5:3)

  89. PSORX xmm Type: xmm

    Bitwise OR operation on s.p. values.

    Attributes: other comm trm .CG terminal “orps” sse_avx*double* fadd lat(5:3)

  90. PSXORX xmm Type: xmm

    Compute bitwise exclusive-OR of two xmm registers and place result in second register.

    Attributes: other comm trm .CG terminal “xorps” sse_avx*double* fmul lat(5:3)

  91. PSMAXX xmm Type: xmm

    Single precision packed maximum.

    Attributes: other comm trm .CG terminal “maxps” sse_avx*double* fadd lat(5:3)

  92. PSMINX xmm Type: xmm

    Single precision packed minimum.

    Attributes: other comm trm .CG terminal “minps” sse_avx*double* fadd lat(5:3)

  93. PSSQRTX xmm Type: xmm

    Compute square root of 4 s.p. values in 1st xmm register and put result into 2nd xmm register.

    Attributes: other null trm .CG terminal “sqrtps” sse_avx*double* fmul lat(41:39)

  94. RCPPSX xmm Type: xmm

    Compute single-precision approximations to reciprocal.

    Attributes: other null trm .CG terminal “rcpps” avx3_special*double* fmul lat(41:39)

  95. RSQRTPSX xmm Type: xmm

    Compute single-precision approximations to reciprocal square root.

    Attributes: other null trm .CG terminal “rsqrtps” avx3_special*double* fmul lat(41:39)

  96. CMPNEQPSX xmm Type: xmm

    Used for single-precision square root approximation.

    Attributes: other null trm .CG terminal “cmpneqps” sse_avx

  97. PSCMPX xmm stc Type: xmm

    Vector compare of single precision values. ‘stc’ is comparison code. One of the instructions cmpXXps is generated for this ili.

    Attributes: other null trm .CG terminal sse_avx asm_special

  98. PDADD xmm nme Type: arlnk

    Perform 2 double-precision floating-point adds of the 2 values in the 16-byte aligned memory location denoted by arlnk, and the 2 values in the xmm register denoted by xmm. The results are placed in xmm register ‘xmm’.

    Attributes: other comm trm ssenme .CG terminal “addpd” ssedp sse_avx*double* fadd lat(7:5)

  99. PDSUBR xmm nme Type: arlnk

    Reverse subtract: computes ‘xmm’ - ‘arlnk’, result placed in the xmm register denoted by ‘xmm’.

    Attributes: other null trm ssenme .CG terminal “subpd” ssedp sse_avx*double* fadd lat(7:5)

  100. PDMUL xmm nme Type: arlnk

    Multiply contents of memory and 16-byte xmm register.

    Attributes: other comm trm ssenme .CG terminal “mulpd” ssedp sse_avx*double* fmul lat(7:5)

  101. PDDIVR xmm nme Type: arlnk

    Reverse divide: op2/op1 -> op2.

    Attributes: other null trm ssenme .CG terminal “divpd” ssedp sse_avx*double* fmul lat(39:37)

  102. PDAND xmm nme Type: arlnk

    Bitwise AND operation on d.p. values - used to implement absolute value.

    Attributes: other comm trm ssenme .CG terminal “andpd” ssedp sse_avx*direct* fadd lat(5:3)

  103. PDXOR xmm nme Type: arlnk

    Bitwise XOR operation on d.p. values.

    Attributes: other comm trm ssenme .CG terminal “xorpd” ssedp sse_avx*double* fmul lat(5:3)

  104. PDMAX xmm nme Type: arlnk

    Double precision packed maximum.

    Attributes: other comm trm ssenme .CG terminal “maxpd” ssedp sse_avx*direct* fadd lat(5:3)

  105. PDMIN xmm nme Type: arlnk

    Double precision packed minimum.

    Attributes: other comm trm ssenme .CG terminal “minpd” ssedp sse_avx*direct* fadd lat(5:3)

  106. PDSQRT xmm nme Type: arlnk

    Compute square root of 2 d.p. values in memory and put result into xmm register denoted by xmm.

    Attributes: other null trm ssenme .CG terminal “sqrtpd” ssedp sse_avx*double* fmul lat(53:51)

  107. HADDPD xmm Type: xmm

    Horizontal add packed double.

    Attributes: other null trm .CG terminal “haddpd” ssedp sse_avx

  108. PDADDX xmm Type: xmm

    Perform 2 double-precision floating point additions of the 2 values in xmm register xmm1 and the 2 values in register xmm2. The results are placed in register xmm2.

    Attributes: other comm trm .CG terminal “addpd” ssedp sse_avx*double* fadd lat(5:7)

  109. PDADDSUBX xmm Type: xmm

    ‘xmm1’ and ‘xmm2’ contain packed real*8 values. This subtracts the even-index values in ‘xmm1’ from the corresponding values in ‘xmm2’, and adds the odd-index values in ‘xmm1’ to the corresponding values in ‘xmm2’, placing the result in ‘xmm2’.

    Attributes: other null trm .CG terminal “addsubpd” ssedp sse_avx*double* fadd lat(5:7)

  110. PDSUBRX xmm Type: xmm

    Reverse-subtract contents of two 16-byte xmm registers.

    Attributes: other null trm .CG terminal “subpd” ssedp sse_avx*double* fadd lat(7:5)

  111. PDMULX xmm Type: xmm

    Multiply contents of two 16-byte xmm registers.

    Attributes: other comm trm .CG terminal “mulpd” ssedp sse_avx*double* fmul lat(7:5)

  112. PDDIVRX xmm Type: xmm

    Reverse-divide contents of two 16-byte xmm registers.

    Attributes: other null trm .CG terminal “divpd” ssedp sse_avx*double* fmul lat(39:37)

  113. PDANDX xmm Type: xmm

    Bitwise AND operation on d.p. values - used to implement absolute value.

    Attributes: other comm trm .CG terminal “andpd” ssedp sse_avx*direct* fadd lat(5:3)

  114. PDANDNX xmm Type: xmm

    Bitwise ANDNOT operation on d.p. values.

    Attributes: other null trm .CG terminal “andnpd” ssedp sse_avx

  115. PDORX xmm Type: xmm

    Bitwise OR operation on d.p. values.

    Attributes: other comm trm .CG terminal “orpd” ssedp sse_avx

  116. PDXORX xmm Type: xmm

    Compute bitwise exclusive-OR of two xmm registers and place result in second register.

    Attributes: other comm trm .CG terminal “xorpd” ssedp sse_avx*double* fmul lat(5:3)

  117. PDMAXX xmm Type: xmm

    Double precision packed maximum.

    Attributes: other comm trm .CG terminal “maxpd” ssedp sse_avx*double* fadd lat(5:3)

  118. PDMINX xmm Type: xmm

    Double precision packed minimum.

    Attributes: other comm trm .CG terminal “minpd” ssedp sse_avx*double* fadd lat(5:3)

  119. PDSQRTX xmm Type: xmm

    Compute square root of 2 d.p. values in 1st xmm register and put result into 2nd xmm register.

    Attributes: other null trm .CG terminal “sqrtpd” ssedp sse_avx*double* fmul lat(53:51)

  120. PDCMPX xmm stc Type: xmm

    Vector compare of double precision values. ‘stc’ is comparison code. One of the instructions cmpXXpd is generated for this ili.

    Attributes: other null trm .CG terminal sse_avx asm_special ssedp

  121. PSLLSH xmm Type: irlnk

    Shift packed 4-byte integers left.

    Attributes: other null trm .CG terminal “pslld” sse_avx

  122. PSRLSH xmm Type: irlnk

    Shift packed 4-byte integers logical right (zero fill).

    Attributes: other null trm .CG terminal “psrld” sse_avx

  123. PSRASH xmm Type: irlnk

    Shift packed 4-byte integers arithmetically right (sign extend).

    Attributes: other null trm .CG terminal “psrad” sse_avx

  124. PDLLSH xmm Type: irlnk

    Shift packed 8-byte integers left.

    Attributes: other null trm .CG terminal “psllq” ssedp sse_avx

  125. PDRLSH xmm Type: irlnk

    Shift packed 8-byte integers logical right (zero fill).

    Attributes: other null trm .CG terminal “psrlq” ssedp sse_avx

  126. PDRASH xmm Type: irlnk

    Shift packed 8-byte integers arithmetically right (sign extend). NO SUCH INSTRUCTION.

    Attributes: other null trm .CG notCG terminal “psraq” ssedp

  127. PBBLENDX xmm xmm Type: xmm

    SSE4.1 Variable Blend Packed Bytes

    Attributes: other null trm .CG terminal “pblendvb” sse_avx asm_special

  128. PDBLENDX xmm xmm Type: xmm

    SSE4.1 Variable Blend Packed Double Precision Floating-Point Values

    Attributes: other null trm .CG terminal “blendvpd” sse_avx asm_special ssedp

  129. PSBLENDX xmm xmm Type: xmm

    SSE4.1 Variable Blend Packed Single Precision Floating-Point Values

    Attributes: other null trm .CG terminal “blendvps” sse_avx asm_special

  130. PBBLEND xmm nme xmm Type: arlnk

    SSE4.1 Variable Blend Packed Bytes

    Attributes: other null trm ssenme .CG terminal “pblendvb” sse_avx asm_special

  131. PDBLEND xmm nme xmm Type: arlnk

    SSE4.1 Variable Blend Packed Double Precision Floating-Point Values

    Attributes: other null trm ssenme .CG terminal “blendvpd” sse_avx asm_special ssedp

  132. PSBLEND xmm nme xmm Type: arlnk

    SSE4.1 Variable Blend Packed Single Precision Floating-Point Values

    Attributes: other null trm ssenme .CG terminal “blendvps” sse_avx asm_special

  133. PDBROADCAST xmm Type: dplnk

    An AVX-only ILI which broadcasts a real*8 value to all 8-byte elements of a ymm or zmm register ‘xmm’.

    Attributes: other null trm .CG terminal “vbroadcastsd” ssedp avx_only avx_special

  134. PSBROADCAST xmm Type: splnk

    An AVX-only ILI which broadcasts a real*4 value to all 4-byte elements of an xmm, ymm or zmm register ‘xmm’.

    Attributes: other null trm .CG terminal “vbroadcastss” avx_only avx_special

  135. PCDBROADCAST xmm Type: cdlnk

    An AVX-only ILI which broadcasts a (real*8, real*8) complex value to all 16-byte elements of a zmm register ‘xmm’.

    Attributes: other null trm .CG terminal “vbroadcastf32x4” ssedp avx_only avx_special

  136. PCSBROADCAST xmm Type: cslnk

    An AVX-only ILI which broadcasts a (real*4, real*4) complex value to all 8-byte elements of a ymm or zmm register ‘xmm’.

    Attributes: other null trm .CG terminal “vbroadcastsd” avx_only avx_special

  137. PI4BROADCAST xmm Type: irlnk

    An AVX-only ILI which broadcasts an integer*4 value to all 4-byte elements of an xmm, ymm or zmm register ‘xmm’.

    Attributes: other null trm .CG terminal “vpbroadcastd” avx_only avx_special

  138. PI8BROADCAST xmm Type: krlnk

    An AVX-only ILI which broadcasts an integer*8 value to all 8-byte elements of an xmm, ymm or zmm register ‘xmm’.

    Attributes: other null trm .CG terminal “vpbroadcastq” avx_only avx_special

  139. VEXTRACT xmm nme stc Type: arlnk

    An AVX-only ILI. stc = (suffix_flag | n), where ‘suffix_flag’ is a flag such as SUF_f128 that specifies which ‘vextract…’ instruction to use and ‘n’ is an integer in the range 0-3. ‘xmm’ is a ymm or zmm source register, and this ILI stores the contents of its n’th 128-bit or 256-bit element to the address ‘arlnk’.

    Attributes: other null trm ssenme .CG terminal “vextract” avx_only avx_special

  140. VEXTRACTX xmm stc Type: xmm

    This is the same as VEXTRACT except that the destination is ‘xmm2’ (an xmm or ymm register) rather than the address ‘arlnk’.

    Attributes: other null trm .CG terminal “vextract” avx_only avx_special

  141. VINSERT xmm nme stc Type: arlnk

    An AVX-only ILI. stc = (suffix_flag | n), where ‘suffix_flag’ is a flag such as SUF_f128 that specifies which ‘vinsert…’ instruction to use and ‘n’ is an integer in the range 0-3. This ILI loads 128 or 256 bits of data from address ‘arlnk’ to the n’th 128-bit or 256-bit element of ‘xmm’, which is a ymm or zmm register, leaving its other element(s) unchanged.

    Attributes: other null trm ssenme .CG terminal “vinsert” avx_only avx_special

  142. VINSERTX xmm stc Type: xmm

    This is the same as VINSERT except that the source is ‘xmm1’ (an xmm or ymm register) rather than the address ‘arlnk’.

    Attributes: other null trm .CG terminal “vinsert” avx_only avx_special

  143. VEXTRACTF128 xmm nme Type: arlnk

    An AVX-only ILI. Store the high lane of ‘xmm’ (a ymm register containing floating-point data) to the address ‘arlnk’.

    Attributes: other null trm ssenme .CG terminal “vextractf128” avx_only avx_special

  144. VEXTRACTF128X xmm Type: xmm

    An AVX-only ILI. Copy the high lane of ‘xmm1’ (a ymm register containing floating-point data) to ‘xmm2’ (an xmm register).

    Attributes: other null trm .CG terminal “vextractf128” avx_only avx_special

  145. VEXTRACTI128 xmm nme Type: arlnk

    An AVX2-only ILI. Store the high lane of ‘xmm’ (a ymm register containing integer data) to the address ‘arlnk’.

    Attributes: other null trm ssenme .CG terminal “vextracti128” avx_only avx_special

  146. VEXTRACTI128X xmm Type: xmm

    An AVX2-only ILI. Copy the high lane of ‘xmm1’ (a ymm register containing integer data) to ‘xmm2’ (an xmm register).

    Attributes: other null trm .CG terminal “vextracti128” avx_only avx_special

  147. VINSERTF128 xmm nme Type: arlnk

    An AVX-only ILI. Load 128 bits of floating-point data from address ‘arlnk’ to the high lane of ‘xmm’ (a ymm register), leaving its low lane unchanged.

    Attributes: other null trm ssenme .CG terminal “vinsertf128” avx_only avx_special

  148. VINSERTF128X xmm Type: xmm

    An AVX-only ILI. Copy the contents of ‘xmm1’ (an xmm register containing floating-point data) to the high lane of ‘xmm2’ (a ymm register), leaving its low lane unchanged.

    Attributes: other null trm .CG terminal “vinsertf128” avx_only avx_special

  149. VINSERTI128 xmm nme Type: arlnk

    An AVX2-only ILI. Load 128 bits of integer data from address ‘arlnk’ to the high lane of ‘xmm’ (a ymm register), leaving its low lane unchanged.

    Attributes: other null trm ssenme .CG terminal “vinserti128” avx_only avx_special

  150. VINSERTI128X xmm Type: xmm

    An AVX2-only ILI. Copy the contents of ‘xmm1’ (an xmm register containing integer data) to the high lane of ‘xmm2’ (a ymm register), leaving its low lane unchanged.

    Attributes: other null trm .CG terminal “vinserti128” avx_only avx_special

  151. PDFMA xmm nme xmm Type: arlnk

    A packed real*8 FMA3 or FMA4 instruction which computes:

    dest = <sign> (factor1 * factor2) <addop> term

    where:

    arlink = factor2 or term xmm1 = ((arlnk == factor2) ? term : factor2) xmm2 = dest

    Since ILIs have a maximum of 4 operands this ILI is always immediately preceded by an FMATYPE ILI which provides other information about the FMA instruction, namely (i) flags to specify the values of <sign> (+/-) and <addop> (+/-), and whether ‘dest’ is the same as ‘factor1’ or ‘term’, and for P[DS]FMA, whether arlnk is ‘factor2’ or ‘term’, and (ii) the ‘factor1’ operand.

    Note, for FMA3 ‘dest’ must be the same as either ‘factor1’ or ‘term’.

    Attributes: other null trm ssenme .CG terminal asm_special ssedp

  152. PDFMAX xmm xmm xmm Type: xmm

    A packed real*8 FMA3 or FMA4 instruction which computes:

    dest = <sign> (factor1 * factor2) <addop> term

    where:

    xmm1 = factor1 xmm2 = factor2 xmm3 = term xmm4 = dest

    Since ILIs have a maximum of 4 operands this ILI is always immediately preceded by an FMATYPE ILI which specifies the values of <sign> (+/-) and <addop> (+/-).

    Note, for FMA3 ‘dest’ must be the same as either ‘factor1’ or ‘term’.

    Attributes: other null trm .CG terminal asm_special ssedp

  153. PSFMA xmm nme xmm Type: arlnk

    This is the same as PDFMA except that it specifies a packed real*4 FMA3 or FMA4 instruction.

    Attributes: other null trm ssenme .CG terminal asm_special

  154. PSFMAX xmm xmm xmm Type: xmm

    This is the same as PDFMAX except that it specifies a packed real*4 FMA3 or FMA4 instruction.

    Attributes: other null trm .CG terminal asm_special

  155. FMATYPE xmm Type: stc

    This provides extra information about the immediately following P[DS]FMA or P[DS]FMAX ILI. Its operands are:

    stc = a set of flags which specify the values of <sign> (+/-) and

    <addop> (+/-), and whether ‘dest’ is the same as ‘factor1’ or ‘term’, and for P[DS]FMA, whether arlnk is ‘factor2’ or ‘term’. The flags are defined by ‘FMA_…’ macros in “ili.h”.

    xmm = the ‘factor1’ operand for P[DS]FMA, or 0 for P[DS]FMAX.

    Attributes: other null trm .CG terminal notAILI

CLTD

Used with signed integer divide/mod instruction. Sign extends %eax into %edx.

Attributes: other null ir .CG CGonly “cltd” ccmod asm_special*direct* lat(1)

CQTO

Used with signed integer64 divide/mod instruction.

Attributes: other null kr .CG CGonly “cqto” ccmod asm_special*direct* lat(1)

CLTQ

Sign extends register %rax from 32 to 64 bits. Used in the final peephole pass to replace IKMV when possible.

Attributes: other null trm .CG CGonly “cltq” ccmod asm_special*direct* lat(1)

CMOV

Conditionally copy op2 into op1 based on condition codes.

Attributes: load null ir .CG CGonly asm_special “cmov”ld direct lat(4)

direct lat(1)

CMOVSP

Single precision conditional move. Expanded by the CG.

Attributes: load null sp .CG CGonly “movss” sse_avx asm_special*ld* double lat(3)

st direct lat(2)

direct lat(2)

CMOVDP

Double precision conditional move. Expanded by the CG.

Attributes: load null dp .CG CGonly “movsd” sse_avx asm_special*ld* double fadd fmul fst lat(3)

st direct fst lat(2)

direct fadd fmul lat(2)

CMOVSCMPLX

Single precision complex conditional move. Expanded by the CG.

Attributes: load null cs .CG CGonly “movsd” sse_avx asm_special*ld* double fadd fmul fst lat(3)

st direct fst lat(2)

direct fadd fmul lat(2)

CMOVDCMPLX

Double precision complex conditional move. Expanded by the CG.

Attributes: load null cd .CG CGonly “movupd” sse_avx asm_special*ld* double fadd fmul fst lat(3)

st direct fst lat(2)

direct fadd fmul lat(2)

CMOVLPD

Same as CMOVDP, but used when “movlpd” is preferred.

Attributes: load null dp .CG CGonly “movlpd” sse_avx asm_special*ld* direct fadd fmul fst lat(4)

st direct fst lat(2)

CSETB

Conditional set of a byte

Attributes: store null ir .CG CGonly asm_special “set”ld direct lat(4)

direct lat(1)

INC

Increment integer register or memory operand.

Attributes: arth null ir cse .CG CGonly ccarith “inc”direct lat(1)

DEC

Decrement integer register or memory operand.

Attributes: arth null ir cse .CG CGonly ccarith “dec”direct lat(1)

  1. LEA stc Type: irlnk

    32-bit load effective address instruction. This only appears in the linear and attributed ILIs, not the shared ILIs. The LILI is created by ‘cglinear.c:optimize_imul()’, in which case ‘irlnk’ is used as both the base and index register, and ‘stc’ is the shift count, which may be 1, 2, 4 or 8. The AILI may be generated from a LEA LILI or it may be created by a peephole optimisation.

    Attributes: arth null ir cse .CG CGonly “lea” ‘l’direct lat(1)

  2. KLEA stc Type: krlnk

    64-bit load effective address instruction. This is only generated on x86-64, and it only appears in the linear and attributed ILIs, not the shared ILIs. It is created by ‘cglinear.c:optimize_imul()’. ‘krlnk’ is used as both the base and index register, and ‘stc’ is the shift count, which may be 1, 2, 4 or 8.

    Attributes: arth null kr cse .CG CGonly “lea” ‘q’direct lat(1)

MOV

Synonym for LD and ST, and register to register moves.

Attributes: move null ir cse .CG CGonly “mov” move*direct* lat(1)

ld direct lat(3)

st direct lat(3)

MOVABS

Used in place of MOV and ACON_STATIC, etc., when a full 64-bit address is required. Used to support the Hammer-64 medium code model.

Attributes: move null ir cse .CG CGonly “movabs” move

  1. BIH stc Type: stc

    Created by the code generator to represent, in the linear ili and the AILI, the beginning of a basic block. The first operand is the bih number, and the second is the label symbol table pointer, if any.

    Attributes: other null trm dom .CG CGonly terminal asm_nop

DEF

Placed into the AILI to indicate the definition of a register which is otherwise not explicitly defined (by appearing in the ‘dest’ field of some aili). The register allocators need this information in certain cases.

Attributes: other null trm .CG CGonly asm_nop

USE

Placed into the AILI to indicate the use of a register which is otherwise not explicitly used. The register allocators need to know this in order to avoid a conflicting register allocation, etc.

Attributes: other null trm .CG CGonly asm_nop

STACK_ADJ

Placed into the AILI to indicate that the stack pointer has been modified by the value specified in the src1 field of the aili. No code is generated for this ili.

Attributes: other null trm .CG CGonly asm_special

ALLOC

Allocate memory for a C or C++ variable length array. ‘krlnk’ is the size. Result is the address of the allocated memory.

Attributes: arth null ar .CG notCG

DEALLOC

Deallocate memory that was allocated by ALLOC. ‘arlnk’ is the memory address.

Attributes: other null trm .CG notCG

ALLOCA

Allocate memory with alloca ‘krlnk’ is the size. Result is the address of the allocated memory.

Attributes: arth null ar .CG notAILI

  1. CFA nme Type: arlnk

    Materialize the outer call frame address as a builtin. This is placed into a load address register from a memory location whose address is represented by op1.

    Attributes: other null ar cse .CG ‘l’ asm_special

  2. EHRET nme Type: arlnk

    Materialize the return address of the caller as a builtin. This is placed into a load address register from a memory location whose address is represented by op1.

    Attributes: other null ar cse .CG ‘l’ asm_special

  3. EHREGST sym Type: sym

    Store implicit registers into the syms: catch_clause and caught_object

    Attributes: other null trm .CG asm_special terminal

  4. EHREGLD sym Type: sym

    Materialize the syms: catch_clause and caught_object into the two symbols from implicit registers

    Attributes: other null trm .CG asm_special terminal

  5. EHRESUME sym Type: sym

    Resume propagation of an existing in-flight exception whose unwinding was interrupted to run some cleanup code.

    Attributes: other null trm .CG asm_special terminal

ACCEL

Start a block of code to be targeted for accelerator. Link to list of clauses.

Attributes: other null trm .CG notCG

ENDACCEL

End a block of code to be targeted for accelerator. Link to a list of clauses.

Attributes: other null trm .CG notCG

ACCKERNELS

Start a block of kernels to be targeted for accelerator. Link to a list of clauses.

Attributes: other null trm .CG notCG

ACCENDKERNELS

End a block of kernels to be targeted for accelerator. Link to a list of clauses.

Attributes: other null trm .CG notCG

ACCPAR

Start a block of parallel code to be targeted for accelerator. Link to a list of clauses.

Attributes: other null trm .CG notCG

ACCENDPAR

End a block of parallel code to be targeted for accelerator. Link to a list of clauses.

Attributes: other null trm .CG notCG

ACCSCALARREG

Start a block of code to run as a scalar kernel on the accelerator. Link to a list of clauses.

Attributes: other null trm .CG notCG

ACCENDSCALARREG

End a block of code to run as a scalar kernel on the accelerator. Link to a list of clauses.

Attributes: other null trm .CG notCG

ACCSERIAL

Start a block of code to run as a serial kernel on the accelerator. Link to a list of clauses.

Attributes: other null trm .CG notCG

ACCENDSERIAL

End a block of code to run as a serial kernel on the accelerator. Link to a list of clauses.

Attributes: other null trm .CG notCG

ACCELLP

The following loop is to be targeted for the accelerator. Link to a list of clauses.

Attributes: other null trm .CG notCG

  1. ACCSLOOP stc Type: lnk

    The following loop in a serial region is to be targeted for the accelerator. Link to a list of clauses. The second operand is one when this loop is tightly nested in the compute construct, and zero otherwise;

    Attributes: other null trm .CG notCG

  2. ACCKLOOP stc Type: lnk

    The following loop in a kernels region is to be targeted for the accelerator. Link to a list of clauses. The second operand is one when this loop is tightly nested in the compute construct, and zero otherwise;

    Attributes: other null trm .CG notCG

  3. ACCPLOOP stc Type: lnk

    The following loop in a parallel region is to be targeted for the accelerator. Link to a list of clauses. The second operand is one when this loop is tightly nested in the compute construct, and zero otherwise;

    Attributes: other null trm .CG notCG

  4. ACCATTACH lnk lnk sym Type: lnk

    Attach the pointer/allocatable member in an aggregate structure data variable

    Attributes: other null lnk .CG notCG

  5. ACCDETACH lnk lnk sym Type: lnk

    Detach the pointer/allocatable member in an aggregate structure data variable

    Attributes: other null lnk .CG notCG

  6. ACCCOPY lnk lnk sym stc Type: lnk

    Variable or array will be copied from host to device and back. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  7. ACCCOPYIN lnk lnk sym stc Type: lnk

    Variable or array will be copied from host to device. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  8. ACCCOPYOUT lnk lnk sym stc Type: lnk

    Variable or array will be copied from device to host. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  9. ACCLOCAL lnk lnk sym stc Type: lnk

    Variable or array will be allocated on the device but not copied. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  10. ACCCREATE lnk lnk sym stc Type: lnk

    Variable or array will be allocated on the device but not copied to or from the host. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  11. ACCDELETE lnk lnk sym stc Type: lnk

    Variable or array will be deleted from the device but not copied to or from the host. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  12. ACCPDELETE lnk lnk sym stc Type: lnk

    Variable or array will be deleted from the device but not copied, unless in a data region to or from the host. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  13. ACCPRESENT lnk lnk sym stc Type: lnk

    Variable or array must be present on the device. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  14. ACCPCOPY lnk lnk sym stc Type: lnk

    Variable or array may be present on the device, but if not will be copied. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  15. ACCPCOPYIN lnk lnk sym stc Type: lnk

    Variable or array may be present on the device, but if not will be copied in. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  16. ACCPCOPYOUT lnk lnk sym stc Type: lnk

    Variable or array may be present on the device, but if not will be copied out. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol.

    Attributes: other null lnk Fifth arg is the policy index .CG notCG

  17. ACCPCREATE lnk lnk sym stc Type: lnk

    Variable or array may be present on the device, but if not will be allocated, but not copied. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  18. ACCPNOT lnk lnk sym stc Type: lnk

    Variable or array may be present on the device, but if not will NOT be allocated nor copied. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  19. ACCNO_CREATE lnk lnk sym stc Type: lnk

    Variable or array may be present on the device, but if not will NOT be allocated nor copied. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  20. ACCUPDATEHOST lnk lnk stc Type: lnk

    Variable or array will be copied from device back to host. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth arg is the policy index

    Attributes: other null lnk .CG notCG

  21. ACCUPDATESELF lnk lnk stc Type: lnk

    Variable or array will be copied from device back to the current thread. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth arg is the policy index

    Attributes: other null lnk .CG notCG

  22. ACCUPDATEDEV lnk lnk stc Type: lnk

    Variable or array will be copied from host to device. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth arg is the policy index

    Attributes: other null lnk .CG notCG

  23. ACCUPDATEHOSTIFP lnk lnk stc Type: lnk

    Variable or array will be copied from device back to host, if present. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth arg is the policy index

    Attributes: other null lnk .CG notCG

  24. ACCUPDATESELFIFP lnk lnk stc Type: lnk

    Variable or array will be copied from device back to the current thread, if present. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth arg is the policy index

    Attributes: other null lnk .CG notCG

  25. ACCUPDATEDEVIFP lnk lnk stc Type: lnk

    Variable or array will be copied from host to device, if present. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth arg is the policy index

    Attributes: other null lnk .CG notCG

ACCUPDATE

Head of a list of update clauses.

Attributes: other null trm .CG notCG

PCASTCOMPARE

Head of a list of PCAST compare clauses.

Attributes: other null trm .CG notCG

  1. ACCCOMPARE lnk lnk stc Type: lnk

    Variable or array will be copied from device back to host. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth arg is the policy index

    Attributes: other null lnk .CG notCG

  2. PGICOMPARE lnk lnk stc Type: lnk

    Variable or array will be copied from device back to host. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth arg is the policy index

    Attributes: other null lnk .CG notCG

  3. ACCPRIVATE lnk lnk Type: lnk

    Variable or array is private to an iteration of the loop or to a worker. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fourth argument is the symbol that points to the device copy, if there is such a symbol.

    Attributes: other null lnk .CG notCG

  4. ACCFIRSTPRIV lnk lnk Type: lnk

    Variable or array is private to the workers, but initialize with values from the host. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK.

    Attributes: other null lnk .CG notCG

  5. ACCCACHE lnk lnk Type: lnk

    The compiler should move the array to the highest level of the software-managed cache. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK.

    Attributes: other null lnk .CG notCG

  6. ACCDEVICEPTR lnk lnk sym stc Type: lnk

    Variable or array will be copied from device to host. First link is to next clause. Second link is to the array bounds. Third link is to ACCSYMLNK. Fifth arg is the policy index

    Attributes: other null lnk .CG notCG

  7. ACCAUTO stc Type: lnk

    The execution mode will be selected by the compiler (gang/worker/vector/seq) First link is to next clause. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  8. ACCVECTOR lnk stc Type: lnk

    The iterations of the loop will be executed in vector mode on the accelerator First link is to next clause. Second link is to the vector size expression, or to IL_NULL if not set. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  9. ACCPARALLEL lnk stc Type: lnk

    The iterations of the loop will be executed in parallel on the accelerator. Same as ACCGANG except for the name. First argument is the link to the next clause. Second argument is the number of gangs. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  10. ACCGANG lnk stc stc Type: lnk

    The iterations of the loop will be executed in across gangs on the accelerator. First argument is the link to the next clause. Second argument is the number of gangs. Third argument is the device_type argument. Fourth argument is the dimension, where the default is dimension zero (cuda X dimension).

    Attributes: other null lnk .CG notCG

  11. ACCGANGCHUNK lnk stc Type: lnk

    The gang static-scheduling chunk size. First argument is the link to the next clause. Second argument is the chunk size. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  12. ACCWORKER lnk stc Type: lnk

    The iterations of the loop will be executed in across workers on the accelerator First argument is the link to the next clause. Second argument is the number of workers. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  13. ACCSEQ lnk stc Type: lnk

    The iterations of the loop will be executed sequentially on the accelerator. First argument is the link to the next clause. Second argument is the block size, if any. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  14. ACCHOST lnk stc Type: lnk

    The iterations of the loop will be executed on the host. First link is the link to the next clause. Second link is the block size, if any. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  15. ACCSHORTLOOP stc Type: lnk

    Trip count is less than the maximum size of a vector operation (for vector schedule) or less than the maximum number of simultaneously active parallel iterations (for parallel schedule) First link is the link to the next clause. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  16. ACCTILE lnk stc stc Type: lnk

    Tile this loop. First link is to the next clause. Second link is to a list of ACCSIZE ILI. Third argument is the tile depth. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  17. ACCSIZE lnk Type: lnk

    A size expression. The first link is to the next size expression, if any, or to NULL. The second link is the expression, if any, or to NULL.

    Attributes: other null lnk .CG notCG

ACCINDEPENDENT

The iterations of the loop are data-independent. Link to the next clause.

Attributes: other null lnk .CG notCG

  1. ACCNUMGANGS lnk stc stc Type: lnk

    How many gangs to instantiate. First link is the link to the next clause. Second argument is the number of gangs. Third argument is the device_type argument. Fourth argument is the dimension, where the default is dimension zero (cuda X dimension).

    Attributes: other null lnk .CG notCG

  2. ACCNUMWORKERS lnk stc Type: lnk

    How many workers to instantiate. First link is the link to the next clause. Second argument is the number of workers. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  3. ACCVLENGTH lnk stc Type: lnk

    How long a vector to instantiate. First link is the link to the next clause. Second argument is the vector length expression. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  4. ACCIF lnk Type: lnk

    Region will execute conditionally on host or accelerator. First link is the link to the next clause. Second link is the conditional expression.

    Attributes: other null lnk .CG notCG

  5. ACCDEVID lnk stc Type: lnk

    Device ID of the device to use for this directive or construct. First link is the link to the next clause. Second link is the device ID expression. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

  6. ACCUNROLL lnk stc stc Type: lnk

    Control loop unrolling; the 3rd element tells whether it’s the parallel, vector, or sequential loop to be unrolled First link is the link to the next clause. Second link is the unroll expression, which must be a constant. Third argument is 1 to unroll sequential loop, 2 to unroll parallel/gang loop, 3 to unroll vector loop, 0 to unroll the original loop. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

ACCKERNEL

Mark this loop as the kernel loop; link to other arguments.

Attributes: other null lnk .CG notCG

  1. ACCTRIPLE lnk lnk lnk Type: lnk

    Specify bounds of sub-arrays in accelerator clauses. First link to subsequent ACCTRIPLE. Second link to lower bound, third to upper bound, last to stride.

    Attributes: other null lnk .CG notCG

ACCDATAREG

Generate data movement to/from accelerator. Link to list of arguments.

Attributes: other null trm .CG notCG

ACCENTERDATA

Generate data movement at enter data directive. Link to list of arguments.

Attributes: other null trm .CG notCG

ACCEXITDATA

Generate data movement at exit data directive. Link to list of arguments.

Attributes: other null trm .CG notCG

ACCFINALEXITDATA

Generate data movement at exit data directive with finalize clause. Link to list of arguments.

Attributes: other null trm .CG notCG

ACCENDDATAREG

Generate matching data movement to/from accelerator

Attributes: other null trm .CG notCG

  1. ACCPHI stc stc Type: lnk

    PHI operator used in accelerator optimizing code generator. Link points to ACCPHILINK, and the 2nd operand is a symbol numbering. 3rd operand is nonzero for loop header phi

    Attributes: other null trm .CG notCG notAILI accel

  2. ACCLHPHI stc Type: lnk

    PHI operator for loop headers used in accelerator optimizing code generator. Link points to ACCPHILINK, and the 2nd operand is a symbol numbering.

    Attributes: other null trm .CG notCG notAILI accel

  3. ACCPHILINK lnk Type: lnk

    PHI operator for loop headers used in accelerator optimizing code generator. First link is to next PHILINK, 2nd link is the chain to the reaching def.

    Attributes: other null lnk .CG notCG notAILI accel

ACCINIT

Dummy initial value for factored use-def chains. First link is to next PHILINK, 2nd link is the chain to the reaching def.

Attributes: other null trm .CG notCG notAILI accel

ACCVAR

Used in accelerator optimizing code generator, a builtin variable ref.

Attributes: other null lnk .CG notCG notAILI accel

  1. ACCLDSYM stc Type: stc

    Used in accelerator optimizing code generator, a load of a temp variable

    Attributes: other null lnk .CG notCG notAILI accel

  2. ACCSTSYM stc stc Type: lnk

    Used in accelerator optimizing code generator, a load of a temp variable

    Attributes: other null trm .CG notCG notAILI accel

  3. ACCIVAL stc Type: stc

    Used in accelerator optimizing code generator, a literal constant; uses two operands to hold an ISZ_T value.

    Attributes: other null lnk .CG notCG notAILI accel

  4. ACCJSR lnk Type: stc

    Used in accelerator optimizing code generator, special routine call

    Attributes: other null lnk .CG notCG notAILI accel

  5. ACCRETURN lnk Type: stc

    Used in accelerator optimizing code generator, return value from a function call Short constant holds the return datatype.

    Attributes: other null lnk .CG notCG notAILI accel

  6. ACCLOR lnk Type: lnk

    Used in accelerator optimizing code generator, logical OR

    Attributes: other null lnk .CG notCG notAILI accel

  7. ACCCAST stc Type: lnk

    Used in accelerator optimizing code generator, type casting

    Attributes: other null lnk .CG notCG notAILI accel

  8. ACCJMP sym Type: lnk

    Used in accelerator optimizing code generator, conditional jump The ‘sym’ is a normally an ACBLK index. During linearization, the ‘stc’ will be a symbol index if positive and an ACBLK index negated if negative, until ‘acc_replace_labels’.

    Attributes: branch null trm .CG notCG notAILI accel

  9. ACCARG lnk Type: lnk

    Used in accelerator optimizing code generator, argument list

    Attributes: other null lnk .CG notCG notAILI accel

  10. ACCBOUND lnk stc stc Type: lnk

    Used in accelerator optimizing code generator, array bounds check. Fields are subscript expression, ACCBOUND2, line number, array symbol

    Attributes: other null lnk .CG notCG notAILI accel

  11. ACCBOUND2 lnk stc Type: lnk

    Used in accelerator optimizing code generator, array bounds check. Fields are lower bound, upper bound, subscript number.

    Attributes: other null lnk .CG notCG notAILI accel

  12. ACCWAIT stc Type: lnk

    Used in accelerator code, wait on the host for each kernel to finish. Link to next argument. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG notAILI

ACCNOWAIT

Used in accelerator code, don’t wait on the host for each kernel to finish. Link to next argument.

Attributes: other null lnk .CG notCG notAILI

  1. ACCASYNC lnk stc Type: lnk

    Used in accelerator code, perform this activity asynchronously. First link to next argument. Second link to async expression. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG notAILI

ACCWAITDIR

Used in accelerator code, wait on the host for async activities to finish. Link to list of clauses.

Attributes: other null trm .CG notCG notAILI

  1. ACCWAITARG lnk stc Type: lnk

    Used in accelerator code, wait on the host for async activities to finish. First link to next argument. Second link to async expression. Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG notAILI

  2. ACCLOOP stc sym Type: lnk

    Used in accelerator code, to generate an explicit ‘vector’ loop. The first argument is the trip count, the second is an accelerator symbol number of the loop variable. The third argument is the label of the exit branch.

    Attributes: branch null trm .CG notCG notAILI accel

ACCENDLOOP

Used in accelerator code, to end an explicit ‘vector’ loop. The argument is the label of the top of the loop.

Attributes: branch null trm .CG notCG notAILI accel

  1. ARGQP lnk Type: dplnk

    Defines a quad precision memory argument. 'dplnk’ points to the register value of the argument. 'lnk’ points to the next ARG ILI.

    Attributes: define null lnk .CG memarg “movupd” sse_avx*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  2. ARG256 lnk Type: dplnk

    Defines a 256-bit memory argument. 'dplnk’ points to the register value of the argument. 'lnk’ points to the next ARG ILI.

    Attributes: define null lnk .CG memarg “vmovupd” ‘y’ avx_only*ld* double fadd fmul fst lat(3)

    st direct fst lat(2)

    direct fadd fmul lat(2)

  3. GENARG lnk stc stc Type: lnk

    Define an argument for a function call. The ARG ILIs for all of a function’s arguments are linked together. 'lnk1’ points to the argument. 'lnk2’ points to the next ARG ILI. 'stc1’ is the datatype of the argument, if available 'stc2’ is the NME

    Attributes: define null lnk .CG notCG

  4. GENARG2 lnk stc stc Type: lnk

    Define 2nd argument of an argument pair for a function call. This will be linked immediately to the matching GENARG The ARG ILIs for all of a function’s arguments are linked together. 'lnk1’ points to the argument. 'lnk2’ points to the next ARG ILI. 'stc1’ is the datatype of the argument, if available 'stc2’ is the NME

    Attributes: define null lnk .CG notCG

  5. RETURN stc nme Type: lnk

    Define return value from a function. 'lnk’ points to the return value. 'stc’ is the datatype of the argument. 'nme’ is the nme of the argument

    Attributes: move null trm .CG notCG

KERNEL

Start a nest of loops to be turned into CUDA kernels

Attributes: other null trm .CG notCG

ENDKERNEL

End a nest of loops to be turned into CUDA kernels

Attributes: other null trm .CG notCG

  1. KERNELBLOCK lnk stc Type: lnk

    Block size for one kernel loop. The constant is the loop nest level.

    Attributes: other null trm .CG notCG

  2. KERNELGRID lnk stc Type: lnk

    Grid size for one kernel loop. The constant is the loop nest level.

    Attributes: other null trm .CG notCG

  3. KERNELNEST stc Type: lnk

    nest depth of kernel loops

    Attributes: other null trm .CG notCG

  4. KERNELSTREAM stc Type: lnk

    stream argument to CUF kernel

    Attributes: other null trm .CG notCG

  5. KERNELDEVICE stc Type: lnk

    device argument to CUF kernel

    Attributes: other null trm .CG notCG

  6. ACCIMPDATAREG stc Type: lnk

    Generate data movement to/from accelerator. This is for the implicit data region; the constant is normally zero, but is ‘1’ when there is a need for a pgi_cu_init call regardless of whether there is any data to move or allocate

    Attributes: other null trm .CG notCG

ACCENDIMPDATAREG

Generate matching data movement to/from accelerator This is for the implicit data region The short constant tells how many implicit data regions were generated

Attributes: other null trm .CG notCG

  1. ACCMIRROR lnk lnk sym Type: lnk

    Variable or array will be mirrored on the device as on the host

    Attributes: other null lnk .CG notCG

  2. ACCREFLECT lnk lnk sym Type: lnk

    Variable or array has been reflected on the device as on the host

    Attributes: other null lnk .CG notCG

  3. ACCREDUCTION lnk lnk stc Type: lnk

    Variable is a reduction variable. ‘stc’ is the operator.

    Attributes: other null lnk .CG notCG

  4. ACCCACHEDIR stc Type: lnk

    Accelerator CACHE directive. The ‘stc’ argument is normally zero, but is set to ‘1’ if this is a ‘readonly’ cache directive.

    Attributes: other null lnk .CG notCG

  5. ACCCACHEARG lnk lnk Type: lnk

    Accelerator CACHE argument. First lnk argument is the link to the next ACCCACHEARG or clause. Second is a list of ACCTRIPLE ilis for the array bounds. Third is an ACCSYMLNK.

    Attributes: other null lnk .CG notCG

ACCHOSTDATA

Begin host data region.

Attributes: other null trm .CG notCG

ACCENDHOSTDATA

End host data region.

Attributes: other null trm .CG notCG

  1. ACCUSEDEVICE lnk lnk sym Type: lnk

    Use the device address of a variable or array.

    Attributes: other null lnk .CG notCG

  2. ACCUSEDEVICEIFP lnk lnk sym Type: lnk

    Use the device address of a variable or array, if present

    Attributes: other null lnk .CG notCG

  3. ACCSYMLNK lnk lnk nme Type: sym

    This is used from a link from many other accelerator ILI to recover the original symbol as well as a link to the address tree, if appropriate. Symbol is a symbol pointer. The first link is a link to reference the symbol. The second link is a link to reference the parent of the symbol, if the symbol was a member. The constant value is the NME of the parent, if the symbol was a member.

    Attributes: other null lnk .CG notCG

  4. ACCCOLLAPSE stc stc stc Type: lnk

    Number of loops associated with the loop construct. First link to next argument. Second argument is the collapse depth. Third argument is set if this is a nontightly nested loop (force) Last argument is the device_type argument.

    Attributes: other null lnk .CG notCG

ACCDEFNONE

Tells the accelerator CG that a default-none clause is in effect. The link is to other clauses.

Attributes: other null lnk .CG notCG

ACCDEFPRESENT

Tells the accelerator CG that a default-present clause is in effect. The link is to other clauses.

Attributes: other null lnk .CG notCG

  1. ACCDEVICERES lnk lnk sym Type: lnk

    Variable or array will be resident on the device.

    Attributes: other null lnk .CG notCG

  2. ACCLINK lnk lnk sym Type: lnk

    A link to the variable or array will be resident on the device.

    Attributes: other null lnk .CG notCG

ACCLOOPPRIVATE

The symbol must be made implicitly private in the containing loop.

Attributes: other null trm .CG notCG

  1. ACCJMPTABLE lnk stc Type: lnk

    Used in the Accelerator CG. A jump table. The first link is to a linked list of ACCJMPENTRY ACLILI. The second link is to the expression used to index the table. The ‘stc’ is an ACBLK index of the default jump target.

    Attributes: other null trm .CG notCG

  2. ACCJMPENTRY lnk stc Type: lnk

    Used in the Accelerator CG. A jump table entry. The first link is to the next entry in a linked list of ACCJMPENTRY ACLILI. The second link is to an ACCIVAL that contains the value to match for this jump table entry. The ‘stc’ is an ACBLK index of this jump target.

    Attributes: other null lnk .CG notCG

VCON

Attributes: cons null lnk cse vect .CG notCG

  1. VLD nme stc Type: arlnk

    For all vector ILI except VCON the last operand is the vector dtype

    Attributes: load null lnk vect .CG notCG

  2. VLDU nme stc Type: arlnk

    Attributes: load null lnk vect .CG notCG

  3. VNEG stc Type: lnk

    Attributes: arth null lnk cse vect .CG notCG

  4. VADD lnk stc Type: lnk

    Attributes: arth comm lnk cse vect .CG notCG

  5. VSUB lnk stc Type: lnk

    Attributes: arth null lnk cse vect .CG notCG

  6. VMUL lnk stc Type: lnk

    Attributes: arth comm lnk cse vect .CG notCG

  7. VDIV lnk lnk stc Type: lnk

    Last lnk is a potential mask

    Attributes: arth null lnk cse vect .CG notCG

  8. VDIVZ lnk lnk stc Type: lnk

    Vector divide where divide by zero does not fault.

    Attributes: arth null lnk cse vect .CG notCG

  9. VMOD lnk lnk stc Type: lnk

    Attributes: arth null lnk cse vect .CG notCG

  10. VMODZ lnk lnk stc Type: lnk

    Vector remainder where divide by zero does not fault.

    Attributes: arth null lnk cse vect .CG notCG

  11. VCVTV stc stc Type: lnk

    Attributes: arth null lnk cse vect

  12. VCVTS stc Type: lnk

    Attributes: arth null lnk cse vect .CG notCG

  13. VCVTR stc stc Type: lnk

    Reinterpret the bits of a vector as if they were a different vector type. This should always be a no-op at runtime.

    Attributes: arth null lnk cse vect

  14. VNOT stc Type: lnk

    Attributes: arth null lnk cse vect .CG notCG

  15. VAND lnk stc Type: lnk

    Attributes: arth comm lnk cse vect .CG notCG

  16. VOR lnk stc Type: lnk

    Attributes: arth comm lnk cse vect .CG notCG

  17. VXOR lnk stc Type: lnk

    Attributes: arth comm lnk cse vect .CG notCG

  18. VCMPNEQ lnk stc Type: lnk

    Used for single-precision square root approximation.

    Attributes: arth comm lnk cse vect .CG notCG

  19. VLSHIFTV lnk stc Type: lnk

    Attributes: arth null lnk cse vect .CG notCG

  20. VRSHIFTV lnk stc Type: lnk

    Attributes: arth null lnk cse vect .CG notCG

  21. VLSHIFTS lnk stc Type: lnk

    Attributes: arth null lnk cse vect .CG notCG

  22. VRSHIFTS lnk stc Type: lnk

    Attributes: arth null lnk cse vect .CG notCG

  23. VURSHIFTS lnk stc Type: lnk

    Vector unsigned (logical) right shift by a scalar

    Attributes: arth null lnk cse vect .CG notCG

  24. VMIN lnk stc Type: lnk

    Vector minimum

    Attributes: arth null lnk cse vect .CG notCG

  25. VMAX lnk stc Type: lnk

    Vector maximum

    Attributes: arth null lnk cse vect .CG notCG

  26. VABS stc Type: lnk

    Vector absolute value

    Attributes: arth null lnk cse vect .CG notCG

  27. VSQRT lnk stc Type: lnk

    Vector square root

    Attributes: arth null lnk cse vect .CG notCG

  28. VCOS lnk stc Type: lnk

    Vector cosine - final link is potential mask as it is for all the math intrinsic calls (will be IL_NULL if no mask)

    Attributes: arth null lnk cse vect .CG notCG

  29. VSIN lnk stc Type: lnk

    Vector sine

    Attributes: arth null lnk cse vect .CG notCG

  30. VSINCOS lnk stc Type: lnk

    Vector sine-cosine

    Attributes: arth null lnk cse vect .CG notCG

  31. VASIN lnk stc Type: lnk

    Vector arc sine

    Attributes: arth null lnk cse vect .CG notCG

  32. VACOS lnk stc Type: lnk

    Vector arc cosine

    Attributes: arth null lnk cse vect .CG notCG

  33. VATAN lnk stc Type: lnk

    Vector arctangent

    Attributes: arth null lnk cse vect .CG notCG

  34. VATAN2 lnk lnk stc Type: lnk

    Vector arctangent2

    Attributes: arth null lnk cse vect .CG notCG

  35. VTAN lnk stc Type: lnk

    Vector tangent

    Attributes: arth null lnk cse vect .CG notCG

  36. VSINH lnk stc Type: lnk

    Vector hyperbolic sine

    Attributes: arth null lnk cse vect .CG notCG

  37. VCOSH lnk stc Type: lnk

    Vector hyperbolic cosine

    Attributes: arth null lnk cse vect .CG notCG

  38. VTANH lnk stc Type: lnk

    Vector hyperbolic tangent

    Attributes: arth null lnk cse vect .CG notCG

  39. VEXP lnk stc Type: lnk

    Vector natural exponential

    Attributes: arth null lnk cse vect .CG notCG

  40. VLOG lnk stc Type: lnk

    Vector natural logarithm

    Attributes: arth null lnk cse vect .CG notCG

  41. VLOG10 lnk stc Type: lnk

    Vector logarithm base 10

    Attributes: arth null lnk cse vect .CG notCG

  42. VPOW lnk lnk stc Type: lnk

    Vector pow float lnk

    Attributes: arth null lnk cse vect .CG notCG

  43. VPOWI lnk lnk stc Type: lnk

    Vector pow float to integer

    Attributes: arth null lnk cse vect .CG notCG

  44. VPOWK lnk lnk stc Type: lnk

    Vector pow double to integer*8

    Attributes: arth null lnk cse vect .CG notCG

  45. VPOWIS lnk lnk stc Type: lnk

    Vector pow float to scalar integer

    Attributes: arth null lnk cse vect .CG notCG

  46. VPOWKS lnk lnk stc Type: lnk

    Vector pow double to scalar integer*8

    Attributes: arth null lnk cse vect .CG notCG

  47. VFPOWK lnk lnk stc Type: lnk

    Vector pow float to integer*8

    Attributes: arth null lnk cse vect .CG notCG

  48. VFPOWKS lnk lnk stc Type: lnk

    Vector pow float to scalar integer*8

    Attributes: arth null lnk cse vect .CG notCG

  49. VDPOWI lnk lnk stc Type: lnk

    Vector pow double to integer

    Attributes: arth null lnk cse vect .CG notCG

  50. VDPOWIS lnk lnk stc Type: lnk

    Vector pow double to scalar integer

    Attributes: arth null lnk cse vect .CG notCG

  51. VRSQRT lnk stc Type: lnk

    Vector reciprocal square root

    Attributes: arth null lnk cse vect .CG notCG

  52. VFLOOR lnk stc Type: lnk

    Vector floor

    Attributes: arth null lnk cse vect .CG notCG

  53. VCEIL lnk stc Type: lnk

    Vector ceiling

    Attributes: arth null lnk cse vect .CG notCG

  54. VAINT lnk stc Type: lnk

    Vector truncation

    Attributes: arth null lnk cse vect .CG notCG

  55. VRCP lnk stc Type: lnk

    Vector reciprocal

    Attributes: arth null lnk cse vect .CG notCG

  56. VST arlnk nme stc Type: lnk

    Attributes: store null trm vect .CG terminal notCG

  57. VSTU arlnk nme stc Type: lnk

    Attributes: store null trm vect .CG terminal notCG

  58. VFMA1 lnk lnk stc Type: lnk

    Vector FMA for LLVM intrinsic - lnk1*lnk2+lnk3, with stc the dtype

    Attributes: arth null lnk cse vect .CG notCG

  59. VFMA2 lnk lnk stc Type: lnk

    Vector FMA for LLVM intrinsic - lnk1*lnk2-lnk3, with stc the dtype

    Attributes: arth null lnk cse vect .CG notCG

  60. VFMA3 lnk lnk stc Type: lnk

    Vector FMA for LLVM intrinsic - -lnk1*lnk2+lnk3, with stc the dtype

    Attributes: arth null lnk cse vect .CG notCG

  61. VFMA4 lnk lnk stc Type: lnk

    Vector FMA for LLVM intrinsic - -lnk1*lnk2-lnk3, with stc the dtype

    Attributes: arth null lnk cse vect .CG notCG

  62. VPERMUTE lnk lnk stc Type: lnk

    Shuffle contents of vector registers. lnk1 and lnk2 can be the same vector or lnk2 can be null. lnk1 dtype is used as dtype for both lnk1 and lnk2, unless lnk2 is null. stc is the result dtype, lnk3 is a vector constant representing a mask where each field represents which L-to-R element of concatenated <lnk1,lnk2> vector is to be placed in corresponding result field. lnk3 size must match the size of the result vector, but can be different than lnk1 and lnk2’s size.

    Attributes: other null lnk vect .CG notCG

  63. VBLEND lnk lnk stc Type: lnk

    Vector blend/select of lnk2 & lnk3. lnk1 is the mask, stc is the dtype

    Attributes: other null lnk cse vect .CG notCG

  64. VCMP lnk lnk stc Type: stc

    Vector compare of lnk1 & lnk2. stc1 is the condition code, stc2 is the dtype

    Attributes: arth null lnk cse vect .CG notCG

X87CON

x87 80-bit extended precision floating-point constant.

Attributes: cons null x87 cse

  1. X87LD nme stc Type: arlnk

    Load integer or floating-point data into the X87 FPU from memory. ‘stc’ is a MSZ_… memory size/type code.

    Attributes: load null x87 .CG asm_special

  2. X87ST arlnk nme stc Type: x87lnk

    Store, possibly with conversion, data from the X87 FPU to memory. ‘stc’ is a MSZ_… memory size/type code.

    Attributes: store null trm .CG asm_special terminal

X87ABS

x87 80-bit extended precision absolute value.

Attributes: arth null x87 cse .CG “fabs”

X87CHS

x87 80-bit extended precision negation.

Attributes: arth null x87 cse .CG “fchs”

X87RNDINT

x87 80-bit extended precision round to integer with current rounding mode.

Attributes: arth null x87 cse .CG “frndint”

  1. X87ADD x87lnk Type: x87lnk

    x87 80-bit extended precision floating-point addition.

    Attributes: arth comm x87 cse .CG “fadd” asm_special

  2. X87SUB x87lnk Type: x87lnk

    x87 80-bit extended precision floating-point subtraction.

    Attributes: arth null x87 cse .CG “fsub” asm_special

  3. X87MUL x87lnk Type: x87lnk

    x87 80-bit extended precision multiply.

    Attributes: arth comm x87 cse .CG “fmul” asm_special

  4. X87DIV x87lnk Type: x87lnk

    x87 80-bit extended precision divide.

    Attributes: arth null x87 cse .CG “fdiv” asm_special

  5. X87CMP x87lnk stc Type: x87lnk

    x87 80-bit extended precision comparison.

    Attributes: arth null ir cse .CG “fucomi” asm_special ccmod

  6. X87CMOV x87lnk x87lnk Type: irlnk

    Select op2 if X87CMP test in op1 is satisfied, else op3.

    Attributes: other null x87 cse .CG “fcmov” asm_special

  7. X87ARG lnk Type: x87lnk

    Defines an x87 80-bit extended precision value to be passed as an argument to a function call via memory. 'x87lnk’ points to the value of the argument. 'lnk’ points to the next ARG ILI.

    Attributes: define null lnk .CG memarg “fstpt”

X87TOINT

Convert an x87 80-bit extended precision value to a signed integer Used by LLVM only.

Attributes: arth null ir cse .CG notCG

X87TOUINT

Convert an x87 80-bit extended precision value to an unsigned integer Used by LLVM only.

Attributes: arth null ir cse .CG notCG

X87TOKINT

Convert an x87 80-bit extended precision value to a long long integer Used by LLVM only.

Attributes: arth null kr cse .CG notCG

X87TOUKINT

Convert an x87 80-bit extended precision value to an unsigned long long integer Used by LLVM only.

Attributes: arth null kr cse .CG notCG

X87TOSP

Convert an x87 80-bit extended precision value single precision Used by LLVM only.

Attributes: arth null sp cse .CG notCG

X87TODP

Convert an x87 80-bit extended precision value to double precision Used by LLVM only.

Attributes: arth null dp cse .CG notCG

X87FROMINT

Convert a signed integer to an x87 80-bit extended precision value Used by LLVM only.

Attributes: arth null x87 cse .CG notCG

X87FROMUINT

Convert an unsigned integer to an x87 80-bit extended precision value Used by LLVM only.

Attributes: arth null x87 cse .CG notCG

X87FROMKINT

Convert a long long to an x87 80-bit extended precision value Used by LLVM only.

Attributes: arth null x87 cse .CG notCG

X87FROMUKINT

Convert an unsigned long long to an x87 80-bit extended precision value Used by LLVM only.

Attributes: arth null x87 cse .CG notCG

X87FROMSP

Convert a float to an x87 80-bit extended precision value Used by LLVM only.

Attributes: arth null x87 cse .CG notCG

X87FROMDP

Convert a double to an x87 80-bit extended precision value Used by LLVM only.

Attributes: arth null x87 cse .CG notCG

  1. X87RETURN stc Type: x87lnk

    Define a x87 80-bit extended precision real function result. Appears twice for complex-valued function results, in which case the imaginary part is returned first so that the real part is returned on top of the stack.

    Attributes: define null trm .CG terminal asm_nop

  2. X87RESULT stc Type: lnk

    Acquire the x87 80-bit extended precision result of a function call. Appears twice for complex-valued function calls, in which case the first acquires the real part and the second acquires the imaginary part.

    Attributes: define null x87 dom .CG terminal asm_nop

X87FREE

Attributes: other null trm .CG terminal notAILI

X87CSE

Attributes: arth null x87 .CG notCG

X87XCH

Exchanges the top of the x87 floating-point register stack with another entry.

Attributes: define null x87 .CG CGonly “fxch”

X87POP

Pops an entry from the x87 floating-point register stack.

Attributes: define null x87 .CG CGonly “fstp” asm_special

X87DUP

Duplicates an entry on the x87 floating-point register stack.

Attributes: define null x87 .CG CGonly “fld” asm_special

  1. BCONCUR lnk Type: sym

    Start auto parallel region of an outlined function sym.

    Attributes: other null trm .CG notCG

ECONCUR

End auto parallel region of an outlined function sym.

Attributes: other null trm .CG notCG

  1. HFADD hplnk Type: hplnk

    Half-precision floating-point addition.

    Attributes: arth comm hp cse .CG notCG

HFNEG

Half-precision negation.

Attributes: arth null hp cse .CG notCG

  1. HFSUB hplnk Type: hplnk

    Half-precision floating-point subtraction.

    Attributes: arth null hp cse .CG notCG

  2. HFMUL hplnk Type: hplnk

    Half-precision floating-point multiply.

    Attributes: arth comm hp cse .CG notCG

  3. HFDIV hplnk Type: hplnk

    Half-precision divide.

    Attributes: arth null hp cse .CG notCG

  4. HFCMP hplnk stc Type: hplnk

    Half float compare with result of true or false.

    Attributes: arth null ir cse .CG notCG

  5. HFCMPZ stc Type: hplnk

    Half float compare with zero; result is TRUE or FALSE.

    Attributes: arth null ir cse .CG notCG

  6. DFRHP hp Type: lnk

    Define half precision function result.

    Attributes: define null hp cse .CG terminal asm_nop

HFCON

Half-precision floating-point constant.

Attributes: cons null hp cse .CG notCG

  1. LDHP nme stc Type: arlnk

    Load half-precision floating value. ‘stc’ is not used.

    Attributes: load null hp .CG notCG

HP2SP

Half precison to single precision conversion.

Attributes: arth null sp .CG notCG

SP2HP

Single precison to half precision conversion.

Attributes: arth null hp .CG notCG

DP2HP

Double precison to half precision conversion.

Attributes: arth null hp .CG notCG

  1. STHP arlnk nme stc Type: hplnk

    Store half precision quantity. ‘stc’ must be MSZ_F2.

    Attributes: store null trm .CG notCG

  2. ARGHP lnk Type: hplnk

    Defines a half-precision memory argument. 'hplnk’ points to the register value of the argument. 'lnk’ points to the next ARG ILI.

    Attributes: define null lnk .CG notCG

CSEHP

Half precision register cse.

Attributes: arth null hp .CG notCG

  1. HFCJMP hplnk stc sym Type: hplnk

    Half precision compare and jump to the label ‘sym’ if the condition, denoted by stc, is true.

    Attributes: branch null trm dom .CG terminal conditional_branch notAILI

  2. HFCJMPZ stc sym Type: hplnk

    Half precision compare with zero and branch to label ‘sym’.

    Attributes: branch null trm dom .CG notCG conditional_branch

  3. MVHP ir Type: hplnk

    Move half FP value into specific integer register, ir.

    Attributes: move null trm .CG terminal notAILI ‘l’

  4. HFMAX hplnk Type: hplnk

    Half-precision max

    Attributes: arth comm hp cse .CG notCG

  5. HFMIN hplnk Type: hplnk

    Half-precision min

    Attributes: arth comm hp cse .CG notCG

  6. LDQP nme stc Type: arlnk

    Load quad-precision floating value. ‘stc’ is not used.

    Attributes: load null qp .CG notCG

  7. STQP arlnk nme stc Type: qplnk

    Store quad precision quantity. ‘stc’ must be MSZ_F16.

    Attributes: store null trm .CG notCG

  8. QADD qplnk Type: qplnk

    quad-precision floating-point addition.

    Attributes: arth comm qp cse .CG notCG .so ilitp_atomic.n

MFENCE

x86 MFENCE instruction.

Attributes: other null trm fence .CG CGonly terminal “mfence”

X86XCHG

x86 XCHG instruction. Used only in AILI, and only with memory operand as destination. Always immediately followed by a DEF instruction that defines the same register as the source operand of the XCHG.

Attributes: other null ir .CG CGonly “xchg”

X86XADD

x86 XADD instruction. Use and constraints are same as for XCHG.

Attributes: other null ir .CG CGonly “xadd”

X86CMPXCHG

x86 CMPXCHG instruction. Used only in AILI, and only with memory operand as destination. Always immediately followed by a DEF instruction that defines the same register as the second source operand (comparand), which must be one of AL, AX, EAX, RAX.

Attributes: other null ir .CG CGonly “cmpxchg” ccmod