GF2P8AFFINEQB
加洛瓦场芳香变换
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
66 0F3A CE /r /ib | GF2P8AFFINEQB xmm1, xmm2/m128, imm8 | A | 有效 | 有效 | 计算有限字段GF( 2^8) 中的芬化变换 。 |
VEX.128.66.0F3A.W1 CE /r /ib | VGF2P8AFFINEQB xmm1, xmm2, xmm3/m128, imm8 | B | 有效 | 有效 | 计算有限 GFNI 字段 GF( 2^8) 中的affine 转换 。 |
VEX.256.66.0F3A.W1 CE /r /ib | VGF2P8AFFINEQB ymm1, ymm2, ymm3/m256, imm8 | B | 有效 | 有效 | 计算有限 GFNI 字段 GF( 2^8) 中的affine 转换 。 |
EVEX.128.66.0F3A.W1 CE /r /ib | VGF2P8AFFINEQB xmm1{k1}{z}, xmm2, xmm3/m128/m64bcst, imm8 | C | 有效 | 有效 | 计算有限值 OR AVX10.1 中的芬化变换 GF( 2^8). GFNI |
EVEX.256.66.0F3A.W1 CE /r /ib | VGF2P8AFFINEQB ymm1{k1}{z}, ymm2, ymm3/m256/m64bcst, imm8 | C | 有效 | 有效 | 计算有限值 OR AVX10.1 中的芬化变换 GF( 2^8). GFNI |
EVEX.512.66.0F3A.W1 CE /r /ib | VGF2P8AFFINEQB zmm1{k1}{z}, zmm2, zmm3/m512/m64bcst, imm8 | C | 有效 | 有效 | 计算有限值 OR AVX10.1 中的芬化变换 GF( 2^8). GFNI |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.reglectura y escrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移imm8lectura指令后的立即数字节
B
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)vex.vvvvlecturaVEX 前缀的 vvvv 字段(按位取反)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移imm8lectura指令后的立即数字节
C
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)evex.vvvvlecturaEVEX 前缀的 vvvv 字段(按位取反)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移imm8lectura指令后的立即数字节
Tupla: Full
实测开销
正在从 arch-data 加载实测数据...
说明
AFFINEB指令计算出加洛瓦场28场的芳香变换. 对于此指令,A定义了外缘转换 * x + b 其中"A"为8乘8位矩阵,"x"和"b"为8位矢量. 一个SIMD寄存器(操作数 1)持有"x"为16,32或64个8位向量. 一个第二个SIMD(操作数 2)寄存器或内存操作数包含2,4或8个"A"值,这些值由第一个寄存器中对应的8个"x"值运行. "b"矢量是用于所有计算并包含在即时字节中的常数.
本指令的EVEX编码形式不支持内存断层压制. SSE编码的指令形式要求对其内存操作进行16B对齐.
行动
define parity(x):
t := 0 // single bit
FOR i := 0 to 7:
t = t xor x.bit[i]
return t
define affine_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.*
retbyte.bit[i] := parity(tsrc2qw.byte[7-i] AND src1byte) XOR imm8.bit[i]
return retbyte
VGF2P8AFFINEQB 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*:
DEST.qword[j].byte[b] := affine_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
VGF2P8AFFINEQB 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_byte(SRC2.qword[j], SRC1.qword[j].byte[b], imm8)
DEST[MAX_VL-1:VL] := 0
GF2P8AFFINEQB srcdest, src1, imm8 (128b SSE Encoded Version)
FOR j := 0 TO 1:
FOR b := 0 to 7:
SRCDEST.qword[j].byte[b] := affine_byte(SRC1.qword[j], SRCDEST.qword[j].byte[b], imm8)Intel C/C++ 内在编译器
(V)GF2P8AFFINEQB __m128i _mm_gf2p8affine_epi64_epi8(__m128i, __m128i, int);
(V)GF2P8AFFINEQB __m128i _mm_mask_gf2p8affine_epi64_epi8(__m128i, __mmask16, __m128i, __m128i, int);
(V)GF2P8AFFINEQB __m128i _mm_maskz_gf2p8affine_epi64_epi8(__mmask16, __m128i, __m128i, int);
VGF2P8AFFINEQB __m256i _mm256_gf2p8affine_epi64_epi8(__m256i, __m256i, int);
VGF2P8AFFINEQB __m256i _mm256_mask_gf2p8affine_epi64_epi8(__m256i, __mmask32, __m256i, __m256i, int);
VGF2P8AFFINEQB __m256i _mm256_maskz_gf2p8affine_epi64_epi8(__mmask32, __m256i, __m256i, int);
VGF2P8AFFINEQB __m512i _mm512_gf2p8affine_epi64_epi8(__m512i, __m512i, int);
VGF2P8AFFINEQB __m512i _mm512_mask_gf2p8affine_epi64_epi8(__m512i, __mmask64, __m512i, __m512i, int);
VGF2P8AFFINEQB __m512i _mm512_maskz_gf2p8affine_epi64_epi8(__mmask64, __m512i, __m512i, int);SIMD 浮点 例外
None.
其他例外
遗留编码和 VEX 编码: 参见表2-21"第4类例外条件".
EVEX 编码 : 参见表2-52"Type E4NF类例外条件".