Skip to content
Surf Wiki
Save to docs
technology/computing

From Surf Wiki (app.surf) — the open knowledge base

XOP instruction set

Computer instruction set introduced by AMD in 2009


Summary

Computer instruction set introduced by AMD in 2009

The XOP (eXtended Operations However AMD removed support for XOP from Zen (microarchitecture) onward.

The XOP instruction set contains several different types of vector instructions since it was originally intended as a major upgrade to SSE. Most of the instructions are integer instructions, but it also contains floating point permutation and floating point fraction extraction instructions. See the index for a list of instruction types.

History

Main article: SSE5

XOP is a revised subset of what was originally intended as SSE5. It was changed to be similar but not overlapping with AVX, parts that overlapped with AVX were removed or moved to separate standards such as FMA4 (floating-point vector multiply–accumulate) and CVT16 (Half-precision floating-point conversion implemented as F16C by Intel).

All SSE5 instructions that were equivalent or similar to instructions in the AVX and FMA4 instruction sets announced by Intel have been changed to use the coding proposed by Intel. Integer instructions without equivalents in AVX were classified as the XOP extension. The XOP instructions have an opcode byte 8F (hexadecimal), but otherwise almost identical coding scheme as AVX with the 3-byte VEX prefix.

Commentators have seen this as evidence that Intel has not allowed AMD to use any part of the large VEX coding space. AMD has been forced to use different codes in order to avoid using any code combination that Intel might possibly be using in its development pipeline for something else. The XOP coding scheme is as close to the VEX scheme as technically possible without risking that the AMD codes overlap with future Intel codes. This inference is speculative, since no public information is available about negotiations between the two companies on this issue.

The use of the 8F byte requires that the m-bits (see VEX coding scheme) have a value larger than or equal to 8 in order to avoid overlap with existing instructions.Byte value 0x8F is an existing opcode for a POP instruction. This instruction uses the ModR/M byte, which follows the opcode, but it does not make use of the "reg" (register) field, which is bits 3-5. Some opcodes which don't use "reg" multiplex instructions by using these bits to signify eight different instructions (0x80-0x83 and 0xD0-0xDF, among others); 0x8F does not. This means, for a standard POP instruction, bits 3-5 should always be zero. Since the m-bits are bits 0-4, requiring a value 8 or higher sets bit 3 of the byte following 0x8F. The C4 byte used in the VEX scheme has no such restriction. This may prevent the use of the m-bits for other purposes in the future in the XOP scheme, but not in the VEX scheme. Another possible problem is that the pp bits have the value 00 in the XOP scheme, while they have the value 01 in the VEX scheme for instructions that have no legacy equivalent. This may complicate the use of the pp bits for other purposes in the future.

A similar compatibility issue is the difference between the FMA3 and FMA4 instruction sets. Intel initially proposed FMA4 in AVX/FMA specification version 3 to supersede the 3-operand FMA proposed by AMD in SSE5. After AMD adopted FMA4, Intel canceled FMA4 support and reverted to FMA3 in the AVX/FMA specification version 5 (See FMA history).

In March 2015, AMD explicitly revealed in the description of the patch for the GNU Binutils package that Zen, its third-generation x86-64 architecture in its first iteration (znver1 – Zen, version 1), will not support TBM, FMA4, XOP and LWP instructions developed specifically for the "Bulldozer" family of micro-architectures.

Integer vector multiply–accumulate instructions

These are integer version of the FMA instruction set. These are all four operand instructions similar to FMA4 and they all operate on signed integers.

InstructionDescriptionOperation`VPMACSWW`, `VPMACSSWW``VPMACSWD`, `VPMACSSWD``VPMACSDD`, `VPMACSSDD``VPMACSDQL`, `VPMACSSDQL``VPMACSDQH`, `VPMACSSDQH``VPMADCSWD`, `VPMADCSSWD`
Multiply Accumulate (with Saturation) Word to Word2x8 words (, ) + 8 words () → 8 words ()
Multiply Accumulate (with Saturation) Low Word to Doubleword2x8 words (, ) + 4 doublewords () → 4 doublewords ()
Multiply Accumulate (with Saturation) Doubleword to Doubleword2x4 doublewords (, ) + 4 doublewords () → 4 doublewords ()
Multiply Accumulate (with Saturation) Low Doubleword to Quadword2x4 doublewords (, ) + 2 quadwords () → 2 quadwords ()
Multiply Accumulate (with Saturation) High Doubleword to Quadword2x4 doublewords (, ) + 2 quadwords () → 2 quadwords ()
Multiply Add Accumulate (with Saturation) Word to Doubleword2x8 words (, ) + 4 doublewords () → 4 doublewords ()

Integer vector horizontal addition

Horizontal addition instructions adds adjacent values in the input vector to each other. The output size in the instructions below describes how wide the horizontal addition performed is. For instance horizontal byte to word adds two bytes at a time and returns the result as vector of words, but byte to quadword adds eight bytes together at a time and returns the result as vector of quadwords. Six additional horizontal addition and subtraction instructions can be found in SSSE3, but they operate on two input vectors and only does two and two operations.

InstructionDescriptionOperation`VPHADDBW`, `VPHADDUBW``VPHADDBD`, `VPHADDUBD``VPHADDBQ`, `VPHADDUBQ``VPHADDWD`, `VPHADDUWD``VPHADDWQ`, `VPHADDUWQ``VPHADDDQ`, `VPHADDUDQ``VPHSUBBW``VPHSUBWD``VPHSUBDQ`
Horizontal add two signed/unsigned bytes to word16 bytes () → 8 words ()
Horizontal add four signed/unsigned bytes to doubleword16 bytes () → 4 doublewords ()
Horizontal add eight signed/unsigned bytes to quadword16 bytes () → 2 quadwords ()
Horizontal add two signed/unsigned words to doubleword8 words () → 4 doublewords ()
Horizontal add four signed/unsigned words to quadword8 words () → 2 quadwords ()
Horizontal add two signed/unsigned doublewords to quadword4 doublewords () → 2 quadwords ()
Horizontal subtract two signed bytes to word16 bytes (5) → 8 words ()
Horizontal subtract two signed words to doubleword8 words () → 4 doublewords ()
Horizontal subtract two signed doublewords to quadword4 doublewords () → 2 quadwords ()

Integer vector compare

This set of vector compare instructions all take an immediate as an extra argument. The immediate controls what kind of comparison is performed. There are eight comparison possible for each instruction. The vectors are compared and all comparisons that evaluate to true set all corresponding bits in the destination to 1, and false comparisons sets all the same bits to 0. This result can be used directly in VPCMOV instruction for a vectorized conditional move.

InstructionDescription`VPCOMB``VPCOMW``VPCOMD``VPCOMQ``VPCOMUB``VPCOMUW``VPCOMUD``VPCOMUQ`
Compare Vector Signed Bytes
Compare Vector Signed Words
Compare Vector Signed Doublewords
Compare Vector Signed Quadwords
Compare Vector Unsigned Bytes
Compare Vector Unsigned Words
Compare Vector Unsigned Doublewords
Compare Vector Unsigned Quadwords
ImmediateComparison
000Less Than
001Less Than or Equal
010Greater Than
011Greater Than or Equal
100Equal
101Not Equal
110False
111True

Vector conditional move

VPCMOV works as bitwise variant of the blend instructions in SSE4. Like the AVX instruction VPBLENDVB, it is a four-operand instruction with three source operands and a destination. For each bit in the third operand (which acts as a selector), 1 selects the same bit in the first source, and 0 selects the same in the second source. When used together with the XOP vector comparison instructions above this can be used to implement a vectorized ternary move, or if the second input is the same as the destination, a conditional move (CMOV).

InstructionDescription
`VPCMOV`Vector Conditional Move

Integer vector shift and rotate instructions

The shift instructions here differ from those in SSE2 in that they can shift each unit with a different amount using a vector register interpreted as packed signed integers. The sign indicates the direction of shift or rotate, with positive values causing left shift and negative right shift Intel has specified a different incompatible set of variable vector shift instructions in AVX2.

InstructionDescription`VPROTB``VPROTW``VPROTD``VPROTQ``VPSHAB``VPSHAW``VPSHAD``VPSHAQ``VPSHLB``VPSHLW``VPSHLD``VPSHLQ`
Packed Rotate Bytes
Packed Rotate Words
Packed Rotate Doublewords
Packed Rotate Quadwords
Packed Shift Arithmetic Bytes
Packed Shift Arithmetic Words
Packed Shift Arithmetic Doublewords
Packed Shift Arithmetic Quadwords
Packed Shift Logical Bytes
Packed Shift Logical Words
Packed Shift Logical Doublewords
Packed Shift Logical Quadwords

Vector permute

VPPERM is a single instruction that combines the SSSE3 instruction PALIGNR and PSHUFB and adds more to both. Some compare it the Altivec instruction VPERM. It takes three registers as input, the first two are source registers and the third the selector register. Each byte in the selector selects one of the bytes in one of the two input registers for the output. The selector can also apply effects on the selected bytes such as setting it to 0, reverse the bit order, and repeating the most-significant bit. All of the effects or the input can in addition be inverted.

The VPERMIL2PD and VPERMIL2PS instructions are two source versions of the VPERMILPD and VPERMILPS instructions in AVX which means like VPPERM they can select output from any of the fields in the two inputs.

InstructionDescription`VPPERM``VPERMIL2PD``VPERMIL2PS`
Packed Permute Byte
Permute Two-Source Double-Precision Floating-Point
Permute Two-Source Single-Precision Floating-Point

Floating-point fraction extraction

These instructions extracts the fractional part of floating point, that is the part that would be lost in conversion to integer.

InstructionDescription`VFRCZPD``VFRCZPS``VFRCZSD``VFRCZSS`
Extract Fraction Packed Double-Precision Floating-Point
Extract Fraction Packed Single-Precision Floating-Point
Extract Fraction Scalar Double-Precision Floating-Point
Extract Fraction Scalar Single-Precision Floating Point

CPUs with XOP

  • AMD:
    • "Heavy Equipment" processors
      • Bulldozer-based processors, Q4 2011
      • Piledriver-based processors, Q4 2012
      • Steamroller-based processors, Q1 2014
      • Excavator-based processors (including "v2"), 2015

Notes

References

References

  1. (May 1, 2009). "AMD64 Architecture Programmer's Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions". [[AMD]].
  2. Michael Larabel. (March 3, 2017). "The Impact Of GCC Zen Compiler Tuning On AMD Ryzen Performance".
  3. Dave Christie. (2009-05-07). "Striking a balance". AMD Developer blogs.
  4. Agner Fog. (December 5, 2009). "Stop the instruction set war".
  5. (January 2009). "Intel Advanced Vector Extensions Programming Reference".
  6. Ganesh Gopalasubramanian. (March 10, 2015). "[PATCH] add znver1 processor.".
  7. Amit Pawar. (August 7, 2015). "[PATCH] Remove CpuFMA4 From Znver1 CPU Flags".
  8. "AMD64 Architecture Programmer's Manual, Volume4: 128-Bit and 256-Bit Media Instructions". [[AMD]].
  9. "New "Bulldozer" and "Piledriver" Instructions". [[AMD]].
  10. "Intel Architecture Instruction Set Extensions Programming Reference". [[Intel]].
  11. "Buldozer x264 optimisations".
  12. Dave Christie. (2009-05-07). "Striking a balance". AMD Developer blogs.
  13. (October 2012). "New "Bulldozer" and "Piledriver" Instructions". AMD.
Wikipedia Source

This article was imported from Wikipedia and is available under the Creative Commons Attribution-ShareAlike 4.0 License. Content has been adapted to SurfDoc format. Original contributors can be found on the article history page.

Want to explore this topic further?

Ask Mako anything about XOP instruction set — get instant answers, deeper analysis, and related topics.

Research with Mako

Free with your Surf account

Content sourced from Wikipedia, available under CC BY-SA 4.0.

This content may have been generated or modified by AI. CloudSurf Software LLC is not responsible for the accuracy, completeness, or reliability of AI-generated content. Always verify important information from primary sources.

Report