SSE3, Streaming SIMD Extensions 3, also known by its Intel code name Prescott New Instructions (PNI), is the third iteration of the SSE instruction set for the IA-32 (x86) architecture. Intel introduced SSE3 in early 2004 with the Prescott revision of their Pentium 4 CPU. In April 2005, AMD introduced a subset of SSE3 in revision E (Venice and San Diego) of their Athlon 64 CPUs. The earlier SIMD instruction sets on the x86 platform, from oldest to newest, are MMX, 3DNow! (developed by AMD, no longer supported on newer CPUs), SSE, and SSE2.

SSE3 contains 13 new instructions over SSE2.

Changes
The most notable change is the capability to work horizontally in a register, as opposed to the more or less strictly vertical operation of all previous SSE instructions. More specifically, instructions to add and subtract the multiple values stored within a single register have been added. These instructions can be used to speed up the implementation of a number of DSP and 3D operations. There is also a new instruction to convert floating point values to integers without having to change the global rounding mode, thus avoiding costly pipeline stalls. Finally, the extension adds LDDQU, an alternative misaligned integer vector load that has better performance on NetBurst based platforms for loads that cross cacheline boundaries.

CPUs with SSE3
AMD:
Opteron (since Stepping E4)
Sempron (since Palermo. Stepping E3)
Athlon 64 (since Venice Stepping E3 and San Diego Stepping E4)
Athlon 64 FX (since San Diego Stepping E4)
Athlon 64 X2
Phenom 64 X2
Turion family
K10 family
APU family (including without GPU)
FX Series
 Zen family
Intel:
Celeron D
Celeron (starting with Core microarchitecture)
Pentium 4 (since Prescott)
Pentium D
Pentium Extreme Edition (but NOT Pentium 4 Extreme Edition)
Pentium Dual-Core
Pentium (starting with Core microarchitecture)
Core
Xeon (since Nocona)
Atom
VIA/Centaur:
C7
Nano
Transmeta Efficeon TM88xx (NOT Model Numbers TM86xx)

New instructions

Common instructions

