GF2P8AFFINEINVQB

Galois 战地芳香变换反向

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
66 0F3A CF /r /ibGF2P8AFFINEINVQB xmm1, xmm2/m128, imm8A有效有效计算有限字段GF( 2^8) 的反向阴离子变换 。
VEX.128.66.0F3A.W1 CF /r /ibVGF2P8AFFINEINVQB xmm1, xmm2, xmm3/m128, imm8B有效有效计算 GFNI 有限字段 GF( 2^8) 中的反向阴离子变换 。
VEX.256.66.0F3A.W1 CF /r /ibVGF2P8AFFINEINVQB ymm1, ymm2, ymm3/m256, imm8B有效有效计算 GFNI 有限字段 GF( 2^8) 中的反向阴离子变换 。
EVEX.128.66.0F3A.W1 CF /r /ibVGF2P8AFFINEINVQB xmm1{k1}{z}, xmm2, xmm3/m128/m64bcst, imm8C有效有效计算 OR AVX10.1 中 的反向阴离子变换 有限字段 GF( 2^8). GFNI
EVEX.256.66.0F3A.W1 CF /r /ibVGF2P8AFFINEINVQB ymm1{k1}{z}, ymm2, ymm3/m256/m64bcst, imm8C有效有效计算 OR AVX10.1 中 的反向阴离子变换 有限字段 GF( 2^8). GFNI
EVEX.512.66.0F3A.W1 CF /r /ibVGF2P8AFFINEINVQB zmm1{k1}{z}, zmm2, zmm3/m512/m64bcst, imm8C有效有效计算 OR AVX10.1 中 的反向阴离子变换 有限字段 GF( 2^8). GFNI

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

A

  1. modrm.reg lectura y escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  3. imm8 lectura指令后的立即数字节

B

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. vex.vvvv lecturaVEX 前缀的 vvvv 字段(按位取反)
  3. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  4. imm8 lectura指令后的立即数字节

C

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. evex.vvvv lecturaEVEX 前缀的 vvvv 字段(按位取反)
  3. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  4. imm8 lectura指令后的立即数字节

Tupla: Full

实测开销

正在从 arch-data 加载实测数据...

说明

AFFINEINVB指令计算出加洛瓦场28场的芳香变换. 对于此指令,A定义了外缘转换 * inv(x)+b,其中"A"为8乘8位矩阵,"x"和"b"为8位矢量. X 中的字节的反向是针对还原多诺米x8 + x4 + x3 + x + 1.

一个SIMD寄存器(操作数 1)持有"x"为16,32或64个8位向量. 一个第二个SIMD(操作数 2)寄存器或内存操作数包含2,4或8个"A"值,这些值由第一个寄存器中对应的8个"x"值运行. "b"矢量是用于所有计算并包含在即时字节中的常数.

本指令的EVEX编码形式不支持内存断层压制. SSE编码的指令形式要求他们的内存操作进行16B对齐.

每个字节的反数由下表给出. 上硝泡位于垂直轴上,下硝泡位于水平轴上. 例如,0x95的反向是0x8A.

反字节列表

-0123456789ABCDEF
0018D F6CB527BD1E84F 29C0B0E1E5C7
174B4AA 4B992B605F583F FDCCFF40EEB2
23A6E5A F1554DA8C9C1A 98153044A2C2
32C4592 6CF3396642F235 206F77BB5919
41DFE37 672D31F569A764 AB135425E99
5ED5C5 CA4C2487BF183E 22F051EC6117
6165EAF D349A63643F447 91DF3393213B
779B797 8510B5BA3CB670 D06A1FA8182
8837E7F 809673BE569B9E 95D9F72B9A4
9DE 6A32 6DD88A84722A14 9F88F9DC899A
AFB7C2E C38FB8654826C8 124ACEE7D262
BCE01FEF11757871A58E 763DBDBC8657
CB282F A3DAD4E4FA927 5341BFCACE6
D7A7AE 63C5DBE2EA948B C4D59DF8906B
EB1DD6 EBC6ECFAD84E D7E35D501EB3
F5B2338 34684638CDD9C 7DA0CD1A411C

