VEX 프리픽스

VEX prefix

VEX 프리픽스('벡터 확장'에서)와 VEX 코딩 스킴은 인텔, AMD 마이크로프로세서용 x86x86-64 명령 세트 아키텍처의 확장입니다.

특징들

VEX 코딩 방식을 사용하면 새 명령을 정의하고 기존 명령 코드를 확장 또는 수정할 수 있습니다.이것은, 다음의 목적을 실현합니다.

  • opcode map이 확장되어 향후 명령을 위한 공간이 확보됩니다.
  • 명령 코드는 최대 4개의 오퍼랜드(및 즉시)를 가질 수 있습니다.원래 스킴에서는 2개의 오퍼랜드(및 즉시)만 허용합니다.
  • SIMD 벡터 레지스터의 크기를 128비트 XMM 레지스터에서 YMM이라는 이름의 256비트 레지스터로 확장할 수 있습니다. 레지스터 크기를 더 확장할 여지가 있습니다.
  • 이것에 의해, 기존의 2 오퍼랜드명령어를, 행선지 레지스터가 양쪽의 소스 레지스터와 다른 비파괴 3 오퍼랜드 형식으로 변경할 수 있습니다.를 들어 a a + b 대신 c a + b를 입력합니다(여기서 레지스터 a는 명령에 의해 변경됩니다).

VEX 프리픽스는 가장 일반적으로 사용되는 명령 프리픽스바이트 및 이스케이프 코드를 대체합니다.대부분의 경우 치환되는 프리픽스바이트 및 이스케이프바이트 수는 VEX 프리픽스 내의 바이트 수와 같기 때문에 VEX 인코딩된 명령의 총 길이는 레거시 명령 코드의 길이와 동일합니다.그 외의 경우, VEX 부호화 버전은 레거시 코드보다 길거나 짧습니다.32비트 모드에서는 VEX 부호화 명령어는 첫 번째 8개의 YMM/XM 레지스터에만 액세스할 수 있습니다.다른 레지스터의 부호화는 64비트 모드에서는 지원되지 않는 레거시 LDS 및 LES 명령으로 해석됩니다.

2바이트의 VEX 프리픽스에는 다음 컴포넌트가 포함되어 있습니다.

  • R'이라는 비트는 REX와 비슷합니다.x86-64 명령 세트 확장에서 사용되는 R 프리픽스비트
  • 두 번째 소스 레지스터 피연산자를 지정하는 v'라는 이름의 4비트.
  • 256비트 벡터 길이를 지정하는 L이라는 이름의 비트.
  • 오퍼랜드 크기 프리픽스와 오퍼랜드타입 프리픽스(0x66, 0xF2, 0xF3)를 대체하기 위해 p라는 이름의 2비트.

3 바이트의 VEX 프리픽스에는, 다음의 내용이 추가되어 있습니다.

  • X'; B'; 및 W의 3비트는, REX 프리픽스의 대응하는 비트와도 비슷합니다.
  • 이름이 m인 5비트m비트 중 2비트는 기존 이스케이프 코드를 교체하고 명령의 길이를 지정하는 데 사용됩니다.나머지 3개의 m비트는 벡터 길이 > 256비트 지정, 다른 명령 길이 지정, opcode 공간 확장 등 향후 사용을 위해 예약되어 있습니다.단, 2013년부터 인텔은 나머지 m비트를 확장하는 대신 새로운 인코딩 방식인 EVEX 프레픽스를 도입하기로 결정했습니다.

기술 설명

