SSE4

From HandWiki
Short description: SIMD CPU instruction set

SSE4 (Streaming SIMD Extensions 4) is a SIMD CPU instruction set used in the Intel Core microarchitecture and AMD K10 (K8L). It was announced on September 27, 2006, at the Fall 2006 Intel Developer Forum, with vague details in a white paper;[1] more precise details of 47 instructions became available at the Spring 2007 Intel Developer Forum in Beijing, in the presentation.[2] SSE4 is fully compatible with software written for previous generations of Intel 64 and IA-32 architecture microprocessors. All existing software continues to run correctly without modification on microprocessors that incorporate SSE4, as well as in the presence of existing and new applications that incorporate SSE4.[3]

SSE4 subsets

Intel SSE4 consists of 54 instructions. A subset consisting of 47 instructions, referred to as SSE4.1 in some Intel documentation, is available in Penryn. Additionally, SSE4.2, a second subset consisting of the 7 remaining instructions, is first available in Nehalem-based Core i7. Intel credits feedback from developers as playing an important role in the development of the instruction set.

Starting with Barcelona-based processors, AMD introduced the SSE4a instruction set, which has 4 SSE4 instructions and 4 new SSE instructions. These instructions are not found in Intel's processors supporting SSE4.1 and AMD processors only started supporting Intel's SSE4.1 and SSE4.2 (the full SSE4 instruction set) in the Bulldozer-based FX processors. With SSE4a the misaligned SSE feature was also introduced which meant unaligned load instructions were as fast as aligned versions on aligned addresses. It also allowed disabling the alignment check on non-load SSE operations accessing memory.[4] Intel later introduced similar speed improvements to unaligned SSE in their Nehalem processors, but did not introduce misaligned access by non-load SSE instructions until AVX.[5]

Name confusion

What is now known as SSSE3 (Supplemental Streaming SIMD Extensions 3), introduced in the Intel Core 2 processor line, was referred to as SSE4 by some media until Intel came up with the SSSE3 moniker. Internally dubbed Merom New Instructions, Intel originally did not plan to assign a special name to them, which was criticized by some journalists.[6] Intel eventually cleared up the confusion and reserved the SSE4 name for their next instruction set extension.[7]

Intel is using the marketing term HD Boost to refer to SSE4.[8]

New instructions

Unlike all previous iterations of SSE, SSE4 contains instructions that execute operations which are not specific to multimedia applications. It features a number of instructions whose action is determined by a constant field and a set of instructions that take XMM0 as an implicit third operand.

Several of these instructions are enabled by the single-cycle shuffle engine in Penryn. (Shuffle operations reorder bytes within a register.)

SSE4.1

These instructions were introduced with Penryn microarchitecture, the 45 nm shrink of Intel's Core microarchitecture. Support is indicated via the CPUID.01H:ECX.SSE41[Bit 19] flag.

Instruction Description
MPSADBW Compute eight offset sums of absolute differences, four at a time (i.e., |x0−y0|+|x1−y1|+|x2−y2|+|x3−y3|, |x0−y1|+|x1−y2|+|x2−y3|+|x3−y4|, ..., |x0−y7|+|x1−y8|+|x2−y9|+|x3−y10|); this operation is important for some HD codecs, and allows an 8×8 block difference to be computed in fewer than seven cycles.[9] One bit of a three-bit immediate operand indicates whether y0 .. y10 or y4 .. y14 should be used from the destination operand, the other two whether x0..x3, x4..x7, x8..x11 or x12..x15 should be used from the source.
PHMINPOSUW Sets the bottom unsigned 16-bit word of the destination to the smallest unsigned 16-bit word in the source, and the next-from-bottom to the index of that word in the source.
PMULDQ Packed 32-bit signed "long" multiplication, two (1st and 3rd) out of four packed integers multiplied giving two packed 64-bit results.
PMULLD Packed 32-bit signed "low" multiplication, four packed sets of integers multiplied giving four packed 32-bit results.
DPPS, DPPD Dot product for AOS (Array of Structs) data. This takes an immediate operand consisting of four (or two for DPPD) bits to select which of the entries in the input to multiply and accumulate, and another four (or two for DPPD) to select whether to put 0 or the dot-product in the appropriate field of the output.
BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDW Conditional copying of elements in one location with another, based (for non-V form) on the bits in an immediate operand, and (for V form) on the bits in register XMM0.
PMINSB, PMAXSB, PMINUW, PMAXUW, PMINUD, PMAXUD, PMINSD, PMAXSD Packed minimum/maximum for different integer operand types
ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD Round values in a floating-point register to integers, using one of four rounding modes specified by an immediate operand
INSERTPS, PINSRB, PINSRD/PINSRQ, EXTRACTPS, PEXTRB, PEXTRD/PEXTRQ The INSERTPS and PINSR instructions read 8, 16 or 32 bits from an x86 register or memory location and inserts it into a field in the destination register given by an immediate operand. EXTRACTPS and PEXTR read a field from the source register and insert it into an x86 register or memory location. For example, PEXTRD eax, [xmm0], 1; EXTRACTPS [addr+4*eax], xmm1, 1 stores the first field of xmm1 in the address given by the first field of xmm0.
PMOVSXBW, PMOVZXBW, PMOVSXBD, PMOVZXBD, PMOVSXBQ, PMOVZXBQ, PMOVSXWD, PMOVZXWD, PMOVSXWQ, PMOVZXWQ, PMOVSXDQ, PMOVZXDQ Packed sign/zero extension to wider types
PTEST This is similar to the TEST instruction, in that it sets the Z flag to the result of an AND between its operands: ZF is set, if DEST AND SRC is equal to 0. Additionally it sets the C flag if (NOT DEST) AND SRC equals zero.