行动

define affine_inverse_byte(tsrc2qw, src1byte, imm):
    FOR i := 0 to 7:
          * parity(x) = 1 if x has an odd number of 1s in it, and 0 otherwise.*
          * inverse(x) is defined in the table above *
         retbyte.bit[i] := parity(tsrc2qw.byte[7-i] AND inverse(src1byte)) XOR imm8.bit[i]
    return retbyte

VGF2P8AFFINEINVQB dest, src1, src2, imm8 (EVEX Encoded Version)
(KL, VL) = (2, 128), (4, 256), (8, 512)
FOR j := 0 TO KL-1:

    IF SRC2 is memory and EVEX.b==1:
         tsrc2 := SRC2.qword[0]

    ELSE:
         tsrc2 := SRC2.qword[j]

FOR b := 0 to 7:
    IF k1[j*8+b] OR *no writemask*:
         FOR i := 0 to 7:
               DEST.qword[j].byte[b] := affine_inverse_byte(tsrc2, SRC1.qword[j].byte[b], imm8)
    ELSE IF *zeroing*:
         DEST.qword[j].byte[b] := 0
    *ELSE DEST.qword[j].byte[b] remains unchanged*

DEST[MAX_VL-1:VL] := 0


VGF2P8AFFINEINVQB dest, src1, src2, imm8 (128b and 256b VEX Encoded Versions)
(KL, VL) = (2, 128), (4, 256)
FOR j := 0 TO KL-1:

    FOR b := 0 to 7:
         DEST.qword[j].byte[b] := affine_inverse_byte(SRC2.qword[j], SRC1.qword[j].byte[b], imm8)

DEST[MAX_VL-1:VL] := 0

GF2P8AFFINEINVQB srcdest, src1, imm8 (128b SSE Encoded Version)
FOR j := 0 TO 1:

    FOR b := 0 to 7:
         SRCDEST.qword[j].byte[b] := affine_inverse_byte(SRC1.qword[j], SRCDEST.qword[j].byte[b], imm8)

Intel C/C++ 内在编译器

(V)GF2P8AFFINEINVQB __m128i _mm_gf2p8affineinv_epi64_epi8(__m128i, __m128i, int);
(V)GF2P8AFFINEINVQB __m128i _mm_mask_gf2p8affineinv_epi64_epi8(__m128i, __mmask16, __m128i, __m128i, int);
(V)GF2P8AFFINEINVQB __m128i _mm_maskz_gf2p8affineinv_epi64_epi8(__mmask16, __m128i, __m128i, int);
VGF2P8AFFINEINVQB __m256i _mm256_gf2p8affineinv_epi64_epi8(__m256i, __m256i, int);
VGF2P8AFFINEINVQB __m256i _mm256_mask_gf2p8affineinv_epi64_epi8(__m256i, __mmask32, __m256i, __m256i, int);
VGF2P8AFFINEINVQB __m256i _mm256_maskz_gf2p8affineinv_epi64_epi8(__mmask32, __m256i, __m256i, int);
VGF2P8AFFINEINVQB __m512i _mm512_gf2p8affineinv_epi64_epi8(__m512i, __m512i, int);
VGF2P8AFFINEINVQB __m512i _mm512_mask_gf2p8affineinv_epi64_epi8(__m512i, __mmask64, __m512i, __m512i, int);
VGF2P8AFFINEINVQB __m512i _mm512_maskz_gf2p8affineinv_epi64_epi8(__mmask64, __m512i, __m512i, int);

SIMD 浮点 例外

None.

其他例外

遗留编码和 VEX 编码: 参见表2-21"第4类例外条件".

EVEX 编码 : 参见表2-52"Type E4NF类例外条件".

来源