인텔(R) 64 명령 포맷(VEX 프리픽스
바이트 수 0, 2, 3 1 1 0, 1 0, 1, 2, 4 0, 1
일부 [프리픽스] [VEX] 동작 코드 ModR/M [SIB] [DISP] [IMM]

VEX 부호화 방식에서는 2바이트 또는 3바이트로 구성된 코드프리픽스를 사용합니다.이 프리픽스는 기존 명령코드 [1]또는 새로운 명령코드에 추가할 수 있습니다.

x86 아키텍처에서 메모리 오퍼랜드가 있는 명령은 주소 지정 모드를 지정하는 ModR/M 바이트를 사용할 수 있습니다.이 바이트에는 3개의 비트필드가 있습니다.

  • mod, bits [7:6] - r/m 필드와 결합하여 8개의 레지스터 또는 24개의 주소 지정 모드를 인코딩합니다.또한 일부 지침에 대한 opcode 정보를 인코딩합니다.
  • reg/opcode, bits [5:3] - 기본 opcode 바이트에 따라 레지스터 또는 3비트 이상의 opcode 정보를 지정합니다.
  • r/m, bits [2:0] - 레지스터를 오퍼랜드로 지정하거나 mod 필드와 결합하여 주소 지정 모드를 인코딩할 수 있습니다.

base-plus-index 및 scale-plus-index 형식의 32비트 주소 지정(r/m = 100 및 mod δ 11)에는 또 다른 주소 지정 바이트인 SIB 바이트가 필요합니다.다음 필드가 있습니다.

  • 스케일 팩터, 비트 [7:6]로 부호화
  • 인덱스 레지스터, 비트 [5:3]
  • 기본 레지스터, 비트 [2:0]

64비트 어드레싱과 x86-64 아키텍처에 존재하는 추가 레지스터를 사용하기 위해 주소 지정 모드를 인코딩하기 위한 추가 공간을 제공하는 REX 프리픽스가 도입되었습니다.비트필드 W는 피연산자 크기를 64비트로 변경하고, R은 레지스트리를 4비트로 확장하며, B는 r/m(또는 "POP reg"와 같이 가장 낮은 3개의 opcode 비트로 레지스터를 인코딩하는 소수의 opcode에서는 opreg), X와 B는 인덱스와 SIB 바이트의 베이스를 확장합니다.REX 프리픽스는 8비트의 절반을 사용하지 않습니다.

REX 및 VEX 부호화
바이트 조금
렉스
7 6 5 4 3 2 1 0
0 0 1 0 0 W R X B
3바이트 VEX
7 6 5 4 3 2 1 0
0 (0xC4) 1 1 0 0 0 1 0 0
1 X★ B★ 4 3 2 1 0
2 W 비디오3 비디오2 비디오1 비디오0 L p1. p0.
2바이트 VEX
7 6 5 4 3 2 1 0
0(0xC5) 1 1 0 0 0 1 0 1
1 비디오3 비디오2 비디오1 비디오0 L p1. p0.

VEX 프리픽스는 주소 지정 모드, 레지스터 열거 및 오퍼랜드의 크기와 폭을 확장하기 위해 REX 프리픽스와 다양한 프리픽스를 콤팩트하게 나타냅니다.

  • R', X' 및 B' 비트는 REX 프리픽스의 R, X 및 B 비트의 반전입니다.이것들은 레지스터 인덱스필드(각각 ModRM reg, SIB 인덱스, ModRM r/m, SIB 베이스, 또는 opcode reg 필드)에 대해4번째(높은) 비트를 제공합니다.W 비트는 REX 프리픽스의 W 비트와 동등하며 64비트 오퍼랜드를 지정합니다.정수가 아닌 명령의 경우 일반적인 opcode 확장 비트입니다.
  • vdl은 추가 소스 레지스터 인덱스의 반전입니다.
  • 선두 opcode prefix 바이트가 m으로 대체되었습니다.값 1, 2, 3은 opcode prefix 0x0F, 0x0F 0x38 및 0x0F 0x3A에 해당합니다.기타 값은 모두 예약됩니다.2 바이트의 VEX 프리픽스는 항상 0x0F 프리픽스에 대응합니다.
  • L은 벡터 길이를 나타냅니다.128비트 SSE(XMM) 레지스터의 경우 0, 256비트 AVX(YMM) 레지스터의 경우 1입니다.
  • p는 추가 프리픽스바이트를 부호화합니다.값 0, 1, 2, 및3은 암묵적인 no, 0x66, 0xF3, 및 0xF2 프리픽스에 대응합니다.SSE 명령의 오퍼랜드유형(각각 packed single, packed double, scalar single 및 scalar double)을 부호화합니다.
VEX 프레픽스를 사용하여 64비트모드로 어드레싱을 등록하다
주소 지정 모드 비트 3 비트 [2:0] 등록유형 일반적인 사용법
레지스트 VEX.R ModRM.reg 범용, 마스크, 벡터 피연산자 등록
RM(ModRM.mod = 11인 경우) VEX.B ModRM.r/m GPR, 마스크, 벡터 피연산자 등록
RM VEX.B ModRM.r/m GPR 메모리 주소 등록
기초 VEX.B SIB.base GPR 베이스 + 인덱스 × 스케일 메모리 주소
색인 VEX.X SIB.인덱스 GPR 베이스 + 인덱스 × 스케일 메모리 주소
VIDX VEX.X SIB.인덱스 벡터 베이스 + 벡터 인덱스 × 스케일 메모리 주소
NDS/NDD VEX.vvv3210 GPR, 마스크, 벡터 피연산자 등록
IS4 Imm8 [7:4] 벡터 피연산자 등록

VEX 프리픽스로 코드화된 명령어에는 최대 4개의 가변 오퍼랜드(레지스터 또는 메모리)와 1개의 상수 오퍼랜드(즉시값)를 포함할 수 있습니다.3개 이상의 변수 오퍼랜드가 필요한 명령에서는 즉시 오퍼랜드비트를 사용하여 4번째 레지스터 오퍼랜드(위의 IS4)를 지정합니다.오퍼랜드 중 최대 1개는 메모리 오퍼랜드, 최대 1개는 4비트 또는 8비트의 즉시 상수입니다.나머지 오퍼랜드는 레지스터입니다.

AVX 명령어세트는 VEX 부호화 방식을 사용하는 첫 번째 명령어세트 확장입니다AVX 명령어세트는 SIMD XMM 레지스터를 사용하는 명령에만 VEX 프레픽스를 사용합니다.

단, VEX 부호화 방식은 명령어 세트의 후속 확장에서도 다른 명령어유형에 사용되고 있습니다.를 들어, BMI는 범용 레지스터에서 동작하는 VEX 코드화된 산술 및 비트 조작 명령을 도입했습니다.AVX-512는 8개의 마스크 레지스터를 도입하고 이를 조작하는 명령을 추가했습니다.필드가 마스크 레지스터 인코딩에 사용되는 경우 VEX.R, VEX.B 또는 VEX.v3은 무시됩니다.

VEX 프리픽스의 초기 바이트 값 0xC4 및 0xC5는 LDS 및 LES 명령의 opcode와 동일합니다.64비트 모드에서는 지원되지 않기 때문에 32비트 모드에서는 LDS 또는 LES의 ModRM 바이트가 레지스터 오퍼랜드를 지정할 수 없다는 사실을 악용하여 모호성을 해결합니다.즉, 11xxxxxxx 형식입니다.VEX 프리픽스의 두 번째 바이트의 다양한 비트필드가 반전되어 바이트가 항상 이 형식이 되도록 합니다.마찬가지로, REX 프리픽스의 1바이트 형식에서는 4개의 상위 비트가 4로 설정되어 있으며, 이는 0x40~0x4F의 16개의 opcode를 대체합니다.이전에는 8개의 표준 프로세서 레지스터를 위한 INC 및 DEC 명령어였습니다.x86-64 코드는 ModR/M INC 및 DEC [2]명령을 사용해야 합니다.

VEX 프리픽스가 추가된 레거시 SIMD 명령어는 VEX 프리픽스가 없는 동일한 명령과 동등하지만 다음과 같은 차이가 있습니다.

  • VEX로 인코딩된 명령어는 피연산자를 1개 더 가질 수 있으므로 파괴되지 않습니다.
  • VEX 프리픽스가 없는 128비트 XMM 명령에서는 256비트 YMM 레지스터의 상부는 변경되지 않은 상태로 유지되며, VEX 인코딩 버전에서는 상부가 제로로 설정됩니다.

256비트 YMM 레지스터 전체를 사용하는 명령어는 효율상의 이유로 레지스터 상부를 변경하지 않는 비 VEX 명령어와 혼재하지 마십시오.

역사

  • 2007년 8월, AMDSSE5 명령 세트 확장을 제안했습니다.이 확장에는 3개의 오퍼랜드에 의한 명령어의 새로운 코딩 스킴이 포함되어 있으며,[3][4] 2011년에 생산을 개시할 예정인 불도저 프로세서코어용 추가 바이트 DREX를 사용합니다.
  • 2008년 3월에 인텔은 새로운 VEX 코딩 [5]방식을 사용하여 AVX 명령 세트를 제안했습니다.
  • 2008년 8월, 코멘테이터는 AMD와 인텔의 명령어 세트의 호환성이 예상되는 것을 개탄하고, AMD가 계획을 수정해, DREX 스킴을 보다 유연하고 확장성이 높은 VEX [6]스킴으로 대체할 것을 제안했습니다.
  • 2009년 5월에 AMD는 제안된 SSE5 명령 세트를 AVX 명령 세트 및 VEX 코드 스킴과 호환되도록 개정했다고 발표했습니다.개정된 SSE5는 [7]XOP라고 불립니다.
  • 2011년 1월AVX 명령 세트는 인텔의 Sandy Bridge 마이크로프로세서 아키텍처에서 지원됩니다.
  • 2011. AVX, XOPFMA4 명령어 세트는 모두 VEX 방식을 사용하여 AMD 불도저 [8]프로세서에서 지원됩니다.
  • 2013. FMA3 명령 세트는 인텔 Haswell 프로세서에서 지원됩니다.

레퍼런스

  1. ^ Intel Corporation (January 2009). "Intel Advanced Vector Extensions Programming Reference".
  2. ^ Intel Corporation (2016-09-01). "Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 2A". p. 2-8. Retrieved 2021-09-13.
  3. ^ "128-Bit SSE5 Instruction Set". AMD Developer Central. Retrieved 2009-06-02.
  4. ^ Hruska, Joel (November 14, 2008). "AMD Fusion now pushed back to 2011". Ars Technica.
  5. ^ "Intel Software Network". Intel. Archived from the original on 2008-04-07. Retrieved 2008-04-05.
  6. ^ "AMD and Intel incompatible - What to do?". AMD Developer Forums. Retrieved 2012-08-10.
  7. ^ "AMD64 Architecture Programmer's Manual Volume 4: 128-Bit and 256-Bit Media Instructions" (PDF). AMD. December 22, 2010.
  8. ^ "Striking a balance". Dave Christie, AMD Developer blogs. Archived from the original on 2013-11-09. Retrieved 2012-08-10.