This is equivalent to setting the Z flag if none of the bits masked by SRC are set, and the C flag if all of the bits masked by SRC are set.

PCMPEQQ Quadword (64 bits) compare for equality
PACKUSDW Convert signed DWORDs into unsigned WORDs with saturation.
MOVNTDQA Efficient read from write-combining memory area into SSE register; this is useful for retrieving results from peripherals attached to the memory bus.

SSE4.2

SSE4.2 added STTNI (String and Text New Instructions),[10] several new instructions that perform character searches and comparison on two operands of 16 bytes at a time. These were designed (among other things) to speed up the parsing of XML documents.[11] It also added a CRC32 instruction to compute cyclic redundancy checks as used in certain data transfer protocols. These instructions were first implemented in the Nehalem-based Intel Core i7 product line and complete the SSE4 instruction set. Support is indicated via the CPUID.01H:ECX.SSE42[Bit 20] flag.

Instruction Description
CRC32 Accumulate CRC32C value using the polynomial 0x11EDC6F41 (or, without the high order bit, 0x1EDC6F41).[12][13]
PCMPESTRI Packed Compare Explicit Length Strings, Return Index
PCMPESTRM Packed Compare Explicit Length Strings, Return Mask
PCMPISTRI Packed Compare Implicit Length Strings, Return Index
PCMPISTRM Packed Compare Implicit Length Strings, Return Mask
PCMPGTQ Compare Packed Signed 64-bit data For Greater Than

POPCNT and LZCNT

These instructions operate on integer rather than SSE registers, because they are not SIMD instructions, but appear at the same time and although introduced by AMD with the SSE4a instruction set, they are counted as separate extensions with their own dedicated CPUID bits to indicate support. Intel implements POPCNT beginning with the Nehalem microarchitecture and LZCNT beginning with the Haswell microarchitecture. AMD implements both beginning with the Barcelona microarchitecture.

AMD calls this pair of instructions Advanced Bit Manipulation (ABM).

Instruction Description
POPCNT Population count (count number of bits set to 1). Support is indicated via the CPUID.01H:ECX.POPCNT[Bit 23] flag.[14]
LZCNT Leading zero count. Support is indicated via the CPUID.80000001H:ECX.ABM[Bit 5] flag.[15]

The encoding of LZCNT takes the same encoding path as the encoding of the BSR (bit scan reverse) instruction. This results in an issue where LZCNT called on some CPUs not supporting it, such as Intel CPUs prior to Haswell, may incorrectly execute the BSR operation instead of raising an invalid instruction exception. This is an issue as the result values of LZCNT and BSR are different.

Trailing zeros can be counted using the BSF (bit scan forward) or TZCNT instructions.

SSE4a

The SSE4a instruction group was introduced in AMD's Barcelona microarchitecture. These instructions are not available in Intel processors. Support is indicated via the CPUID.80000001H:ECX.SSE4A[Bit 6] flag.[15]

Instruction Description
EXTRQ/INSERTQ Combined mask-shift instructions.[16]
MOVNTSD/MOVNTSS Scalar streaming store instructions.[17]