Arithmetic
ADDSUBPD
Add-Subtract-Packed-Double
Input: { A0, A1 }, { B0, B1 }
Output: { A0 − B0, A1 + B1 }
ADDSUBPS
Add-Subtract-Packed-Single
 Input: { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
 Output: { A0 − B0, A1 + B1, A2 − B2, A3 + B3 }

AOS ( Array Of Structures )
HADDPD
Horizontal-Add-Packed-Double
 Input: { A0, A1 }, { B0, B1 }
 Output: { A0 + A1, B0 + B1 }
HADDPS
Horizontal-Add-Packed-Single
 Input: { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
 Output: { A0 + A1, A2 + A3, B0 + B1, B2 + B3 }
HSUBPD
Horizontal-Subtract-Packed-Double
 Input: { A0, A1 }, { B0, B1 }
 Output: { A0 − A1, B0 − B1 }
HSUBPS
Horizontal-Subtract-Packed-Single
 Input: { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
 Output: { A0 − A1, A2 − A3, B0 − B1, B2 − B3 }
LDDQU
As stated above, this is an alternative misaligned integer vector load. It can be helpful for video compression tasks.
MOVDDUP, MOVSHDUP, MOVSLDUP
These are useful for complex numbers and wave calculation like sound.
FISTTP
Like the older x87 FISTP instruction, but ignores the floating point control register's rounding mode settings and uses the "chop" (truncate) mode instead. Allows omission of the expensive loading and re-loading of the control register in languages such as C where float-to-int conversion requires truncate behaviour by standard.

Other instructions
MONITOR, MWAIT
The MONITOR instruction is used to specify a memory address for monitoring, while the MWAIT instruction puts the processor into a low-power state and waits for a write event to the monitored address.

References

External links
X-bit Labs

X86 instructions
SIMD computing
인텔 코드이름 프레스콧 신규 명령어(Prescott New Instructions)로 알려진 SSE3는 IA-32용 3번째 SSE명령어 집합이다. 인텔은 SSE3를 펜티엄 4 CPU인 프레스콧과 함께 2004년 초에 발표를 하였다. 2005년 4월에 AMD는 애슬론 64 CPU의 버전 E(베니스와 샌 디에고)에서 SSE3의 일부를 발표하였다. x86 플랫폼에서의 이전 SIMD 명령어 집합은 시간순으로 MMX, 3DNow! (AMD에 의해 개발), SSE 그리고 SSE2이다.

SSE3는 SSE2 대비 13개의 새로운 명령어가 포함되어 있다.

변경 사항 
가장 주목할 만한 변경은 모든 이전 SSE명령어들이 다소 엄격히 수직적인 동작인 것에 대비해 레지스터에서 수평적으로 동작할 수 있는 기능이다. 좀 더 구체적으로, 단일 레지스터에 저장되어 있는 여러 값들을 더하고 빼기 위한 명령어들이 추가되었다. 이러한 명령어들은 여러 디지털 신호 처리와 3D처리를 단순화한다. 전역 Rounding 모드의 변경없이 부동소수점 값을 정수로 바꾸는 명령어도 포함되었다. 이것으로 파이프라인에서의 처리지연을 피할 수 있게 되었다. 마지막으로 LDDQU를 포함한다. 이것은 캐시라인 경계를 넘는 Load가 넷버스트 아키텍처에서 더 뛰어난 성능을 발휘하도록 하는 정렬되지 않은 정수 벡터 로드(misaligned integer vector load)의 대체이다.

SSE3를 지원하는 CPU 
 AMD:
 애슬론 64 (베니스 스테핑 E3 와 샌 디에고 스테핑 E4 이후)
 애슬론 64 X2
 애슬론 64 FX (샌 디에고 스테핑 E4)
 옵테론 (스테핑 E4 이후)
 셈프론 (Palermo 스테핑 E3 이후)
 페넘
 페넘 II
 튜리온 64
 튜리온 64 X2
 인텔:
 셀러론 D
 셀러론 420, 430, 440
 펜티엄 4 (프레스캇 이후)
 펜티엄 D
 펜티엄 듀얼 코어
 펜티엄 익스트림 에디션 (펜티엄 4 익스트림 에디션은 아님)
 인텔 코어 듀오
 인텔 코어 솔로
 인텔 코어 2 듀오
 인텔 코어 2 익스트림
 인텔 코어 2 쿼드
 인텔 코어 i7
 제온 (노코나 이후)
 아톰
 비아/Centaur:
 C7
 Nano
 트렌스메타

신규 명령어

공통 명령어 
산술
 ADDSUBPD - (Add-Subtract-Packed-Double)
 입력 - { A0, A1 }, { B0, B1 }
 출력 - { A0 - B0, A1 + B1 }
 ADDSUBPS - (Add-Subtract-Packed-Single)
 입력: { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
 출력: { A0 - B0, A1 + B1, A2 - B2, A3 + B3 }
AOS ( Array Of Structures )
 HADDPD - (Horizontal-Add-Packed-Double)
 입력: { A0, A1 }, { B0, B1 }
 출력: { A0 + A1, B0 + B1 }
 HADDPS (Horizontal-Add-Packed-Single)
 입력: { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
 출력: { A0 + A1, A2 + A3, B0 + B1, B2 + B3 }
 HSUBPD - (Horizontal-Subtract-Packed-Double)
 입력: { A0, A1 }, { B0, B1 }
 출력: { A0 - A1, B0 - B1 }
 HSUBPS - (Horizontal-Subtract-Packed-Single)
 입력: { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
 출력: { A0 - A1, A2 - A3, B0 - B1, B2 - B3 }
 LDDQU – 위에 언급되었듯이, 이것은 정렬되지 않는 정수 벡터 로드의 대체이며 비디오 압축에 유용함.
 MOVDDUP, MOVSHDUP, MOVSLDUP – 복소수에 사용되며 소리와 같은 파형 계산에 유용함.
 FISTTP – 옛 x87 FISTP 명령어와 같지만  부동소수점 제어 레지스터의 라운딩 모드 설정을 무시하며 대신 "chop" (절단) 모드를 사용한다. C언어와 같은 곳에서는 부동소수점을 정수로 변환시 일반적으로 절단을 한다. 이때 많은 시간이 소요되는 제어 레지스터의 로딩과 리로딩을 생략해준다.

인텔 명령어 
 MONITOR, MWAIT – 하이퍼 스레딩을 지원하는 프로세서가 더 빠르게 실행하도록 멀티 스레드 애플리케이션을 최적화 시켜준다.

같이 보기 

 스트리밍 SIMD 확장 (SSE)
 SSE2
 SSSE3
 SSE4
 SIMD
 넷버스트 마이크로아키텍처
 네할렘 마이크로아키텍처
 마이크로아키텍처
 콘로
 제온
 코어 마이크로아키텍처

외부 링크 
  SSE3 Overview by Intel
  X-bit Labs

병렬 컴퓨팅
SIMD 컴퓨팅
X86 명령어