diff --git a/lib/Target/X86/X86InstrAVX512.td b/lib/Target/X86/X86InstrAVX512.td index 47765ac8c7f..05c09e25ed5 100644 --- a/lib/Target/X86/X86InstrAVX512.td +++ b/lib/Target/X86/X86InstrAVX512.td @@ -3356,40 +3356,44 @@ multiclass avx512_fma3p_rm opc, string OpcodeStr, X86VectorVTInfo _, } } // Constraints = "$src1 = $dst" -multiclass avx512_fma3p_forms opc213, +multiclass avx512_fma3p_forms opc213, bits<8> opc231, string OpcodeStr, X86VectorVTInfo VTI, SDPatternOperator OpNode> { defm v213 : avx512_fma3p_rm, EVEX_V512, EVEX_CD8; + + defm v231 : avx512_fma3p_rm, + EVEX_V512, EVEX_CD8; } let ExeDomain = SSEPackedSingle in { - defm VFMADDPSZ : avx512_fma3p_forms<0xA8, "vfmadd", + defm VFMADDPSZ : avx512_fma3p_forms<0xA8, 0xB8, "vfmadd", v16f32_info, X86Fmadd>; - defm VFMSUBPSZ : avx512_fma3p_forms<0xAA, "vfmsub", + defm VFMSUBPSZ : avx512_fma3p_forms<0xAA, 0xBA, "vfmsub", v16f32_info, X86Fmsub>; - defm VFMADDSUBPSZ : avx512_fma3p_forms<0xA6, "vfmaddsub", + defm VFMADDSUBPSZ : avx512_fma3p_forms<0xA6, 0xB6, "vfmaddsub", v16f32_info, X86Fmaddsub>; - defm VFMSUBADDPSZ : avx512_fma3p_forms<0xA7, "vfmsubadd", + defm VFMSUBADDPSZ : avx512_fma3p_forms<0xA7, 0xB7, "vfmsubadd", v16f32_info, X86Fmsubadd>; - defm VFNMADDPSZ : avx512_fma3p_forms<0xAC, "vfnmadd", + defm VFNMADDPSZ : avx512_fma3p_forms<0xAC, 0xBC, "vfnmadd", v16f32_info, X86Fnmadd>; - defm VFNMSUBPSZ : avx512_fma3p_forms<0xAE, "vfnmsub", + defm VFNMSUBPSZ : avx512_fma3p_forms<0xAE, 0xBE, "vfnmsub", v16f32_info, X86Fnmsub>; } let ExeDomain = SSEPackedDouble in { - defm VFMADDPDZ : avx512_fma3p_forms<0xA8, "vfmadd", + defm VFMADDPDZ : avx512_fma3p_forms<0xA8, 0xB8, "vfmadd", v8f64_info, X86Fmadd>, VEX_W; - defm VFMSUBPDZ : avx512_fma3p_forms<0xAA, "vfmsub", + defm VFMSUBPDZ : avx512_fma3p_forms<0xAA, 0xBA, "vfmsub", v8f64_info, X86Fmsub>, VEX_W; - defm VFMADDSUBPDZ : avx512_fma3p_forms<0xA6, "vfmaddsub", + defm VFMADDSUBPDZ : avx512_fma3p_forms<0xA6, 0xB6, "vfmaddsub", v8f64_info, X86Fmaddsub>, VEX_W; - defm VFMSUBADDPDZ : avx512_fma3p_forms<0xA7, "vfmsubadd", + defm VFMSUBADDPDZ : avx512_fma3p_forms<0xA7, 0xB7, "vfmsubadd", v8f64_info, X86Fmsubadd>, VEX_W; - defm VFNMADDPDZ : avx512_fma3p_forms<0xAC, "vfnmadd", + defm VFNMADDPDZ : avx512_fma3p_forms<0xAC, 0xBC, "vfnmadd", v8f64_info, X86Fnmadd>, VEX_W; - defm VFNMSUBPDZ : avx512_fma3p_forms<0xAE, "vfnmsub", + defm VFNMSUBPDZ : avx512_fma3p_forms<0xAE, 0xBE, "vfnmsub", v8f64_info, X86Fnmsub>, VEX_W; } diff --git a/test/MC/X86/avx512-encodings.s b/test/MC/X86/avx512-encodings.s index 8dc89da48e5..6b2acf6d40d 100644 --- a/test/MC/X86/avx512-encodings.s +++ b/test/MC/X86/avx512-encodings.s @@ -4351,3 +4351,27 @@ vextractf32x4 $3, %zmm3, %xmm1 {%k1} // CHECK: vextracti64x4 $1 // CHECK: encoding: [0x62,0x53,0xfd,0xcb,0x3b,0xf4,0x01] vextracti64x4 $1, %zmm14, %ymm12 {%k3} {z} + +// CHECK: vfmadd231ps +// CHECK: encoding: [0x62,0xb2,0x1d,0x48,0xb8,0xe7] +vfmadd231ps %zmm23, %zmm12, %zmm4 + +// CHECK: vfmsub231pd +// CHECK: encoding: [0x62,0xe2,0xed,0x48,0xba,0x73,0x08] +vfmsub231pd 0x200(%rbx), %zmm2, %zmm22 + +// CHECK: vfmaddsub231ps +// CHECK: encoding: [0x62,0xd2,0x65,0x4b,0xb6,0xec] +vfmaddsub231ps %zmm12, %zmm3, %zmm5 {%k3} + +// CHECK: vfmsubadd231pd +// CHECK: encoding: [0x62,0x72,0x85,0xc5,0xb7,0xdd] +vfmsubadd231pd %zmm5, %zmm31, %zmm11 {%k5}{z} + +// CHECK: vfnmadd231ps +// CHECK: encoding: [0x62,0xf2,0x4d,0x48,0xbc,0xfd] +vfnmadd231ps %zmm5, %zmm6, %zmm7 + +// CHECK: vfnmsub231pd +// CHECK: encoding: [0x62,0xf2,0xcd,0x48,0xbe,0xfd] +vfnmsub231pd %zmm5, %zmm6, %zmm7