Supporting CPUs

  • Intel
    • Silvermont processors (SSE4.1, SSE4.2 and POPCNT supported)
    • Goldmont processors (SSE4.1, SSE4.2 and POPCNT supported)
    • Goldmont Plus processors (SSE4.1, SSE4.2 and POPCNT supported)
    • Tremont processors (SSE4.1, SSE4.2 and POPCNT supported)
    • Penryn processors (SSE4.1 supported, except Pentium Dual-Core and Celeron)
    • Nehalem processors and Westmere processors (SSE4.1, SSE4.2 and POPCNT supported, except Pentium and Celeron)
    • Sandy Bridge processors and newer (SSE4.1, SSE4.2 and POPCNT supported, include Pentium and Celeron)
    • Haswell processors and newer (SSE4.1, SSE4.2, POPCNT and LZCNT supported)
  • AMD
    • K10-based processors (SSE4a, POPCNT and LZCNT supported)
    • "Cat" low-power processors
      • Bobcat-based processors (SSE4a, POPCNT and LZCNT supported)
      • Jaguar-based processors and newer (SSE4a, SSE4.1, SSE4.2, POPCNT and LZCNT supported)
      • Puma-based processors and newer (SSE4a, SSE4.1, SSE4.2, POPCNT and LZCNT supported)
    • "Heavy Equipment" processors (SSE4a, SSE4.1, SSE4.2, POPCNT and LZCNT supported)
    • Zen-based processors (SSE4a, SSE4.1, SSE4.2, POPCNT and LZCNT supported)
    • Zen+-based processors (SSE4a, SSE4.1, SSE4.2, POPCNT and LZCNT supported)
    • Zen2-based processors (SSE4a, SSE4.1, SSE4.2, POPCNT and LZCNT supported)
    • Zen3-based processors (SSE4a, SSE4.1, SSE4.2, POPCNT and LZCNT supported)
  • VIA
    • Nano 3000, X2, QuadCore processors (SSE4.1 supported)
    • Nano QuadCore C4000-series processors (SSE4.1, SSE4.2 supported)
    • Eden X4 processors (SSE4.1, SSE4.2 supported)
  • Zhaoxin
    • ZX-C processors and newer (SSE4.1, SSE4.2 supported)

References

  1. Intel Streaming SIMD Extensions 4 (SSE4) Instruction Set Innovation , Intel.
  2. Tuning for Intel SSE4 for the 45nm Next Generation Intel Core Microarchitecture , Intel.
  3. "Intel SSE4 Programming Reference". https://software.intel.com/sites/default/files/m/8/b/8/D9156103.pdf. 
  4. ""Barcelona" Processor Feature: SSE Misaligned Access". AMD. http://developer.amd.com/community/blog/2008/04/14/barcelona-processor-feature-sse-misaligned-access/. 
  5. "Inside Intel Nehalem Microarchitecture". http://www.hardwaresecrets.com/article/Inside-Intel-Nehalem-Microarchitecture/535/7. 
  6. My Experience With "Conroe" , DailyTech
  7. Extending the World’s Most Popular Processor Architecture , Intel
  8. "Intel - Data Center Solutions, IOT, and PC Innovation". Intel. http://www.intel.com/technology/product/demos/hdb/demo.htm. 
  9. Motion Estimation with Intel Streaming SIMD Extensions 4 (Intel SSE4) , Intel.
  10. "Schema Validation with Intel® Streaming SIMD Extensions 4 (Intel® SSE4)". http://software.intel.com/en-us/articles/schema-validation-with-intel-streaming-simd-extensions-4-intel-sse4/. 
  11. "XML Parsing Accelerator with Intel® Streaming SIMD Extensions 4 (Intel® SSE4)". http://software.intel.com/en-us/articles/xml-parsing-accelerator-with-intel-streaming-simd-extensions-4-intel-sse4/. 
  12. Intel SSE4 Programming Reference p. 61. See also RFC 3385 for discussion of the CRC32C polynomial.
  13. Fast, Parallelized CRC Computation Using the Nehalem CRC32 Instruction — Dr. Dobbs, April 12, 2011
  14. Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 2B: Instruction Set Reference, N–Z .
  15. 15.0 15.1 "AMD CPUID Specification". http://developer.amd.com/wordpress/media/2012/10/254811.pdf. 
  16. Rahul Chaturvedi (September 17, 2007). ""Barcelona" Processor Feature: SSE4a Instruction Set". http://developer.amd.com/community/blog/barcelona-processor-feature-sse4a-instruction-set/. 
  17. Rahul Chaturvedi (October 2, 2007). ""Barcelona" Processor Feature: SSE4a, part 2". http://developer.amd.com/community/blog/barcelona-processor-feature-sse4a-part-2/. 
  18. "AMD FX-Series FX-6300 - FD6300WMW6KHK / FD6300WMHKBOX". http://www.cpu-world.com/CPUs/Bulldozer/AMD-FX-Series%20FX-6300.html. 

External links