XOP 명령 세트
XOP instruction set2009년 5월 1일에 AMD가 발표한 XOP(eXtended Operations[1]) 명령 세트는 2011년 [2]10월 12일에 출시된 불도저 프로세서 코어용 x86 및 AMD64 명령 세트의 128비트 SSE 코어 명령 확장입니다.그러나 AMD는 XOP에 대한 지원을 Zen(마이크로아키텍처) [3]이후 폐지했습니다.
XOP 명령어세트에는 원래 SSE로의 메이저업그레이드용이었기 때문에 몇 가지 다른 유형의 벡터명령어가 포함되어 있습니다.대부분의 명령은 정수 명령이지만 부동 소수점 순열 및 부동 소수점 비율 추출 명령도 포함되어 있습니다.명령 유형 목록은 색인을 참조하십시오.
역사
XOP는 원래 SSE5로 의도된 서브셋의 개정판입니다.AVX와 유사하지만 중복되지 않도록 변경되었으며, AVX와 중복되는 부분은 제거되거나 FMA4(부동소수점 벡터 곱셈-적산) 및 CVT16([1]인텔이 F16C로 구현한 반정밀 부동소수점 변환)과 같은 별도의 표준으로 이동되었습니다.
인텔이 발표한 AVX 및 FMA4 명령어 세트의 명령어와 동등하거나 유사한 모든 SSE5 명령어는 인텔이 제안하는 코드를 사용하도록 변경되었습니다.AVX에서 등가물이 없는 정수 명령은 XOP 확장으로 [1]분류되었습니다.XOP 명령어에는 opcode 바이트8F(16진수)가 있습니다만, 그 이외에는 3 바이트의 VEX 프리픽스를 가지는 AVX 와 거의 같은 코딩 방식이 있습니다.
코멘테이터들은[4] 이를 인텔이 AMD가 대규모 VEX 코딩 공간을 사용하는 것을 허용하지 않았다는 증거로 보고 있습니다.AMD는 인텔이 개발 파이프라인에서 다른 용도로 사용할 가능성이 있는 코드 조합을 사용하지 않기 위해 다른 코드를 사용해야 했습니다.XOP 코딩 방식은 기술적으로 가능한 한 VEX 방식에 가깝습니다.AMD 코드가 미래의 인텔 코드와 중복될 위험이 없습니다.이 문제에 대한 두 회사 간의 협상에 대한 공개 정보가 없기 때문에 이 추론은 추측에 불과하다.
8F 바이트를 사용하려면 m비트(VEX 부호화 방식 참조)의 값이 8보다 크거나 같아야 합니다.이는 기존 [Note 1]명령과의 중복을 피하기 위해서입니다.VEX 스킴에서 사용되는 C4 바이트에는 이러한 제한이 없습니다.이것에 의해, 장래의 XOP 방식에서는 m비트를 다른 목적으로 사용할 수 없게 되는 경우가 있습니다만, VEX 방식에서는 사용할 수 없습니다.또 다른 생각할 수 있는 문제는 XOP 방식에서는 pp 비트의 값이 00인 반면 레거시 등가가 없는 명령에서는 VEX 방식에서는 값이 01인 것입니다.이로 인해 향후 다른 목적으로 pp 비트를 사용하는 것이 복잡해질 수 있습니다.
비슷한 호환성 문제는 FMA3 명령어세트와 FMA4 명령어세트의 차이입니다.인텔은 처음에 SSE5에서 AMD가 제안한3 오퍼랜드 FMA를 대체하기 위해 AVX/FMA 사양 버전3에서 FMA4를 제안했습니다.AMD가 FMA4를 채택한 후 인텔은 FMA4 지원을 취소하고 AVX/FMA 사양 버전5에서 FMA3로 되돌렸습니다(FMA [1][5][6]이력 참조).
2015년 3월 AMD는 GNU Binutils 패키지용 패치 설명에서 첫 번째 반복(znver1 – Zen, 버전 1)에서 3세대 x86-64 아키텍처인 Zen은 "Bullzer" 제품군을 위해 특별히 개발된 TBM, FMA4, XOP 및 LWP 명령을 지원하지 않을 것임을 분명히 밝혔습니다.
정수 벡터 곱셈 - 누적 명령
이것들은 FMA 명령어세트의 정수 버전입니다.이것들은 모두 FMA4와 유사한 4개의 오퍼랜드명령어로, 모두 부호 있는 정수로 동작합니다.
설명 | 설명[9] | 작동 |
---|---|---|
VPMACSWW
| 단어 대 단어(포화도 포함)의 곱셈 누적 | 2x8 단어 (a0-a7, b0-b7) + 8워드(c0-c7) → 8워드(r0-r7) r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSWD
| 누적(포화도 포함) 저단어에서 이중단어로 곱하기 | 2x8 단어(a0-a7, b0-b7) + 4 개의 이중 단어(c0-c3) → 4 개의 이중 단어(r0-r3) r0 = a0 * b0 + c0, r1 = a2 * b2 + c1,.[2] |
VPMACSDD
| 누적(포화도 포함) 이중 단어에서 이중 단어로의 곱셈 | 2x4 더블워드(a0-a3, b0-b3)+4 더블워드(c0-c3)→4 더블워드(r0-r3) r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSDQL
| 누적 배율(포화도 포함)이 낮은 더블 워드에서 쿼드 워드로 | 2x4 더블워드(a0-a3, b0-b3)+2 쿼드워드(c0-c1)→2 쿼드워드(r0-r3) r0 = a0 * b0 + c0, r1 = a2 * b2 + c1 |
VPMACSDQH
| 누적 배율(포화도 포함)상위 더블워드에서 쿼드워드 | 2x4 더블워드(a0-a3, b0-b3)+2 쿼드워드(c0-c1)→2 쿼드워드(r0-r3) r0 = a1 * b1 + c0, r1 = a3 * b3 + c1 |
VPMADCSWD
| 이중 단어에 누적 단어(포화도 포함)를 곱셈 추가 | 2x8 단어(a0-a7, b0-b7) + 4 개의 이중 단어(c0-c3) → 4 개의 이중 단어(r0-r3) r0 = a0 * b0 + a1 * b1 + c0, r1 = a2 * b2 + a3 * b3 + c1, .. |
정수 벡터 수평 덧셈
수평 가산 명령은 입력 벡터의 인접 값을 서로 가산합니다.아래 설명의 출력 크기는 수평 추가의 폭을 나타냅니다.예를 들어 수평 바이트 투 워드는 한 번에 2바이트를 가산하고 그 결과를 워드의 벡터로서 반환하지만, 쿼드 워드의 바이트는 한 번에 8바이트를 가산하여 쿼드 워드의 벡터로서 반환한다.SSSE3에는 6개의 추가 수평 덧셈 및 뺄셈 명령이 있지만 2개의 입력 벡터에 대해 작동하며 2개의 연산과 2개의 연산만 수행합니다.
설명 | 설명[9] | 작동 |
---|---|---|
VPHADDBW
| 수평으로 2바이트의 서명/서명되지 않은 바이트를 워드에 추가 | 16 바이트(a0-a15) → 8 워드(r0-r7) r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, ... |
VPHADDBD
| 2개의 워드에 4개의 서명된/부호되지 않은 바이트를 수평으로 추가 | 16 바이트(a0-a15) → 4 개의 이중 워드(r0-r3) r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7, ... |
VPHADDBQ
| 쿼드워드에 8바이트의 서명/부호 없음 수평 추가 | 16 바이트(a0-a15) → 2 쿼드워드(r0-r1) r0 = a0+a1+a2+a3+a4+a5+a6+a7, ... |
VPHADDWD
| 수평으로 두 개의 서명된/서명되지 않은 단어를 이중 단어에 추가합니다. | 8 단어(a0-a7) → 4 개의 이중 단어(r0-r3) r0 = a0+a1, r1 = a2+a3, r2 = a4+a5, ... |
VPHADDWQ
| 쿼드워드에 4개의 서명/서명되지 않은 단어를 수평으로 추가 | 8 워드(a0-a7) → 2 쿼드워드(r0-r1) r0 = a0+a1+a2+a3, r1 = a4+a5+a6+a7 |
VPHADDDQ
| 수평으로 쿼드워드에 두 개의 서명/서명되지 않은 이중 단어를 추가합니다. | 4개의 더블워드(a0-a3) → 2개의 쿼드워드(r0-r1) r0 = a0+a1, r1 = a2+a3 |
VPHSUBBW | 수평으로 두 개의 부호 있는 바이트를 워드 단위로 빼다 | 16 바이트(a0-a15) → 8 워드(r0-r7) r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, ... |
VPHSUBWD | 수평으로 두 개의 서명된 단어를 빼서 두 개의 단어를 두 개로 만듭니다. | 8 단어(a0-a7) → 4 개의 이중 단어(r0-r3) r0 = a0-a1, r1 = a2-a3, r2 = a4-a5, ... |
VPHSUBDQ | 수평으로 두 개의 서명된 이중 단어를 4단어로 빼다 | 4개의 더블워드(a0-a3) → 2개의 쿼드워드(r0-r1) r0 = a0-a1, r1 = a2-a3 |
정수 벡터 비교
이 벡터 비교 명령 집합은 모두 즉시 추가 인수로 사용됩니다.즉시 실행할 비교의 종류를 제어합니다.각 명령마다 8가지 비교가 가능합니다.벡터가 비교되고 true로 평가되는 모든 비교는 수신처의 모든 대응하는 비트를 1로 설정하고 false 비교는 모든 동일한 비트를 0으로 설정합니다.이 결과는 VPCMOV 명령에서 직접 벡터화된 조건부 이동을 위해 사용할 수 있습니다.
설명 | 설명[9] | 즉각적인 | 비교 | |
---|---|---|---|---|
VPCOMB | 벡터 서명 바이트 비교 | 000 | 보다 적은 | |
VPCOMW | 벡터 서명 단어 비교 | 001 | 작거나 같음 | |
VPCOMD | 벡터 서명된 이중 단어 비교 | 010 | 다음보다 크다 | |
VPCOMQ | 벡터 부호 쿼드워드 비교 | 011 | 보다 크거나 같음 | |
VPCOMUB | 벡터 부호 없는 바이트 비교 | 100 | 동등. | |
VPCOMUW | 벡터 부호 없는 단어 비교 | 101 | 같지 않다 | |
VPCOMUD | 벡터 부호 없는 이중 단어 비교 | 110 | 거짓의 | |
VPCOMUQ | 벡터 부호 없는 쿼드워드 비교 | 111 | 진실의 |
벡터 조건부 이동
VPCMOV는 SSE4의 혼합 명령의 비트 단위 변형으로 기능합니다.셀렉터 1의 각 비트에 대해 제1의 소스에서 같은 비트를 선택하고, 0은 제2의 소스에서 같은 비트를 선택한다.위의 XOP 벡터 비교 명령과 함께 사용하면 벡터화된 3진수 이동을 구현하거나 두 번째 입력이 대상과 동일한 경우 조건부 이동(CMOV)을 구현할 수 있습니다.
설명 | 설명[9] |
---|---|
VPCMOV | 벡터 조건부 이동 |
정수 벡터 이동 및 회전 명령
여기서의 이동 명령은 SSE2의 이동 명령과 달리 패킹된 부호 정수로 해석되는 벡터 레지스터를 사용하여 각 단위를 다른 양으로 이동할 수 있습니다.기호는 시프트 또는 회전 방향을 나타냅니다.양수 값은 왼쪽 시프트와 음수 오른쪽[10] 시프트의 원인이 됩니다.인텔은 AVX2에서 호환되지 않는 가변 벡터 시프트 명령 세트를 지정했습니다.[11]
설명 | 설명[9] |
---|---|
VPROTB | 패킹된 회전 바이트 |
VPROTW | 패킹된 단어 |
VPROTD | 포장된 이중 단어 순환 |
VPROTQ | 4단어 회전 패키지 |
VPSHAB | 패킹된 시프트 산술 바이트 |
VPSHAW | 패킹된 시프트 산술어 |
VPSHAD | 패킹된 시프트 산술 이중어 |
VPSHAQ | 패킹된 시프트 산술 쿼드워드 |
VPSHLB | 패킹된 시프트 논리 바이트 |
VPSHLW | 패킹된 시프트 논리 단어 |
VPSHLD | 패킹된 시프트 논리 이중어 |
VPSHLQ | 패킹된 시프트 논리 쿼드워드 |
벡터 퍼머트
VPPERM은 SSSE3 명령 PALIGNR과 PSHUFB를 조합한1개의 명령어입니다.일부에서는 Altivec 명령 VPERM을 [12]비교합니다.3개의 레지스터를 입력으로 사용합니다.첫 번째 2개는 소스 레지스터, 세 번째 셀렉터 레지스터입니다.실렉터의 각 바이트는 출력용 2개의 입력 레지스터 중 하나의 바이트 중 하나를 선택한다.실렉터는 선택한 바이트에 대해 0으로 설정, 비트 순서 반전, 최상위 비트 반복 등의 효과를 적용할 수도 있습니다.모든 효과 또는 입력은 추가로 반전될 수 있습니다.
VPERMIL2PD 명령과 VPERMIL2PS 명령어는 AVX의 VPERMILLPD 명령과 VPERMILPS 명령의 2가지 소스 버전입니다.이는 VPPERM과 마찬가지로 2개의 입력 중 어느 필드에서나 출력을 선택할 수 있음을 의미합니다.
설명 | 설명[9] |
---|---|
VPPERM | 패킹된 Permute 바이트 |
VPERMIL2PD | 2 소스 2배 정밀도 부동 소수점 허용 |
VPERMIL2PS | 2 소스 단일 정밀도 부동 소수점 허용 |
부동 소수점 추출
이 명령어는 부동소수점 부분, 즉 정수로 변환할 때 손실되는 부분을 추출합니다.
설명 | 설명[9] |
---|---|
VFRCZPD | 배정밀 부동 소수점 추출 부분 |
VFRCZPS | 추출 프랙션 포장 단일 정밀도 부동 소수점 |
VFRCZSD | 분수 스칼라 2배 정밀도 부동 소수점 추출 |
VFRCZSS | 프랙션 스칼라 단정도 부동 소수점 추출 |
XOP 탑재 CPU
- AMD:
「 」를 참조해 주세요.
메모들
- ^ 바이트 값 0x8F는 POP 명령의 외부 연산 코드입니다.이 명령에서는 opcode 뒤에 이어지는 ModR/M 바이트를 사용하지만 비트 3-5인 "reg"(레지스터) 필드는 사용하지 않습니다.이러한 비트를 사용하여 8개의 다른 명령(0x80-0x83 및 0xD0-0xDF 등)을 나타냄으로써 "reg" 다중 명령을 사용하지 않는 opcode도 있지만 0x8F는 그렇지 않습니다.즉, 표준 POP 명령의 경우 비트 3-5는 항상 0이어야 합니다.m비트는 비트 0-4이므로 8 이상의 값을 요구하면 0x8F 이후에 바이트의 비트 3이 설정됩니다.
레퍼런스
- ^ a b c d Dave Christie (2009-05-07), Striking a balance, AMD Developer blogs, archived from the original on 2013-11-04, retrieved 2013-11-04
- ^ a b AMD64 Architecture Programmer's Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions (PDF), AMD, May 1, 2009
- ^ Michael Larabel (March 3, 2017). "The Impact Of GCC Zen Compiler Tuning On AMD Ryzen Performance". Phoronix.
But with Zen being a clean-sheet design, there are some instruction set extensions found in Bulldozer processors not found in Zen/znver1. Those no longer present include FMA4 and XOP.
- ^ Agner Fog (December 5, 2009), Stop the instruction set war
- ^ Intel AVX Programming Reference (PDF), March 2008, retrieved 2012-01-17
- ^ Intel Advanced Vector Extensions Programming Reference, January 2009, archived from the original on February 29, 2012, retrieved 2012-01-17
- ^ Ganesh Gopalasubramanian (March 10, 2015). "[PATCH] add znver1 processor". binutils@sourceware.org (Mailing list).
- ^ Amit Pawar (August 7, 2015). "[PATCH] Remove CpuFMA4 From Znver1 CPU Flags". binutils@sourceware.org (Mailing list).
- ^ a b c d e f g "AMD64 Architecture Programmer's Manual, Volume4: 128-Bit and 256-Bit Media Instructions" (PDF). AMD. Retrieved 2014-01-13.
- ^ "New "Bulldozer" and "Piledriver" Instructions" (PDF). AMD. Retrieved 2014-01-13.
- ^ "Intel Architecture Instruction Set Extensions Programming Reference". Intel. Archived from the original (PDF) on February 1, 2014. Retrieved 2014-01-29.
- ^ "Buldozer x264 optimisations". Retrieved 2014-01-13.
- ^ Dave Christie (2009-05-07), Striking a balance, AMD Developer blogs, archived from the original on 2013-11-09, retrieved 2012-01-17
- ^ New "Bulldozer" and "Piledriver" Instructions (PDF), AMD, October 2012