VFMADD132PH, VFMADD213PH, VFMADD231PH, VFNMADD132PH, VFNMADD213PH, VFNMADD231PH
Fused Multiply-Add of Packed FP16 Values
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
EVEX.128.66.MAP6.W0 98 /r | VFMADD132PH xmm1{k1}{z}, xmm2, xmm3/m128/m16bcst | A | Valido | Valido | Valores multiply packed FP16 de xmm1 y AND AVX512VL) xmm3/m128/m16bcst, añadir a xmm2 y almacenar OR AVX10.1 el resultado en xmm1. |
EVEX.256.66.MAP6.W0 98 /r | VFMADD132PH ymm1{k1}{z}, ymm2, ymm3/m256/m16bcst | A | Valido | Valido | Valores multiply packed FP16 de ymm1 y AND AVX512VL) ymm3/m256/m16bcst, añadir a ymm2 y almacenar OR AVX10.1 el resultado en ymm1. |
EVEX.512.66.MAP6.W0 98 /r | VFMADD132PH zmm1{k1}{z}, zmm2, zmm3/m512/m16bcst {er} | A | Valido | Valido | Multiply packed FP16 valores de zmm1 y OR AVX10.1 zmm3/m512/m16bcst, añadir a zmm2 y almacenar el resultado en zmm1. |
EVEX.128.66.MAP6.W0 A8 /r | VFMADD213PH xmm1{k1}{z}, xmm2, xmm3/m128/m16bcst | A | Valido | Valido | Valores multiply packed FP16 de xmm1 y AND AVX512VL) xmm2, añadir a xmm3/m128/m16bcst, y almacenar OR AVX10.1 el resultado en xmm1. |
EVEX.256.66.MAP6.W0 A8 /r | VFMADD213PH ymm1{k1}{z}, ymm2, ymm3/m256/m16bcst | A | Valido | Valido | Valores multiply packed FP16 de ymm1 y AND AVX512VL) ymm2, añadir a ymm3/m256/m16bcst, y almacenar OR AVX10.1 el resultado en ymm1. |
EVEX.512.66.MAP6.W0 A8 /r | VFMADD213PH zmm1{k1}{z}, zmm2, zmm3/m512/m16bcst {er} | A | Valido | Valido | Multiply packed FP16 valores de zmm1 y OR AVX10.1 zmm2, añadir a zmm3/m512/m16bcst y almacenar el resultado en zmm1. |
EVEX.128.66.MAP6.W0 B8 /r | VFMADD231PH xmm1{k1}{z}, xmm2, xmm3/m128/m16bcst | A | Valido | Valido | Valores multiply packed FP16 de xmm2 y AND AVX512VL) xmm3/m128/m16bcst, añadir a xmm1 y almacenar OR AVX10.1 el resultado en xmm1. |
EVEX.256.66.MAP6.W0 B8 /r | VFMADD231PH ymm1{k1}{z}, ymm2, ymm3/m256/m16bcst | A | Valido | Valido | Valores multiply packed FP16 de ymm2 y AND AVX512VL) ymm3/m256/m16bcst, añadir a ymm1 y almacenar OR AVX10.1 el resultado en ymm1. |
EVEX.512.66.MAP6.W0 B8 /r | VFMADD231PH zmm1{k1}{z}, zmm2, zmm3/m512/m16bcst {er} | A | Valido | Valido | Multiply packed FP16 valores de zmm2 y OR AVX10.1 zmm3/m512/m16bcst, añadir a zmm1 y almacenar el resultado en zmm1. |
EVEX.128.66.MAP6.W0 9C /r | VFNMADD132PH xmm1{k1}{z}, xmm2, xmm3/m128/m16bcst | A | Valido | Valido | Multiply packedFP16valores dexmm1yAND AVX512VL) xmm3/m128/m16bcst, y negar el valor. OAVX10.1Añadir este valor axmm2, y almacenar el resultado enxmm1. |
EVEX.256.66.MAP6.W0 9C /r | VFNMADD132PH ymm1{k1}{z}, ymm2, ymm3/m256/m16bcst | A | Valido | Valido | Multiply packedFP16valores deymm1yAND AVX512VL) ymm3/m256/m16bcst, y negar el valor. OAVX10.1Añadir este valor aymm2, y almacenar el resultado enymm1. |
EVEX.512.66.MAP6.W0 9C /r | VFNMADD132PH zmm1{k1}{z}, zmm2, zmm3/m512/m16bcst {er} | A | Valido | Valido | Multiply packedFP16valores dezmm1y OAVX10.1 zmm3/m512/m16bcst, y negar el valor.zmm2, y almacenar el resultado enzmm1. |
EVEX.128.66.MAP6.W0 AC /r | VFNMADD213PH xmm1{k1}{z}, xmm2, xmm3/m128/m16bcst | A | Valido | Valido | Multiply packedFP16valores dexmm1yAND AVX512VL) xmm2, y negar el valor. Añadir este valor a ORAVX10.1 xmm3/m128/m16bcst, y almacenar el resultado enxmm1. |
EVEX.256.66.MAP6.W0 AC /r | VFNMADD213PH ymm1{k1}{z}, ymm2, ymm3/m256/m16bcst Opcode/ Instruction | A | Valido | Valido | Multiply packed FP16 valores de ymm1 y AND AVX512VL) ymm2, y negar el valor. Añadir este valor a OR AVX10.1 ymm3/m256/m16bcst, y almacenar el resultado en ymm1. Op/ 64 /32 CPUID Modo de la bandera |
EVEX.512.66.MAP6.W0 AC /r | VFNMADD213PH zmm1{k1}{z}, zmm2, zmm3/m512/m16bcst {er} | a v | Multiply packedFP16valores dezmm1y OAVX10.1 zmm2, y negar el valor.zmm3/m512/m16bcst, y almacenar el resultado enzmm1. | ||
EVEX.128.66.MAP6.W0 BC /r | VFNMADD231PH xmm1{k1}{z}, xmm2, xmm3/m128/m16bcst | a v | Multiply packedFP16valores dexmm2yAND AVX512VL) xmm3/m128/m16bcst, y negar el valor. OAVX10.1Añadir este valor axmm1, y almacenar el resultado enxmm1. | ||
EVEX.256.66.MAP6.W0 BC /r | VFNMADD231PH ymm1{k1}{z}, ymm2, ymm3/m256/m16bcst | a v | Multiply packedFP16valores deymm2yAND AVX512VL) ymm3/m256/m16bcst, y negar el valor. OAVX10.1Añadir este valor aymm1, y almacenar el resultado enymm1. | ||
EVEX.512.66.MAP6.W0 BC /r | VFNMADD231PH zmm1{k1}{z}, zmm2, zmm3/m512/m16bcst {er} | a v | Multiply packedFP16valores dezmm2y OAVX10.1 zmm3/m512/m16bcst, y negar el valor.zmm1, y almacenar el resultado enzmm1. |
Codificacion de operandos
Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.
A
modrm.reglectura y escriturabyte ModRM, campo reg (bits 5-3)vex.vvvvlecturaprefijo VEX, campo vvvv (invertido)modrm.rmlecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
Tupla: Full
Coste medido
Cargando las mediciones de arch-data...
Descripción
Esta instrucción realiza una computación multiadd o negada multiadd en valores FP16 utilizando tres operandos de origen y escribe los resultados en el operando de destino. El operando de destino es también el primer operando de origen. Las formas "N" (negadas) de esta instrucción añaden el producto intermedio de precisión infinita negada al correspondiente operando restante. La notación "132", "213" y "231" indican el uso de los operandos en +/-A * B + C, donde cada dígito corresponde al número el operando, siendo el destino operando 1; véase Tabla 5-5.
Los elementos de destino se actualizan según la máscara de escritura.
Notation Table 5-5. VF[,N]MADD[132,213,231]PH Notation for Operands
132 Operands231
213 dest = +/- dest*src3+src2dest = +/- src2src3+dest dest = +/- src2dest+src3
Operación
VF[,N]MADD132PH DEST, SRC2, SRC3 (EVEX encoded versions) when src3 operand is a register
VL = 128, 256 or 512
KL := VL/16
IF (VL = 512) AND (EVEX.b = 1):
SET_RM(EVEX.RC)
ELSE
SET_RM(MXCSR.RC)
FOR j := 0 TO KL-1:
IF k1[j] OR *no writemask*:
IF *negative form*:
DEST.fp16[j] := RoundFPControl(-DEST.fp16[j]*SRC3.fp16[j] + SRC2.fp16[j])
ELSE:
DEST.fp16[j] := RoundFPControl(DEST.fp16[j]*SRC3.fp16[j] + SRC2.fp16[j])
ELSE IF *zeroing*:
DEST.fp16[j] := 0
// else dest.fp16[j] remains unchanged
DEST[MAXVL-1:VL] := 0
VF[,N]MADD132PH DEST, SRC2, SRC3 (EVEX encoded versions) when src3 operand is a memory source
VL = 128, 256 or 512
KL := VL/16
FOR j := 0 TO KL-1:
IF k1[j] OR *no writemask*:
IF EVEX.b = 1:
t3 := SRC3.fp16[0]
ELSE:
t3 := SRC3.fp16[j]
IF *negative form*:
DEST.fp16[j] := RoundFPControl(-DEST.fp16[j] * t3 + SRC2.fp16[j])
ELSE:
DEST.fp16[j] := RoundFPControl(DEST.fp16[j] * t3 + SRC2.fp16[j])
ELSE IF *zeroing*:
DEST.fp16[j] := 0
// else dest.fp16[j] remains unchanged
DEST[MAXVL-1:VL] := 0
VF[,N]MADD213PH DEST, SRC2, SRC3 (EVEX encoded versions) when src3 operand is a register
VL = 128, 256 or 512
KL := VL/16
IF (VL = 512) AND (EVEX.b = 1):
SET_RM(EVEX.RC)
ELSE
SET_RM(MXCSR.RC)
FOR j := 0 TO KL-1:
IF k1[j] OR *no writemask*:
IF *negative form*:
DEST.fp16[j] := RoundFPControl(-SRC2.fp16[j]*DEST.fp16[j] + SRC3.fp16[j])
ELSE
DEST.fp16[j] := RoundFPControl(SRC2.fp16[j]*DEST.fp16[j] + SRC3.fp16[j])
ELSE IF *zeroing*:
DEST.fp16[j] := 0
// else dest.fp16[j] remains unchanged
DEST[MAXVL-1:VL] := 0
VF[,N]MADD213PH DEST, SRC2, SRC3 (EVEX encoded versions) when src3 operand is a memory source
VL = 128, 256 or 512
KL := VL/16
FOR j := 0 TO KL-1:
IF k1[j] OR *no writemask*:
IF EVEX.b = 1:
t3 := SRC3.fp16[0]
ELSE:
t3 := SRC3.fp16[j]
IF *negative form*:
DEST.fp16[j] := RoundFPControl(-SRC2.fp16[j] * DEST.fp16[j] + t3 )
ELSE:
DEST.fp16[j] := RoundFPControl(SRC2.fp16[j] * DEST.fp16[j] + t3 )
ELSE IF *zeroing*:
DEST.fp16[j] := 0
// else dest.fp16[j] remains unchanged
DEST[MAXVL-1:VL] := 0
VF[,N]MADD231PH DEST, SRC2, SRC3 (EVEX encoded versions) when src3 operand is a register
VL = 128, 256 or 512
KL := VL/16
IF (VL = 512) AND (EVEX.b = 1):
SET_RM(EVEX.RC)
ELSE
SET_RM(MXCSR.RC)
FOR j := 0 TO KL-1:
IF k1[j] OR *no writemask*:
IF *negative form:
DEST.fp16[j] := RoundFPControl(-SRC2.fp16[j]*SRC3.fp16[j] + DEST.fp16[j])
ELSE:
DEST.fp16[j] := RoundFPControl(SRC2.fp16[j]*SRC3.fp16[j] + DEST.fp16[j])
ELSE IF *zeroing*:
DEST.fp16[j] := 0
// else dest.fp16[j] remains unchanged
DEST[MAXVL-1:VL] := 0
VF[,N]MADD231PH DEST, SRC2, SRC3 (EVEX encoded versions) when src3 operand is a memory source
VL = 128, 256 or 512
KL := VL/16
FOR j := 0 TO KL-1:
IF k1[j] OR *no writemask*:
IF EVEX.b = 1:
t3 := SRC3.fp16[0]
ELSE:
t3 := SRC3.fp16[j]
IF *negative form*:
DEST.fp16[j] := RoundFPControl(-SRC2.fp16[j] * t3 + DEST.fp16[j] )
ELSE:
DEST.fp16[j] := RoundFPControl(SRC2.fp16[j] * t3 + DEST.fp16[j] )
ELSE IF *zeroing*:
DEST.fp16[j] := 0
// else dest.fp16[j] remains unchanged
DEST[MAXVL-1:VL] := 0Intel C/C++ compilador intrínseco
VFMADD132PH, VFMADD213PH , and VFMADD231PH: __m128h _mm_fmadd_ph (__m128h a, __m128h b, __m128h c);
__m128h _mm_mask_fmadd_ph (__m128h a, __mmask8 k, __m128h b, __m128h c);
__m128h _mm_mask3_fmadd_ph (__m128h a, __m128h b, __m128h c, __mmask8 k);
__m128h _mm_maskz_fmadd_ph (__mmask8 k, __m128h a, __m128h b, __m128h c);
__m256h _mm256_fmadd_ph (__m256h a, __m256h b, __m256h c);
__m256h _mm256_mask_fmadd_ph (__m256h a, __mmask16 k, __m256h b, __m256h c);
__m256h _mm256_mask3_fmadd_ph (__m256h a, __m256h b, __m256h c, __mmask16 k);
__m256h _mm256_maskz_fmadd_ph (__mmask16 k, __m256h a, __m256h b, __m256h c);
__m512h _mm512_fmadd_ph (__m512h a, __m512h b, __m512h c);
__m512h _mm512_mask_fmadd_ph (__m512h a, __mmask32 k, __m512h b, __m512h c);
__m512h _mm512_mask3_fmadd_ph (__m512h a, __m512h b, __m512h c, __mmask32 k);
__m512h _mm512_maskz_fmadd_ph (__mmask32 k, __m512h a, __m512h b, __m512h c);
__m512h _mm512_fmadd_round_ph (__m512h a, __m512h b, __m512h c, const int rounding);
__m512h _mm512_mask_fmadd_round_ph (__m512h a, __mmask32 k, __m512h b, __m512h c, const int rounding);
__m512h _mm512_mask3_fmadd_round_ph (__m512h a, __m512h b, __m512h c, __mmask32 k, const int rounding);
__m512h _mm512_maskz_fmadd_round_ph (__mmask32 k, __m512h a, __m512h b, __m512h c, const int rounding);
VFNMADD132PH, VFNMADD213PH, and VFNMADD231PH: __m128h _mm_fnmadd_ph (__m128h a, __m128h b, __m128h c);
__m128h _mm_mask_fnmadd_ph (__m128h a, __mmask8 k, __m128h b, __m128h c);
__m128h _mm_mask3_fnmadd_ph (__m128h a, __m128h b, __m128h c, __mmask8 k);
__m128h _mm_maskz_fnmadd_ph (__mmask8 k, __m128h a, __m128h b, __m128h c);
__m256h _mm256_fnmadd_ph (__m256h a, __m256h b, __m256h c);
__m256h _mm256_mask_fnmadd_ph (__m256h a, __mmask16 k, __m256h b, __m256h c);
__m256h _mm256_mask3_fnmadd_ph (__m256h a, __m256h b, __m256h c, __mmask16 k);
__m256h _mm256_maskz_fnmadd_ph (__mmask16 k, __m256h a, __m256h b, __m256h c);
__m512h _mm512_fnmadd_ph (__m512h a, __m512h b, __m512h c);
__m512h _mm512_mask_fnmadd_ph (__m512h a, __mmask32 k, __m512h b, __m512h c);
__m512h _mm512_mask3_fnmadd_ph (__m512h a, __m512h b, __m512h c, __mmask32 k);
__m512h _mm512_maskz_fnmadd_ph (__mmask32 k, __m512h a, __m512h b, __m512h c);
__m512h _mm512_fnmadd_round_ph (__m512h a, __m512h b, __m512h c, const int rounding);
__m512h _mm512_mask_fnmadd_round_ph (__m512h a, __mmask32 k, __m512h b, __m512h c, const int rounding);
__m512h _mm512_mask3_fnmadd_round_ph (__m512h a, __m512h b, __m512h c, __mmask32 k, const int rounding);
__m512h _mm512_maskz_fnmadd_round_ph (__mmask32 k, __m512h a, __m512h b, __m512h c, const int rounding);SIMD coma flotante Excepciones
Invalid, Underflow, Overflow, Precision, Denormal
Otras excepciones
Instrucciones codificadas por EVEX, ver Tabla 2-48, "Tipo E2 Clase Condiciones de Excepción."